package grpcserver import ( "context" "log/slog" "net" "time" commonpb "gitea.haiyihy.com/hy/chatappcommon/proto" "google.golang.org/grpc" ) // RegisterService 定义用户注册能力。 type RegisterService interface { Register(ctx context.Context, request *commonpb.RegisterRequest) (*commonpb.RegisterResponse, error) } // Server 包装用户服务 gRPC 服务端。 type Server struct { addr string shutdownTimeout time.Duration logger *slog.Logger grpcServer *grpc.Server } type handler struct { commonpb.UnimplementedChatAppUserServiceServer service RegisterService } func (h handler) Register(ctx context.Context, request *commonpb.RegisterRequest) (*commonpb.RegisterResponse, error) { return h.service.Register(ctx, request) } // New 创建 gRPC 服务。 func New(addr string, shutdownTimeout time.Duration, logger *slog.Logger, service RegisterService) *Server { grpcServer := grpc.NewServer() commonpb.RegisterChatAppUserServiceServer(grpcServer, handler{service: service}) return &Server{ addr: addr, shutdownTimeout: shutdownTimeout, logger: logger, grpcServer: grpcServer, } } // Run 启动 gRPC 服务并在退出时优雅停机。 func (s *Server) Run(ctx context.Context) error { listener, err := net.Listen("tcp", s.addr) if err != nil { return err } go func() { <-ctx.Done() done := make(chan struct{}) go func() { s.grpcServer.GracefulStop() close(done) }() select { case <-done: case <-time.After(s.shutdownTimeout): s.grpcServer.Stop() } }() s.logger.Info("user grpc server started", "addr", s.addr) if err := s.grpcServer.Serve(listener); err != nil { return err } return nil }