package grpc import ( "fmt" "net" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/health" "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" ) type Server struct { logger *zap.Logger config *Config } type Config struct { Port int `mapstructure:"grpc-port"` ServiceName string `mapstructure:"grpc-service-name"` } func NewServer(config *Config, logger *zap.Logger) (*Server, error) { srv := &Server{ logger: logger, config: config, } return srv, nil } func (s *Server) ListenAndServe() { listener, err := net.Listen("tcp", fmt.Sprintf(":%v", s.config.Port)) if err != nil { s.logger.Fatal("failed to listen", zap.Int("port", s.config.Port)) } srv := grpc.NewServer() server := health.NewServer() reflection.Register(srv) grpc_health_v1.RegisterHealthServer(srv, server) server.SetServingStatus(s.config.ServiceName, grpc_health_v1.HealthCheckResponse_SERVING) if err := srv.Serve(listener); err != nil { s.logger.Fatal("failed to serve", zap.Error(err)) } }