server.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package server
  2. import (
  3. "fmt"
  4. "log/slog"
  5. "net"
  6. "os"
  7. "os/signal"
  8. "strings"
  9. )
  10. import (
  11. "github.com/spf13/cobra"
  12. "google.golang.org/grpc"
  13. "google.golang.org/grpc/health"
  14. "google.golang.org/grpc/health/grpc_health_v1"
  15. )
  16. import (
  17. "protocol-server/common"
  18. "protocol-server/logger"
  19. "protocol-server/models"
  20. pb "protocol-server/rpc_idl/dr_protocol_pb"
  21. "protocol-server/service"
  22. )
  23. var (
  24. configFolder string
  25. addr string
  26. mode string
  27. StartCmd = &cobra.Command{
  28. Use: "run",
  29. Short: "Start API server",
  30. Example: "protocol-server run -c config/config.toml",
  31. SilenceUsage: true,
  32. PreRun: func(cmd *cobra.Command, args []string) {
  33. setup()
  34. },
  35. RunE: func(cmd *cobra.Command, args []string) error {
  36. return run()
  37. },
  38. }
  39. )
  40. func init() {
  41. StartCmd.Flags().StringVarP(&configFolder, "config", "c", "config/", "Start server with provided configuration folder")
  42. StartCmd.Flags().StringVarP(&addr, "addr", "a", "", "Tcp server listening on")
  43. StartCmd.Flags().StringVarP(&mode, "mode", "m", "debug", "server mode ; eg:debug,test,release")
  44. }
  45. func setup() {
  46. if strings.HasSuffix(configFolder, "/") {
  47. configFolder = configFolder[:len(configFolder)-1]
  48. if strings.HasSuffix(configFolder, "/") {
  49. panic("invalid config folder")
  50. }
  51. }
  52. configToml := configFolder + "/config.toml"
  53. //1. 读取配置
  54. common.SetupConfig(configToml, addr, mode)
  55. //2. 设置日志
  56. logger.SetupLogger(true)
  57. //3. 初始化gorm
  58. models.SetupGorm(true)
  59. //4. 初始化i18n
  60. common.SetupTrans()
  61. slog.Info(`starting server`, "pid", os.Getpid())
  62. }
  63. func run() error {
  64. slog.Info(fmt.Sprintf("common.ServerConfig.Protocol %v", common.ServerConfig.Protocol))
  65. lis, err := net.Listen("tcp", common.ServerConfig.Protocol)
  66. if err != nil {
  67. slog.Error("failed to listen", "err", err.Error())
  68. return err
  69. }
  70. s := grpc.NewServer()
  71. grpc_health_v1.RegisterHealthServer(s, health.NewServer())
  72. pb.RegisterBasicServer(s, &service.BasicServer{})
  73. pb.RegisterProtocolServer(s, &service.ProtocolServer{})
  74. slog.Info("module: " + common.Module)
  75. slog.Info("desc: " + common.Desc)
  76. slog.Info("version: " + common.Version)
  77. slog.Info("build: " + common.Build)
  78. slog.Info(fmt.Sprintf("server run at: %s", common.Now()))
  79. slog.Info(fmt.Sprintf("server listening at %v", lis.Addr()))
  80. slog.Info("Enter Control + C Shutdown Server \n")
  81. if err := s.Serve(lis); err != nil {
  82. slog.Error("failed to serve", "err", err.Error())
  83. return err
  84. }
  85. quit := make(chan os.Signal)
  86. signal.Notify(quit, os.Interrupt)
  87. <-quit
  88. fmt.Printf("%s Shutdown Server ... \n", common.Now())
  89. s.GracefulStop()
  90. slog.Info("Server exiting")
  91. logger.ShutdownLogger()
  92. return nil
  93. }