62 Star 345 Fork 417

infraboard / go-course

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
start.go 3.38 KB
一键复制 编辑 原始数据 按行查看 历史
Mr.Yu 提交于 2021-09-04 18:41 . update day14
package cmd
import (
"errors"
"fmt"
"os"
"os/signal"
"strings"
"syscall"
"github.com/spf13/cobra"
"github.com/infraboard/mcube/logger"
"github.com/infraboard/mcube/logger/zap"
"gitee.com/infraboard/go-course/day14/demo/api/conf"
"gitee.com/infraboard/go-course/day14/demo/api/pkg"
"gitee.com/infraboard/go-course/day14/demo/api/pkg/host/impl"
"gitee.com/infraboard/go-course/day14/demo/api/protocol"
)
// startCmd represents the start command
var serviceCmd = &cobra.Command{
Use: "start",
Short: "Demo后端API服务",
Long: `Demo后端API服务`,
RunE: func(cmd *cobra.Command, args []string) error {
// 初始化全局变量
if err := loadGlobalConfig(confType); err != nil {
return err
}
// 初始化全局日志配置
if err := loadGlobalLogger(); err != nil {
return err
}
// 初始化服务层 Ioc初始化
if err := impl.Service.Config(); err != nil {
return err
}
pkg.Host = impl.Service
// 启动服务
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP, syscall.SIGQUIT)
// 初始化服务
svr, err := newService(conf.C())
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()
svr := &service{
http: http,
log: zap.L().Named("CLI"),
}
return svr, nil
}
type service struct {
http *protocol.HTTPService
log logger.Logger
}
func (s *service) start() error {
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
}
case "etcd":
return errors.New("not implemented")
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
zapConfig.Files.RotateOnStartup = false
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.http.Stop(); err != nil {
s.log.Errorf("graceful shutdown err: %s, force exit", err)
}
s.log.Infof("service stop complete")
return
}
}
}
func init() {
RootCmd.AddCommand(serviceCmd)
}
Go
1
https://gitee.com/infraboard/go-course.git
git@gitee.com:infraboard/go-course.git
infraboard
go-course
go-course
19a3f401ff21

搜索帮助