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  }