注册到consul
先引入资源
go get -u go.uber.org/zap
go get -u google.golang.org/grpc
_ "github.com/mbobakov/grpc-consul-resolver"
"github.com/satori/go.uuid"
grpc服务端注册到consul
func InitGrpc() {
server := grpc.NewServer()
proto.RegisterUserServer(server,&service.UserServer{})
listen, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", global.App.Server.Port)) //服务启动监听端口
if err != nil {
panic("failed to listen:"+err.Error())
}
// 将服务注册到consul,配置健康检查
grpc_health_v1.RegisterHealthServer(server,health.NewServer())
cfg := api.DefaultConfig()
// 配置consul的地址和端口
cfg.Address = fmt.Sprintf("%s:%d",global.App.Consul.Host,global.App.Consul.Port)
client, err := api.NewClient(cfg)
if err != nil {
zap.S().Errorw("服务注册失败:"+err.Error())
}
//服务实例配置
check := &api.AgentServiceCheck{
GRPC: fmt.Sprintf("%s:%d",global.App.Server.Host,global.App.Server.Port),
Timeout: "5s",
Interval: "5s",
DeregisterCriticalServiceAfter: "10s",
}
//生成注册对象
registration := new(api.AgentServiceRegistration)
serviceID := fmt.Sprintf("%s", uuid.NewV4())
registration.ID = serviceID
registration.Name = global.App.Server.Name
registration.Port = global.App.Server.Port
registration.Tags = []string{global.App.Server.Name}
registration.Address = global.App.Server.Host
registration.Check = check
err = client.Agent().ServiceRegister(registration)
if err != nil {
zap.S().Errorw("服务注册失败:"+err.Error())
}
err = server.Serve(listen)
if err != nil {
panic("failed to start grpc:"+err.Error())
}
}
grpc客户端注册
consulInfo := global.App.Consul //配置文件里获取consul的地址和端口
//获得grpc连接并 将服务注册到consul
userConn, err := grpc.Dial(
fmt.Sprintf("consul://%s:%d/%s?wait=14s", consulInfo.Host, consulInfo.Port, global.App.Server.Name),
grpc.WithInsecure(),
// 配置轮询的方式
grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
)
if err != nil {
zap.S().Fatal("[mxshop-web] Grpc连接 【用户服务失败】")
}
//获取服务连接,用于执行业务
global.UserSrvClient = proto.NewUserClient(userConn)
注册到nacos
获取sdk
$ go get -u github.com/nacos-group/nacos-sdk-go
将服务注册到nacos(注:配置文件为json格式,viper暂不支持yml)
//InitNacos 连接nacos,拉取配置,将服务注册到nacos,
func InitNacos(){
app := global.App
serverConfigs := []constant.ServerConfig{
{
IpAddr: app.Nacos.Host,
Port: uint64(app.Nacos.Port),
},
}
clientConfig := constant.ClientConfig{
NamespaceId: app.Nacos.Namespace, // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "tmp/nacos/log",
CacheDir: "tmp/nacos/cache",
RotateTime: "1h",
MaxAge: 3,
LogLevel: "debug",
}
//-----------------------拉取nacos上的配置----------------------------
configClient, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: &clientConfig,
ServerConfigs: serverConfigs,
},
)
//获取nacos上的配置
configClientcontent, err := configClient.GetConfig(vo.ConfigParam{
DataId: app.Nacos.DataId,
Group: app.Nacos.Group,
})
if err != nil {
zap.S().Panic("连接nacos配置服务失败:" + err.Error())
}
//将拉取的文件序列化为struct
err = json.Unmarshal([]byte(configClientcontent), &app)
if err != nil {
zap.S().Panic("json序列化nacos配置文件失败:" + err.Error())
}
//-----------------------对nacos上实例的操作 ----------------------------
//创建服务发现客户端 (推荐)
namingClient,err := clients.NewNamingClient(
vo.NacosClientParam{
ClientConfig: &clientConfig,
ServerConfigs: serverConfigs,
},
)
if err!=nil {
zap.S().Panic("创建nacos服务发现客户端失败:"+err.Error())
}
//获取本地ip
ip, err := utils.GetLocalIP()
if err != nil {
zap.S().Panic("获取主机ip失败:"+err.Error())
}
//配置注册实例
success, err := namingClient.RegisterInstance(vo.RegisterInstanceParam{
Ip: ip,
Port: uint64(app.Server.Port),
ServiceName: app.Server.Name,
Weight: 10,
Enable: true,
Healthy: true,
Ephemeral: true,
Metadata: map[string]string{"preserved.register.source": "GO_CLOUD"},
ClusterName: "DEFAULT", // 默认值DEFAULT
GroupName: app.Nacos.Group, // 默认值DEFAULT_GROUP
})
if err != nil || !success{
zap.S().Errorf("注册实例到nacos失败:%v",err)
}
//-----------------------监听配置文件的变化 ----------------------------
//监听配置文件是否发生变化
err = configClient.ListenConfig(vo.ConfigParam{
DataId: app.Nacos.DataId,
Group: app.Nacos.Group,
OnChange: func(namespace, group, dataId, data string) {
zap.S().Warnw("%s-%s-%s配置文件发生了变化...",namespace,group,dataId)
err = json.Unmarshal([]byte(configClientcontent), &app)
if err != nil {
zap.S().Panic("json序列化nacos配置文件失败:" + err.Error())
}
},
})
}