go-服务注册


注册到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())
			}
		},
	})
}

文章作者: wmg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wmg !
  目录