基于Golang客户端实现Nacos服务注册发现和配置管理

基于Golang客户端实现Nacos服务注册发现和配置管理

背景

最近需要把Golang实现的一个web项目集成到基于Spring Cloud Alibaba的微服务体系中,走Spring Cloud Gateway网关路由实现统一的鉴权入口。

软件版本

组件名称组件版本
Nacos2.2.0
Go1.21.0
Ginv1.9.1
Nacos-sdk-gov2.2.5
Spring Cloud2021.0.2
Spring Cloud Alibaba2021.0.1.0

服务注册发现

项目图示
在这里插入图片描述

服务注册和发现

Golang客户端的注册发现使用的Nacos官方仓库里面的一个实现:https://github.com/nacos-group/nacos-sdk-go,我这边的实现大多数也是参考的官方提供的样例。

首先,初始化clientConfig和serverConfig的配置

sc := []constant.ServerConfig{*constant.NewServerConfig("localhost", 8848, constant.WithContextPath("/nacos")),
}cc := *constant.NewClientConfig(constant.WithNamespaceId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"),constant.WithTimeoutMs(5000),constant.WithNotLoadCacheAtStart(true),constant.WithLogDir("/tmp/nacos/log"),constant.WithCacheDir("/tmp/nacos/cache"),constant.WithUsername("nacos"),constant.WithPassword("nacos"),
)

创建服务发现客户端

client, _ := clients.NewNamingClient(vo.NacosClientParam{ClientConfig:  &cc,ServerConfigs: sc,},
)

服务注册

// 注册服务
registerServiceInstance(client, vo.RegisterInstanceParam{Ip:          getHostIp(),Port:        8777,ServiceName: ServiceName,Weight:      10,Enable:      true,Healthy:     true,Ephemeral:   true,
})// 注册服务
func registerServiceInstance(nacosClient naming_client.INamingClient, param vo.RegisterInstanceParam) {success, err := nacosClient.RegisterInstance(param)if !success || err != nil {panic("register Service Instance failed!")}
}// 获取本机ip地址
func getHostIp() string {conn, err := net.Dial("udp", "8.8.8.8:53")if err != nil {fmt.Println("get current host ip err: ", err)return ""}addr := conn.LocalAddr().(*net.UDPAddr)ip := strings.Split(addr.String(), ":")[0]return ip
}

启动服务,验证ok
在这里插入图片描述

客户端负载均衡

作为Go语言初学者,没有详细去了解Go中类似@LoadBalanced或者Feign的框架(后续可能会补充一下),然后我这边就是获取实例解析IP和端口信息,然后直接使用Go原生的http库进行的调用。

获取实例方法

// 获取一个健康的实例
func selectOneHealthyInstance(client naming_client.INamingClient, serviceName string) (instance *model.Instance) {instances, err := client.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{ServiceName: serviceName,})if err != nil {panic("SelectOneHealthyInstance failed!")}return instances
}

具体调用

func hello(c *gin.Context) {name := c.Param("name")instance := selectOneHealthyInstance(NamingClient, "server-java")url := fmt.Sprintf("http://%s:%d/hello/%s", instance.Ip, instance.Port, name)resp, _ := http.Get(url)defer resp.Body.Close()body, _ := io.ReadAll(resp.Body)c.String(http.StatusOK, string(body))
}

在server-java中,提供了一个rest接口

