package main import ( "context" "fmt" "google.golang.org/grpc" "net" "net/http" "os" "os/signal" "syscall" "time" "wms/conf" "wms/models" "wms/pkg/logx" "wms/proto/init_client" "wms/proto/inventory_order" "wms/proto/product_inventory" "wms/proto/purchase_wms" "wms/router" "wms/service" "wms/task" "wms/utils/dingtalkrobot" ) func main() { // 读取配置 if err := conf.Init(); err != nil { logx.Errorf("config init error! ", err.Error()) return } // 日志初始化 logx.Init(*conf.LogConf) defer logx.Sync() // 数据库初始化 if err := models.Init(); err != nil { logx.Errorf("db init error! ", err.Error()) return } logx.Infof("aps-server start serve...") server := &http.Server{ Addr: ":" + conf.WebConf.Port, Handler: router.NewRouter(), ReadTimeout: 5 * time.Second, WriteTimeout: 5 * time.Second, } go shutdown(server) //启动grpc客户端 //go controllers.InitInventoryOrderServiceConn() //go controllers.InitProductInventoryServiceConn() //go controllers.InitCodeServiceConn() //go supplier.InitConn() //go client.InitConn() go init_client.InitClient() //启动grpc服务 go func() { ln, err := net.Listen("tcp", ":"+conf.WebConf.GrpcPort) if err != nil { logx.Errorf("grpc server init error: %v", err.Error()) panic(fmt.Sprintf("grpc server init error: %v", err.Error())) } s := grpc.NewServer() //todo 添加具体服务 product_inventory.RegisterProductInventoryServiceServer(s, &product_inventory.Server{}) purchase_wms.RegisterPurchaseServiceServer(s, &purchase_wms.Server{}) inventory_order.RegisterInventoryOrderServiceServer(s, &inventory_order.Server{}) err = s.Serve(ln) if err != nil { logx.Errorf("grpc server init error: %v", err.Error()) panic(fmt.Sprintf("grpc server init error: %v", err.Error())) } }() go service.InitLocationReportData() go service.InitHistoryReportData() //定时任务初始化 task.Init() //钉钉机器人初始化 dingtalkrobot.Init(conf.DingTalkConf.AlarmKey, conf.DingTalkConf.AlarmUrl) logx.Error(server.ListenAndServe().Error()) } func shutdown(server *http.Server) { quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGKILL, syscall.SIGQUIT, syscall.SIGINT, syscall.SIGTERM) <-quit logx.Infof("server exiting...") // 创建一个上下文,设置超时时间 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() //controllers.CloseInventoryOrderServiceConn() //controllers.CloseProductInventoryServiceConn() //controllers.CloseCodeServiceConn() //supplier.CloseConn() //client.CloseConn() init_client.CloseClient() // 关闭HTTP服务器 if err := server.Shutdown(ctx); err != nil { logx.Infof("服务优雅退出失败: %v", err) return } logx.Infof("server exited") }