70 lines
1.6 KiB
Go
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()
|
|
})
|
|
}
|