snippet/grpc/grpc.go

77 lines
1.3 KiB
Go

package grpc
import (
"fmt"
"log"
"net"
"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
}
var rpc *grpc.Server
var conf *Config
func Init(config *Config) *grpc.Server {
if config == nil {
config = &Config{
Address: "",
Port: 0,
AppName: "dev",
}
}
conf = config
if rpc == nil {
rpc = grpc.NewServer(grpc.MaxRecvMsgSize(1024*1024), grpc.MaxSendMsgSize(1024*1024))
}
return rpc
}
func IPAddress() string {
return conf.Address
}
func Port() int {
return conf.Port
}
func Start() {
//注册反射 用于grpcurl调试
reflection.Register(rpc)
// grpc服务启动
go func() {
addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", conf.Address, conf.Port))
if err != nil {
log.Fatal("net.ResolveTCPAddr", err)
}
if addr.IP.String() != conf.Address {
conf.Address = addr.IP.String()
}
if addr.Port != conf.Port {
conf.Port = addr.Port
}
log.Printf("starting grpc service on %s:%d", addr.IP, addr.Port)
lis, err := net.ListenTCP("tcp", addr)
if err != nil {
log.Fatal("fail to open port: ", err)
}
defer lis.Close()
err = rpc.Serve(lis)
if err != nil {
log.Fatal("fail to open microservice: ", err)
}
}()
}