package server import ( "fmt" "log/slog" "net" "os" "os/signal" "strings" ) import ( "github.com/spf13/cobra" "google.golang.org/grpc" "google.golang.org/grpc/health" "google.golang.org/grpc/health/grpc_health_v1" ) import ( "protocol-server/common" "protocol-server/logger" "protocol-server/models" pb "protocol-server/rpc_idl/dr_protocol_pb" "protocol-server/service" ) var ( configFolder string addr string mode string StartCmd = &cobra.Command{ Use: "run", Short: "Start API server", Example: "protocol-server run -c config/config.toml", SilenceUsage: true, PreRun: func(cmd *cobra.Command, args []string) { setup() }, RunE: func(cmd *cobra.Command, args []string) error { return run() }, } ) func init() { StartCmd.Flags().StringVarP(&configFolder, "config", "c", "config/", "Start server with provided configuration folder") StartCmd.Flags().StringVarP(&addr, "addr", "a", "", "Tcp server listening on") StartCmd.Flags().StringVarP(&mode, "mode", "m", "debug", "server mode ; eg:debug,test,release") } func setup() { if strings.HasSuffix(configFolder, "/") { configFolder = configFolder[:len(configFolder)-1] if strings.HasSuffix(configFolder, "/") { panic("invalid config folder") } } configToml := configFolder + "/config.toml" //1. 读取配置 common.SetupConfig(configToml, addr, mode) //2. 设置日志 logger.SetupLogger(true) //3. 初始化gorm models.SetupGorm(true) //4. 初始化i18n common.SetupTrans() slog.Info(`starting server`, "pid", os.Getpid()) } func run() error { slog.Info(fmt.Sprintf("common.ServerConfig.Protocol %v", common.ServerConfig.Protocol)) lis, err := net.Listen("tcp", common.ServerConfig.Protocol) if err != nil { slog.Error("failed to listen", "err", err.Error()) return err } s := grpc.NewServer() grpc_health_v1.RegisterHealthServer(s, health.NewServer()) pb.RegisterBasicServer(s, &service.BasicServer{}) pb.RegisterProtocolServer(s, &service.ProtocolServer{}) slog.Info("module: " + common.Module) slog.Info("desc: " + common.Desc) slog.Info("version: " + common.Version) slog.Info("build: " + common.Build) slog.Info(fmt.Sprintf("server run at: %s", common.Now())) slog.Info(fmt.Sprintf("server listening at %v", lis.Addr())) slog.Info("Enter Control + C Shutdown Server \n") if err := s.Serve(lis); err != nil { slog.Error("failed to serve", "err", err.Error()) return err } quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit fmt.Printf("%s Shutdown Server ... \n", common.Now()) s.GracefulStop() slog.Info("Server exiting") logger.ShutdownLogger() return nil }