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

2025-11-17 18:50

本文主要是介绍golang实现nacos获取配置和服务注册-支持集群详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《golang实现nacos获取配置和服务注册-支持集群详解》文章介绍了如何在Go语言中使用Nacos获取配置和服务注册,支持集群初始化,客户端结构体中的IpAddresses可以配置多个地址,新客户...

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 *NacosConfigCliChina编程ent) {
		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 OptionNacopythonsConfigDataId(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: clijsent.DataId,
		Group:  client.Group,
	})
	return content, err
}

服务注册

func (client *NacosConfigClient) Registerwww.chinasem.cn() (bool, error) {
	param := vo.RegisterInstanceParam{
		Ip:          client.NamingServiceIP,
		Port:        uint64(client.NamingPort),
		ServiceName: client.NamingServiceName,
		Weight:      10,
		Enable:      true,
		Healthwww.chinasem.cny:     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正常操作了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于golang实现nacos获取配置和服务注册-支持集群详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156192

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.