snippet/grpc/grpc.go

78 lines
1.4 KiB
Go

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()
}