// Copyright 2019 getensh.com. All rights reserved. // Use of this source code is governed by getensh.com. package main import ( "context" "flag" "fmt" "log" "net" "os" "os/signal" "syscall" "time" "adm-data/consts" "adm-data/etcd" "adm-data/impl" "adm-data/impl/v1/query" "adm-data/parser" "git.getensh.com/common/gopkgsv2/cache" "git.getensh.com/common/gopkgsv2/database" "git.getensh.com/common/gopkgsv2/tasker" "gopkg.in/ini.v1" "google.golang.org/grpc" ) var ( configFile = flag.String("config", "/etc/adm/common.yaml", "config file location") appConf = flag.String("local_config", "/etc/adm-data/app.conf", "config file location") version = flag.Bool("version", false, "print the version") GitCommit = "library-import" Version = "library-import" ) func showVersion() { fmt.Println("Version: ", Version) fmt.Println("GitCommit:", GitCommit) } func prepare(filename string) { // 加载配置 err := parser.LoadConfig(filename) if err != nil { fmt.Printf("get conf failed, err: %+v\n\n", err) os.Exit(1) } // 注册处理函数 parser.Register(parser.MysqlHandler, parser.RedisHandler, parser.LoggerHandler) // parser.Register(parser.LoggerHandler) // 执行注册的处理函数 parser.Handle() } func run(discoveryType, etcdAddr, serviceIp, servicePort string) { if discoveryType == "etcd" { etcd.Init(etcdAddr, serviceIp, servicePort) } // 开始监听 serveAddr := serviceIp + ":" + servicePort log.Printf("Listening and serving TCP on %s\n", serveAddr) lis, err := net.Listen("tcp", serveAddr) if err != nil { os.Exit(1) } s := grpc.NewServer() defer s.GracefulStop() impl.Register(s) go func() { if err := s.Serve(lis); err != nil { log.Fatalf("HTTP server listen failed. err: %s\n", err.Error()) } }() // redis 订阅 cache.Redis().PSubscribe(query.HandleExportMsg, consts.ExportStyleChannel) // 优雅关闭服务器 sigChan := make(chan os.Signal, 1) // 捕获信号 signal.Notify(sigChan, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) sigValue := <-sigChan log.Printf("Got a signal:%v", sigValue) // 让tasker安全退出 tasker.SignalNotify(sigValue) // 不管什么行为,都等待5秒退出 log.Println("Start to shutdown server...") _, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() log.Println("Shutdown server finished.") } func main() { defer func() { database.Close() }() flag.Parse() if *version { showVersion() os.Exit(1) } // 读取app.conf内容 cfg, err := ini.Load(*appConf) if err != nil { fmt.Printf("get app.conf failed, err:%+v\n", err) os.Exit(1) } discoveryType := cfg.Section("").Key("discoveryType").String() serviceIp := cfg.Section("").Key("serviceIp").String() servicePort := cfg.Section("").Key("servicePort").String() etcdAddr := cfg.Section("").Key("etcdAddr").String() prepare(*configFile) // go utils.Free() run(discoveryType, etcdAddr, serviceIp, servicePort) return }