gitee.com/woood2/luca@v1.0.4/cmd/micro/main.go (about) 1 package main 2 3 import ( 4 myGrpc "gitee.com/woood2/luca/cmd/micro/internal/grpc" 5 "gitee.com/woood2/luca/cmd/micro/internal/grpc/grpc_health_v1" 6 "gitee.com/woood2/luca/cmd/micro/internal/grpc/pb" 7 "gitee.com/woood2/luca/cmd/micro/internal/middleware/auth" 8 lucaSDK "gitee.com/woood2/luca/cmd/micro/pkg" 9 "gitee.com/woood2/luca/internal/cache" 10 "gitee.com/woood2/luca/internal/conf" 11 "gitee.com/woood2/luca/internal/db" 12 "gitee.com/woood2/luca/internal/discovery" 13 myLog "gitee.com/woood2/luca/internal/log" 14 "gitee.com/woood2/luca/internal/status" 15 "gitee.com/woood2/luca/internal/trace" 16 "github.com/go-kit/kit/sd" 17 consulsd "github.com/go-kit/kit/sd/consul" 18 "github.com/grpc-ecosystem/go-grpc-middleware" 19 grpcRecovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" 20 "go.uber.org/zap" 21 "google.golang.org/grpc" 22 "log" 23 "net" 24 "os" 25 "os/signal" 26 "strconv" 27 "syscall" 28 "time" 29 ) 30 31 const entrance = "micro" 32 33 func main() { 34 //load config 35 attr := conf.Load("application.yml", "configs/application.yml") 36 //consul 37 client, consulClient := discovery.Client(attr.Consul.Host, attr.Consul.Port) 38 conf.MergeConsul(attr, consulClient) 39 //zap logger 40 logger := myLog.Build(attr.Env, attr.Project, entrance, attr.Host, attr.ConsoleLog) 41 defer logger.Sync() 42 //gorm & mongo & redis 43 gormDB := db.NewGormDB(attr.Env, attr.Mysql, logger) 44 db.SetGlobalGormDB(gormDB) 45 mongoDB := db.NewMongoDB(attr.Mongo) 46 db.SetMongoDB(mongoDB) 47 redisCache := cache.NewRedis(attr.Redis) 48 cache.SetRedis(redisCache) 49 //zipkin 50 trace.Open(attr.Zipkin) 51 defer trace.Close() 52 //setup sdk 53 setupSDK(client, logger) 54 //gRPC 55 s := grpc.NewServer(grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(grpcRecovery.UnaryServerInterceptor()))) 56 pb.RegisterDefaultServer(s, myGrpc.MakeGRPCHandler(attr.Project, entrance, logger, gormDB, trace.ServerTrace(), auth.ServerAuth())) 57 grpc_health_v1.RegisterHealthServer(s, grpc_health_v1.MakeHealthServer()) 58 //listen 59 lis, errListen := net.Listen("tcp", ":"+strconv.Itoa(attr.Micro.Port)) 60 if errListen != nil { 61 log.Panicf("failed to listen: %+v\n", errListen) 62 } 63 //serve 64 go func() { 65 if err := s.Serve(lis); err != nil { 66 log.Panicf("Serve: %s\n", err) 67 } 68 log.Println("Quit Serve goroutine") 69 }() 70 //register 71 var registar sd.Registrar 72 if attr.Micro.Register { 73 registar = discovery.Register(client, attr.Project, attr.Host, attr.Micro.Port) 74 registar.Register() 75 } 76 //Pprof & prometheus & hystrix 77 go status.Pprof(attr.Pprof, attr.Env, attr.Micro.PprofAddr) 78 go status.Prometheus(attr.Micro.MetricsAddr) 79 go status.Hystrix(attr.Micro.HystrixPort) 80 //graceful shutdown 81 quit := make(chan os.Signal) 82 signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2) 83 <-quit 84 log.Println("Shutting down server...") 85 if attr.Micro.Register { 86 registar.Deregister() //gray release 87 time.Sleep(1 * time.Second) //make sure 88 } 89 stopped := make(chan struct{}) 90 go func () { 91 s.GracefulStop() 92 close(stopped) 93 }() 94 t := time.NewTimer(5 * time.Second) 95 select { 96 case <- t.C: 97 s.Stop() 98 case <- stopped: 99 t.Stop() 100 } 101 log.Println("Server exiting") 102 } 103 104 func setupSDK(client consulsd.Client, zapLogger *zap.Logger) { 105 lucaClient:=lucaSDK.NewSD(client, "weibo2", "todo", zapLogger, trace.ClientTrace()) 106 lucaSDK.SetGlobal(lucaClient) 107 //More... 108 }