/*** 启动类** @author yuanzhihao* @since 2024/3/4*/
@RestController
@RequestMapping
@SpringBootApplication
public class Application {@GetMapping("/hello/{name}")public String hello(@PathVariable("name") String name) {return "Hello " + name;}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

请求 http://localhost:8777/hello/yuan, 调用成功
在这里插入图片描述

配置管理

图示
在这里插入图片描述

第一步和注册发现一样,初始化clientConfig和serverConfig的配置,略

创建动态配置客户端

configClient, _ := clients.NewConfigClient(vo.NacosClientParam{ClientConfig:  &cc,ServerConfigs: sc,},
)

拉取指定data-id的配置

config, _ := ConfigClient.GetConfig(vo.ConfigParam{DataId: ServiceName,
})
fmt.Printf("config is " + config)

我这边写了一个rest的接口,可以指定获取某个具体配置的值

// 初始化服务端
func ServerSetup() {r := gin.Default()r.GET("/hello/:name", hello)r.GET("/config", getSpecifiedConfig)r.Run(":8777")
}// 获取指定的配置
func getSpecifiedConfig(c *gin.Context) {param := c.DefaultQuery("name", "")config, _ := ConfigClient.GetConfig(vo.ConfigParam{DataId: ServiceName,})fmt.Printf("config is " + config)// 解析YAML数据var data map[string]interface{}err := yaml.Unmarshal([]byte(config), &data)if err != nil {fmt.Println("error unmarshalling YAML", err)}value := getValue(data, param)c.String(http.StatusOK, "param [ "+param+" ] value is "+value)
}func getValue(data map[string]interface{}, keyPath string) string {keys := strings.Split(keyPath, ".")var value interface{} = datafor _, key := range keys {if v, ok := value.(map[string]interface{}); ok {value = v[key]} else {return ""}}if v, ok := value.(string); ok {return v}return fmt.Sprintf("%v", value)
}

配置client-go如下

my:name: yuanage: 27city: Nanjing

调用请求 http://localhost:8777/config?name=my.name,http://localhost:8777/config?name=my.age ok
在这里插入图片描述
在这里插入图片描述

结语

参考地址:https://github.com/nacos-group/nacos-sdk-go

代码地址:https://github.com/yzh19961031/blogDemo/tree/master/go-nacos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《汇编语言》- 读书笔记 - 第16章-直接定址表

《汇编语言》- 读书笔记 - 第16章-直接定址表 16.1 描述了单元长度的标号(数据标号)检测点 16.1 16.2 在其他段中使用数据标号assume通过标号取地址检测点 16.2 16.3 直接定址表(Direct Addressing Table)例1分析代码效果 例2分析…

代购集运公司需要什么样的信息化技术服务|集运系统对接主流电商API接口以实现客户丰富的代购体验

代购集运公司可以考虑以下信息化服务: 1、网络平台 代购集运公司可以建立一个在线平台,让客户能够浏览商品、下单、查询订单状态等操作。 平台也可以提供在线支付和快递跟踪等功能,方便客户和公司的沟通和交流。接入主流电商平台API接口&am…

应用在智能空调触摸屏中的高精度触摸芯片

智能空调是具有自动调节功能的空调。智能空调系统能根据外界气候条件,按照预先设定的指标对温度、湿度、空气清洁度传感器所传来的信号进行分析、判断、及时自动打开制冷、加热、去湿及空气净化等功能的空调。适合放在卧室,客厅等地方。 在中央控制系统…

中国电子学会2021年3月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.运行如下图所示的程序后,以下描述正确的是? A:角色停留在(0,0)的位置,不会移动。 B:角色会在舞台上沿水平方向不停地左右往返移动,碰到边缘就反弹。 C&#xff1a…

k8s部署mysql

(作者:陈玓玏) 一、前置条件 已部署k8s,服务端版本为1.21.14 二、部署mysql 拉取镜像; docker pull mysql将账号密码等信息写到configmap,创建configmap; apiVersion: v1 kind: ConfigM…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合,为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换,极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点,集中式架构拥有简单易用、管…

贪心算法练习题(最小化战斗力差距、谈判、纪念品分组、分糖果)

目录 一、贪心算法的介绍 二、贪心算法的实现步骤 三、最小化战斗力差距 四、谈判 五、纪念品分组 六、分糖果 一、贪心算法的介绍 贪心的基本原理:每一步都选择局部最优解,而尽量不考虑对后续的影响,最终达到全局最优解。 贪心的局限性:贪心算法…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录,同时在Google clolab上面是实现,文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战,主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

自定义镜像上传阿里云

目录 前言 一、Alpine简介 二、Alpine 制作jdk镜像 2.1 jdkv2.0版本 2.2 jdkv3.0版本 三、镜像上传阿里云及下载 前言 上篇博主已经讲解过了自定义镜像,跟上篇文章我们继续衍生自定义镜像https://blog.csdn.net/2302_76638140/article/details/136352907 一…

CUDA学习笔记02:测试程序hello world

参考资料 Win10下在VS2019中配置使用CUDA进行加速的C项目 (配置.h文件,.dll以及.lib文件等)_vs2019 cuda-CSDN博客 配置流程 1. 新建一个一般的项目 2. 项目建好后,在项目里添加.cu测试文件 测试的.cu文件命名为cuda_utils.cu&…

MySQL——性能调优

性能调优(重要) SQL 优化的目的 减少磁盘 IO:尽可能避免全表扫描、尽量使用索引、尽量使用覆盖索引减少回表操作减少 CPU 和内存的消耗,尽可能减少排序、分组、去重之类的操作,尽量减少事务持有锁的时间 优化途径&…

Material UI 5 学习02-其它按钮组件

Material UI 5 学习02-其它按钮组件 一、IconButton按钮二、 ButtonGroup按钮组1、最基本的实例2、垂直按钮组 一、IconButton按钮 图标按钮通常适用于切换按钮&#xff0c;允许选择或选择单个选项 取消选择&#xff0c;例如在项目中添加或删除星号。 <IconButton aria-lab…

“互动+消费”时代,借助华为云GaussDB重构新零售中消费逻辑

场与人的关系 “人—货—场”是零售中重要的三要素&#xff0c;我们一直在追求&#xff0c;将零售中的人、货、场进行数字化并在云端进行整合&#xff0c;形成属于我们自己的云平台。 随着互联网技术为信息提供的便利&#xff0c;消费者的集体力量正在逐渐形成一股强大的反向…

保姆级GeoWebCache矢量瓦片切片流程

1矢量切片解决方案 1.1Geoserver配置geowebcache插件 参考文章 (53条消息) 独立安装geoservergeowebcache发布arcgis切片服务_itouch_ok的专栏-CSDN博客 1.将下载好的geoserver 2.19.3安装部署 将下载好的geowebcache 2.19.3的war包解压到 GeoServer 安装目录下./usr/loc…

使用Julia语言及R语言进行格拉布斯检验

在日常的计量检测工作中经常会处理各种数据&#xff0c;在处理数据之前会提前使用格拉布斯准则查看数据中是否存在异常值&#xff0c;如果存在异常值的话应该重新进行计量检测&#xff0c;没有异常值则对数据进行下一步操作。判断异常值常用的格拉布斯方法基于数据来自正态分布…

SpringCloud(19)之Skywalking应用上篇

一、Skywalking概述 随着互联网架构的扩张&#xff0c;分布式系统变得日趋复杂&#xff0c;越来越多的组件开始走向分布式化&#xff0c;如微服务、消 息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用&#xff0c;这些组件共同构成了繁杂的分布式网络。 思考以下…

智能驾驶规划控制理论学习06-基于优化的规划方法之数值优化基础

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

实践航拍小目标检测,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

高级货,极大提高效率,个人非常喜欢

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; FileConverter中文版是一款免费软件&#xff0c;具有强大的功能。它支持多种文件格式的转换&#xff0c;包括视频、音频、文档等。您可以批量转换文件…

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;Bert…