7 Star 24 Fork 30

go-course / go8

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
start.go 3.73 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2022-10-15 12:05 . 补充service
package cmd
import (
"errors"
"fmt"
"os"
"os/signal"
"strings"
"syscall"
"github.com/infraboard/mcube/app"
"github.com/spf13/cobra"
"github.com/infraboard/mcube/logger"
"github.com/infraboard/mcube/logger/zap"
"gitee.com/go-course/go8/projects/devcloud/mcenter/conf"
"gitee.com/go-course/go8/projects/devcloud/mcenter/protocol"
// 注册所有服务
_ "gitee.com/go-course/go8/projects/devcloud/mcenter/apps"
)
// startCmd represents the start command
var serviceCmd = &cobra.Command{
Use: "start",
Short: "mcenter API服务",
Long: "mcenter API服务",
RunE: func(cmd *cobra.Command, args []string) error {
// 初始化全局变量
if err := loadGlobalConfig(confType); err != nil {
return err
}
// 初始化全局日志配置
if err := loadGlobalLogger(); err != nil {
return err
}
// 初始化全局app
if err := app.InitAllApp(); err != nil {
return err
}
conf := conf.C()
// 启动服务
ch := make(chan os.Signal, 1)
defer close(ch)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP, syscall.SIGQUIT)
// 初始化服务
svr, err := newService(conf)
if err != nil {
return err
}
// 等待信号处理
go svr.waitSign(ch)
// 启动服务
if err := svr.start(); err != nil {
if !strings.Contains(err.Error(), "http: Server closed") {
return err
}
}
return nil
},
}
func newService(cnf *conf.Config) (*service, error) {
http := protocol.NewHTTPService()
grpc := protocol.NewGRPCService()
svr := &service{
http: http,
grpc: grpc,
log: zap.L().Named("CLI"),
}
return svr, nil
}
type service struct {
http *protocol.HTTPService
grpc *protocol.GRPCService
log logger.Logger
}
func (s *service) start() error {
s.log.Infof("loaded grpc app: %s", app.LoadedGrpcApp())
s.log.Infof("loaded http app: %s", app.LoadedRESTfulApp())
s.log.Infof("loaded internal app: %s", app.LoadedInternalApp())
go s.grpc.Start()
return s.http.Start()
}
// config 为全局变量, 只需要load 即可全局可用户
func loadGlobalConfig(configType string) error {
// 配置加载
switch configType {
case "file":
err := conf.LoadConfigFromToml(confFile)
if err != nil {
return err
}
case "env":
err := conf.LoadConfigFromEnv()
if err != nil {
return err
}
default:
return errors.New("unknown config type")
}
return nil
}
// log 为全局变量, 只需要load 即可全局可用户, 依赖全局配置先初始化
func loadGlobalLogger() error {
var (
logInitMsg string
level zap.Level
)
lc := conf.C().Log
lv, err := zap.NewLevel(lc.Level)
if err != nil {
logInitMsg = fmt.Sprintf("%s, use default level INFO", err)
level = zap.InfoLevel
} else {
level = lv
logInitMsg = fmt.Sprintf("log level: %s", lv)
}
zapConfig := zap.DefaultConfig()
zapConfig.Level = level
switch lc.To {
case conf.ToStdout:
zapConfig.ToStderr = true
zapConfig.ToFiles = false
case conf.ToFile:
zapConfig.Files.Name = "api.log"
zapConfig.Files.Path = lc.PathDir
}
switch lc.Format {
case conf.JSONFormat:
zapConfig.JSON = true
}
if err := zap.Configure(zapConfig); err != nil {
return err
}
zap.L().Named("INIT").Info(logInitMsg)
return nil
}
func (s *service) waitSign(sign chan os.Signal) {
for sg := range sign {
switch v := sg.(type) {
default:
s.log.Infof("receive signal '%v', start graceful shutdown", v.String())
if err := s.grpc.Stop(); err != nil {
s.log.Errorf("grpc graceful shutdown err: %s, force exit", err)
} else {
s.log.Info("grpc service stop complete")
}
if err := s.http.Stop(); err != nil {
s.log.Errorf("http graceful shutdown err: %s, force exit", err)
} else {
s.log.Infof("http service stop complete")
}
return
}
}
}
func init() {
RootCmd.AddCommand(serviceCmd)
}
Go
1
https://gitee.com/go-course/go8.git
git@gitee.com:go-course/go8.git
go-course
go8
go8
6a8978f41a84

搜索帮助