snippet/grpc/grpc.go

78 lines
1.4 KiB
Go
Raw Normal View History

2021-09-13 12:52:49 +00:00
package grpc
import (
"fmt"
"log"
"net"
"sync"
2021-09-13 12:52:49 +00:00
"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
2021-10-04 05:57:26 +00:00
Opts []grpc.ServerOption
2021-09-13 12:52:49 +00:00
}
var rpc *grpc.Server
2021-09-15 11:04:51 +00:00
var conf *Config
func Init(config *Config) *grpc.Server {
if config == nil {
config = &Config{
2021-09-16 02:38:37 +00:00
Address: "0.0.0.0",
2021-09-15 11:04:51 +00:00
Port: 0,
2021-09-16 02:38:37 +00:00
AppName: "unknown",
2021-10-04 05:57:26 +00:00
Opts: []grpc.ServerOption{grpc.MaxRecvMsgSize(1024 * 1024), grpc.MaxSendMsgSize(1024 * 1024)},
2021-09-15 11:04:51 +00:00
}
}
conf = config
2021-09-13 12:52:49 +00:00
if rpc == nil {
2021-10-04 05:57:26 +00:00
rpc = grpc.NewServer(conf.Opts...)
2021-09-13 12:52:49 +00:00
}
return rpc
}
2021-09-16 01:40:48 +00:00
func IPAddress() string {
return conf.Address
}
func Port() int {
return conf.Port
}
2021-09-13 12:52:49 +00:00
func Start() {
//注册反射 用于grpcurl调试
reflection.Register(rpc)
wg := sync.WaitGroup{}
wg.Add(1)
// grpc服务启动
2021-09-13 12:52:49 +00:00
go func() {
2021-09-16 01:38:22 +00:00
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)
2021-09-13 12:52:49 +00:00
if err != nil {
log.Fatal("fail to open port: ", err)
}
2021-09-16 01:38:22 +00:00
defer lis.Close()
2021-09-16 02:38:37 +00:00
conf.Port = lis.Addr().(*net.TCPAddr).Port
2021-09-16 06:03:34 +00:00
wg.Done()
2021-09-16 02:38:37 +00:00
log.Printf("starting grpc service on %s:%d", addr.IP, conf.Port)
2021-09-13 12:52:49 +00:00
err = rpc.Serve(lis)
if err != nil {
log.Fatal("fail to open microservice: ", err)
}
}()
wg.Wait()
2021-09-13 12:52:49 +00:00
}