grpcServer.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package servers
  2. import (
  3. "fmt"
  4. "gogs.tyduyong.com/duyong/dy-admin/internal/iam/config"
  5. "gogs.tyduyong.com/duyong/dy-pkg/app/options"
  6. "gogs.tyduyong.com/duyong/dy-pkg/logs"
  7. "google.golang.org/grpc"
  8. "google.golang.org/grpc/credentials"
  9. "net"
  10. )
  11. type grpcAPIServer struct {
  12. *grpc.Server
  13. Addr string
  14. MaxMsgSize int
  15. ServerCert options.GeneratableKeyCert
  16. }
  17. func newRpcServer(cfg *config.Config) *grpcAPIServer {
  18. s := &grpcAPIServer{
  19. Addr: fmt.Sprintf("%s:%d", cfg.GRPCOptions.BindAddress, cfg.GRPCOptions.BindPort),
  20. MaxMsgSize: cfg.GRPCOptions.MaxMsgSize,
  21. ServerCert: cfg.SecureServingOptions.ServerCert,
  22. }
  23. opts := []grpc.ServerOption{grpc.MaxRecvMsgSize(s.MaxMsgSize)}
  24. if s.ServerCert.CertKey.CertFile != "" || s.ServerCert.CertKey.KeyFile != "" {
  25. creds, err := credentials.NewServerTLSFromFile(s.ServerCert.CertKey.CertFile, s.ServerCert.CertKey.KeyFile)
  26. if err != nil {
  27. logs.Fatalf("Failed to generate credentials %s", err.Error())
  28. }
  29. opts = append(opts, grpc.Creds(creds))
  30. }
  31. grpcServer := grpc.NewServer(opts...)
  32. s.Server = grpcServer
  33. return s
  34. }
  35. func (s *grpcAPIServer) Run() {
  36. listen, err := net.Listen("tcp", s.Addr)
  37. if err != nil {
  38. logs.Fatalf("failed to listen: %s", err.Error())
  39. }
  40. go func() {
  41. if err := s.Serve(listen); err != nil {
  42. logs.Fatalf("failed to start grpc server: %s", err.Error())
  43. }
  44. }()
  45. logs.Infof("start grpc server at %s", s.Addr)
  46. }
  47. func (s *grpcAPIServer) Close() {
  48. s.GracefulStop()
  49. logs.Infof("GRPC server on %s stopped", s.Addr)
  50. }