2026-04-25 13:21:39 +08:00

70 lines
1.6 KiB
Go

package app
import (
"errors"
"net"
"sync"
"google.golang.org/grpc"
healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
walletv1 "hyapp/api/proto/wallet/v1"
"hyapp/pkg/grpchealth"
"hyapp/services/wallet-service/internal/config"
walletservice "hyapp/services/wallet-service/internal/service/wallet"
"hyapp/services/wallet-service/internal/storage/memory"
grpcserver "hyapp/services/wallet-service/internal/transport/grpc"
)
// App 装配 wallet-service gRPC 入口。
type App struct {
server *grpc.Server
listener net.Listener
health *grpchealth.ServingChecker
closeOnce sync.Once
}
// New 初始化 wallet-service。
func New(cfg config.Config) (*App, error) {
listener, err := net.Listen("tcp", cfg.GRPCAddr)
if err != nil {
return nil, err
}
server := grpc.NewServer()
repository := memory.NewRepository()
repository.SetBalance(1, 1_000_000)
svc := walletservice.New(walletservice.Config{
Currency: cfg.Ledger.Currency,
IdempotencyTTLSec: cfg.Ledger.IdempotencyTTLSec,
}, repository)
walletv1.RegisterWalletServiceServer(server, grpcserver.NewServer(svc))
health := grpchealth.NewServingChecker("wallet-service")
healthgrpc.RegisterHealthServer(server, grpchealth.NewServer(health))
return &App{
server: server,
listener: listener,
health: health,
}, nil
}
// Run 启动 gRPC 服务。
func (a *App) Run() error {
a.health.MarkServing()
err := a.server.Serve(a.listener)
a.health.MarkStopped()
if errors.Is(err, grpc.ErrServerStopped) {
return nil
}
return err
}
// Close 关闭 gRPC 服务。
func (a *App) Close() {
a.closeOnce.Do(func() {
a.health.MarkDraining()
a.server.GracefulStop()
})
}