// Copyright 2019 getensh.com. All rights reserved. // Use of this source code is governed by getensh.com. package main import ( "context" "flag" "fmt" "gopkg.in/ini.v1" "log" "net" "os" "os/signal" "property-garden/pb" "syscall" "time" "property-garden/impl" "property-garden/parser" "git.getensh.com/common/gopkgs/database" "git.getensh.com/common/gopkgs/tasker" "google.golang.org/grpc" ) var ( configFile = flag.String("config", "conf/common.yaml", "config file location") appConf = flag.String("appconf", "conf/app.conf", "app conf 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.MysqlHandler, parser.LoggerHandler, parser.RedisHandler, parser.MgoHandler, ) // 执行注册的处理函数 parser.Handle() } func run() { // 开始监听 serveAddr := fmt.Sprintf("%s:%d", parser.Conf.Rpc.Garden.ServiceIp, parser.Conf.Rpc.Garden.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() impl.Register(s) cfg, err := ini.Load(*appConf) if err != nil { fmt.Printf("Fail to read file: %v\n\n", err) os.Exit(1) } serviceIp := cfg.Section("").Key("service_ip").String() if len(parser.Conf.EtcdAddrs) > 0 { parser.EctdRegister(parser.Conf.EtcdAddrs, parser.Conf.Rpc.Garden.ServiceName, fmt.Sprintf("%s:%v", serviceIp, parser.Conf.Rpc.Garden.ServicePort), parser.Conf.Rpc.Prefix) } // 建立rpc客户端 conns := pb.SetupClients() for _, conn := range conns { defer conn.Close() } go func() { if err := s.Serve(lis); err != nil { log.Fatalf("HTTP server listen failed. err: %s\n", err.Error()) } }() // 优雅关闭服务器 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() s.Stop() log.Println("Shutdown server finished.") } func main() { defer func() { database.Close() }() flag.Parse() if *version { showVersion() os.Exit(1) } prepare(*configFile) run() return }