package grpc import ( "fmt" "log" "net" "sync" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) type GrpcService interface { Register(srv *grpc.Server) } type Config struct { Address string Port int AppName string Opts []grpc.ServerOption } var rpc *grpc.Server var conf *Config func Init(config *Config) *grpc.Server { if config == nil { config = &Config{ Address: "0.0.0.0", Port: 0, AppName: "unknown", Opts: []grpc.ServerOption{grpc.MaxRecvMsgSize(1024 * 1024), grpc.MaxSendMsgSize(1024 * 1024)}, } } conf = config if rpc == nil { rpc = grpc.NewServer(conf.Opts...) } return rpc } func IPAddress() string { return conf.Address } func Port() int { return conf.Port } func Start() { //注册反射 用于grpcurl调试 reflection.Register(rpc) wg := sync.WaitGroup{} wg.Add(1) // grpc服务启动 go func() { addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", conf.Address, conf.Port)) if err != nil { log.Fatal("net.ResolveTCPAddr", err) } lis, err := net.ListenTCP("tcp", addr) if err != nil { log.Fatal("fail to open port: ", err) } defer lis.Close() conf.Port = lis.Addr().(*net.TCPAddr).Port wg.Done() log.Printf("starting grpc service on %s:%d", addr.IP, conf.Port) err = rpc.Serve(lis) if err != nil { log.Fatal("fail to open microservice: ", err) } }() wg.Wait() }