golang实现nacos获取配置和服务注册-支持集群详解

 更新时间:2025年11月17日 14:42:14   作者:一条闲鱼_mytube  
文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户端支持集群配置,文章还讨论了如何将Nacos获取到的配置与项目中的Viper无缝对接,以便进行Viper的正常操作

golang nacos获取配置和服务注册-支持集群

初始化客户端

结构体中IpAddres 可以配置多个地址

package utils

import (
	"github.com/nacos-group/nacos-sdk-go/clients/config_client"
	"github.com/nacos-group/nacos-sdk-go/clients/naming_client"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"time"
)

type NacosConfigClient struct {
	//ConfigInput
	//"ip1,ip2,ip3"
	IpAddrs string
	Port    int
	NaocesNameSpace string
	DataId          string
	Group           string
	NacosLogDir     string
	NacosCacheDir   string
	//NamingInput
	NamingServiceName string
	NamingServiceIP   string
	NamingOwner       string
	NamingPort        int
	//Output
	ConfigClient config_client.IConfigClient
	NamingClient naming_client.INamingClient
}

可选参数配置

type OptionNacos func(msg *NacosConfigClient)

//config naming
func OptionNacosConfigWithServiceName(serviceName string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NamingServiceName = serviceName
	}
}
func OptionNacosConfigWithServiceIP(serviceIP string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NamingServiceIP = serviceIP
	}
}

func OptionNacosConfigWithOwner(owner string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NamingOwner = owner
	}
}

//config client
func OptionNacosConfigWithLogDir(logDir string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NacosLogDir = logDir
	}
}

func OptionNacosConfigWithCacheDir(cacheDir string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NacosCacheDir = cacheDir
	}
}

func OptionNacosConfigWithIpaddr(ipAddrr string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.IpAddrs = ipAddrr
	}
}
func OptionNacosConfigWithNameSpace(nameSpace string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NaocesNameSpace = nameSpace
	}
}
func OptionNacosConfigWithPort(port int) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.Port = port
	}
}

func OptionNacosConfigDataId(dataId string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.DataId = dataId
	}
}

func OptionNacosConfigGroup(group string) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.Group = group
	}
}

func OptionNacosWithNamingPort(port int) OptionNacos {
	return func(msg *NacosConfigClient) {
		msg.NamingPort = port
	}
}

new一个客户端 支持集群配置

func NewNacosClient(ops ...OptionNacos) *NacosConfigClient{
	nacosConfigClient := new(NacosConfigClient)
	for _, o := range ops {
		o(nacosConfigClient)
	}
	serverConfigs:=make([]constant.ServerConfig,0)
	 address:=strings.Split(nacosConfigClient.IpAddrs,",")
	 for i:=range address{
		 serverConfigs=append(serverConfigs,constant.ServerConfig{
			 IpAddr: address[i],
			 Port:   uint64(nacosConfigClient.Port),
		 })
	 }
	clientConfig := constant.ClientConfig{
		NamespaceId:         nacosConfigClient.NaocesNameSpace, //
		NotLoadCacheAtStart: false,
		TimeoutMs:           5 * 1000,
		LogDir:              nacosConfigClient.NacosLogDir,
		CacheDir:            nacosConfigClient.NacosCacheDir,
	}

	configClient, err := clients.NewConfigClient(
		vo.NacosClientParam{
			ClientConfig:  &clientConfig,
			ServerConfigs: serverConfigs,
		},
	)

	if err != nil {
		panic(err)
	}
	nacosConfigClient.ConfigClient = configClient

	// Naming client
	namingClient, err := clients.NewNamingClient(
		vo.NacosClientParam{
			ClientConfig:  &clientConfig,
			ServerConfigs: serverConfigs,
		},
	)
	if err != nil {
		panic(err)
	}
	nacosConfigClient.NamingClient = namingClient
	return nacosConfigClient
}

获取配置信息

func (client *NacosConfigClient) GetConfig() (string, error) {
	content, err := client.ConfigClient.GetConfig(vo.ConfigParam{
		DataId: client.DataId,
		Group:  client.Group,
	})
	return content, err
}

服务注册

func (client *NacosConfigClient) Register() (bool, error) {
	param := vo.RegisterInstanceParam{
		Ip:          client.NamingServiceIP,
		Port:        uint64(client.NamingPort),
		ServiceName: client.NamingServiceName,
		Weight:      10,
		Enable:      true,
		Healthy:     true,
		Ephemeral:   true,
		Metadata:    map[string]string{"owenr": client.NamingOwner, "uptime": time.Now().Format("2006-01-02 15:04:05")},
	}
	success, err := client.NamingClient.RegisterInstance(param)
	return success, err
}

获取配置后如何和项目中的vipper如何无缝对接?

func InitConfig() {
	config = viper.New()
	config.SetConfigType("yaml")
	config.ReadConfig(bytes.NewReader([]byte(GetNacosConfig())))
}

func GetNacosConfig() string {
	content,err:=GetNacosClient().GetConfig()
	if err!=nil{
		panic(err)
	}
	return content
}

这样就可以进行vipper正常操作了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • golang模板template自定义函数用法示例

    golang模板template自定义函数用法示例

    这篇文章主要介绍了golang模板template自定义函数用法,结合实例形式分析了Go语言模板自定义函数的基本定义与使用方法,需要的朋友可以参考下
    2016-07-07
  • Go语言区别于其他语言的特性

    Go语言区别于其他语言的特性

    在本文中,今天这篇文章将给大家介绍一下 Go 与其他语言不同的 9 个特性,需要的朋友可以参考下面文章的具体内容
    2021-10-10
  • GO语言make和new关键字的区别

    GO语言make和new关键字的区别

    本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别,希望对大家有所帮助
    2023-04-04
  • 详解golang中的闭包与defer

    详解golang中的闭包与defer

    闭包一个函数与其相关的引用环境组合的一个实体,其实可以理解为面向对象中类中的属性与方法,这篇文章主要介绍了golang的闭包与defer,需要的朋友可以参考下
    2022-09-09
  • Go channel结构体源码和读写和关闭过程详解

    Go channel结构体源码和读写和关闭过程详解

    这篇文章主要介绍了Go channel结构体源码和读写和关闭过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • golang实现mysql数据库事务的提交与回滚

    golang实现mysql数据库事务的提交与回滚

    这篇文章主要介绍了golang实现mysql数据库事务的提交与回滚,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go 实现HTTP中间人代理的操作

    Go 实现HTTP中间人代理的操作

    这篇文章主要介绍了Go 实现HTTP中间人代理的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang 处理浮点数遇到的精度问题(使用decimal)

    Golang 处理浮点数遇到的精度问题(使用decimal)

    本文主要介绍了Golang 处理浮点数遇到的精度问题,不使用decimal会出大问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Golang Heap的源码剖析

    Golang Heap的源码剖析

    这篇文章主要给大家详细剖析了Golang Heap源码,文中有详细的代码示例,对我们学习Golang Heap有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • Go语言Cookie用法分析

    Go语言Cookie用法分析

    这篇文章主要介绍了Go语言Cookie用法,结合实例形式分析了Go语言Cookie的设置、读取等相关操作技巧,需要的朋友可以参考下
    2017-02-02

最新评论