package servers import ( "fmt" "gogs.tyduyong.com/duyong/dy-admin/internal/iam/config" "gogs.tyduyong.com/duyong/dy-pkg/app/options" "gogs.tyduyong.com/duyong/dy-pkg/logs" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "net" ) type grpcAPIServer struct { *grpc.Server Addr string MaxMsgSize int ServerCert options.GeneratableKeyCert } func newRpcServer(cfg *config.Config) *grpcAPIServer { s := &grpcAPIServer{ Addr: fmt.Sprintf("%s:%d", cfg.GRPCOptions.BindAddress, cfg.GRPCOptions.BindPort), MaxMsgSize: cfg.GRPCOptions.MaxMsgSize, ServerCert: cfg.SecureServingOptions.ServerCert, } opts := []grpc.ServerOption{grpc.MaxRecvMsgSize(s.MaxMsgSize)} if s.ServerCert.CertKey.CertFile != "" || s.ServerCert.CertKey.KeyFile != "" { creds, err := credentials.NewServerTLSFromFile(s.ServerCert.CertKey.CertFile, s.ServerCert.CertKey.KeyFile) if err != nil { logs.Fatalf("Failed to generate credentials %s", err.Error()) } opts = append(opts, grpc.Creds(creds)) } grpcServer := grpc.NewServer(opts...) s.Server = grpcServer return s } func (s *grpcAPIServer) Run() { listen, err := net.Listen("tcp", s.Addr) if err != nil { logs.Fatalf("failed to listen: %s", err.Error()) } go func() { if err := s.Serve(listen); err != nil { logs.Fatalf("failed to start grpc server: %s", err.Error()) } }() logs.Infof("start grpc server at %s", s.Addr) } func (s *grpcAPIServer) Close() { s.GracefulStop() logs.Infof("GRPC server on %s stopped", s.Addr) }