【手把手】教你玩转SpringCloud Alibaba之Nacos Config深入

news2024/11/27 17:40:46

1、不同环境相同配置问题-自定义Data ID配置

在实际的开发过程中,项目所用到的配置参数有的时候并不需要根据不同的环境进行区分,生产、测试、开发环境所用到的参数值是相同的。怎么解决同一服务在多环境中,引用相同的配置的问题?Nacos Config也提供了相应的解决方案:可以通过服务名+拓展名的方式,来实现同一个微服务下不同的环境,共享的配置文件。

在Nacos配置中心添加一个Data Id为nacos-config-client.yaml的通用配置文件:

在config-3377中添加Nacos配置中心的地址:

在Controller中添加对应方法:

访问http://localhost:3377/config/configCommon,可以看到已经成功拿到对应的配置:

可以看到, nacos-config-client.yaml配置文件其实是没有带环境后缀在后面,也就是无论哪个环境都可以加载此配置文件。但是需要注意的是,也正是由于没有带环境后缀,所以这种通用的配置文件的优先级是低于指定环境的配置文件。从启动的日志中就可以看到,优先读取带环境的配置文件,再读取无环境后缀的通用配置文件:

2、不同微服务之间如何共享配置及拓展配置

当前这种配置方式是最基础的配置方式,但是在实际开发中会涉及到多个微服务之间共享配置。比如说redis地址,服务注册中心公共组件等等,那么这些组件是多个微服务共享的,所以可以使用Nacos Config提供的共享配置方式来配置共享的配置文件:

shared-configs

在Nacos配置中心添加一个Data Id为nacos-config-client.yaml的Redis配置文件:

原先配置文件的Data Id都是以服务名称来明明,但是这个配置文件是被多个服务公用的,所以取哪一个服务名称来命名都不合适,索性随便自定义一个即可。

在config-3377中添加Nacos配置中心,并指定对应的共享配置文件:

进入源码中可以看到,shared-comfigs是个列表,也就是说可以配置多个共享配置文件:

共享文件中要指定的几个参数,源码中也都写的很清楚,直接复制照搬即可:

在Controller中添加对应方法:

访问http://localhost:3377/config/configShared,可以看到已经成功拿到对应的配置:

注意:多个 Data Id 同时配置时,优先级关系是 `spring.cloud.nacos.config.extension-configs[n].data-id` 其中 n 的值越大,优先级越高。也就是说,shared-configs[1]的优先级高于shared-configs[0]的优先级。 

extension-configs

其实以上的实现还可以通过extension-configs方式来完成,其实作用基本一致,只不过语义上可以更好的区分。如果需要在一个微服务上配置多个配置文件,可以使用extension-configs,如果需要多个配置文件共享,可以使用shared-configs配置方式,当然其实两种方式所实现的效果和配置方法基本一致。所以通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

只需要在yml配置文件中将shared-configs改为extension-configs即可:

重启服务后,再访问http://localhost:3377/config/configShared,可以看到效果一致:

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
- A: 通过 `spring.cloud.nacos.config.shared-configs[n].data-id` 支持多个共享 Data Id 的配置;
- B: 通过 `spring.cloud.nacos.config.extension-configs[n].data-id` 的方式支持多个扩展 Data Id 的配置;
- C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置;
当三种方式共同使用时,它们的一个优先级关系是:A < B < C

3、Nacos动态刷新原理

什么是动态监听

所谓动态监听,简单理解就是指Nacos会自动找到那些服务已经注册,而对比来说静态监听,就是指需要有指定配置指定的服务。其实在这里就要说一下客户端和服务端的交互方式,无非就是推和拉:
- Push:表示服务端主动将数据变更信息推送给客户端
    - 服务需要维持客户端的长连接,因为需要知道具体推送的客户端
    - 客户端耗费内存高,因为需要保存所有客户端的连接,并且需要检测连接有效性(心跳机制)
- Pull:表示客户端主动去服务端拉取数据
    - 需要定时拉取数据
    - 缺点:时效性,数据实时性,无效请求

动态刷新机制

Nacos动态刷新机制,采用推和拉的优点,避免缺点。Nacos做配置中心的时候,配置数据的交互模式是有服务端push推送的,还是客户端pull拉取的?Nacos客户端发送一个请求连接到服务端,然后服务端中会有一个29.5+0.5s的一个hold期,然后服务端会将此次请求放入到allSubs队列中等待,触发服务端返回结果的情况只有两种,第一种是时间等待了29.5秒,配置未发生改变,则返回未发生改变的配置;第二种是操作Nacos Dashboard或者API对配置文件发生一次变更,此时会触发配置变更的事件,发送一条LocalDataEvent消息,此时服务端监听到消息,然后遍历allSubs队列,根据对应的groupId找到配置变更的这条ClientLongPolling任务,并且通过连接返回给客户端。

Nacos动态刷新避免了服务端对客户端进行push操作时需要保持双方的心跳连接,同样也避免了客户端对服务端进行pull操作时数据的时效性问题,不必频繁去拉去服务端的数据。通过上面原理的初步了解,显而易见,答案是:客户端主动拉取的,通长轮询的方式(Long Polling)的方式来获取配置数据。

短轮询

不管服务端的配置是否发生变化,不停发起请求去获取配置,比如支付订单场景中前端不断轮询订单支付的状态,这样的坏处显而易见,由于配置并不会频繁发生变更,如果是一直发请求,一定会对服务端造成很大的压力。还会造成数据推送的延迟,比如每10秒请求一次配置,如果在第11秒的时候配置更新,那么推送将会延迟9秒,等待下一次请求这就是短轮询,为了解决短轮询的问题,有了长轮询的方案。

长轮询

长轮询不是什么新技术,它其实就是由服务端控制响应客户端请求结果的返回时间,来减少客户端无效请求的一种优化手段。其实对于客户端来说,长轮询的使用并没有本质上的区别,客户端发起请求后,服务端不会立即返回请求结果,而是将请求hold挂起一段时间,如果此时间段内配置数据发生变更,则立即响应客户端,若一直无变更则等到指定超时时间后响应给客户端结果,客户端重新发起长链接。

4、Nacos一致性协议:Distro协议

Distro协议是Nacos社区自研的一种AP分布式协议,是面向临时实例设计的一种分布式协议,其保证在某些Nacos节点宕机后,整个临时实例处理系统依旧可以正常工作。作为一种有状态的中间件应用内嵌协议,Distro保证了各个Nacos节点对于注册请求的统一协调和储存。

Distro协议的主要设计思想

- Nacos 每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点;
- 每个节点只负责部分数据,定时发送自己负责数据的校验值到其它节点来保持数据一致性;
- 每个节点独立处理读请求,及时从本地发出响应;

Nacos为什么需要一致性协议

- Nacos 在开源支持就定下了⼀个目标,尽可能的减少用户部署以及运维成本,做到用户只需要⼀个程序包,就可以快速以单机模式启动 Nacos 或者以集群模式启动 Nacos。而Nacos 是⼀个需要存储数据的⼀个组件,为了实现这个目标,就需要在 Nacos 内部实现数据存储。单机下其实问题不大,简单的内嵌关系型数据库即可;但是集群模式下,就需要考虑如何保障各个节点之间的数据⼀致性以及数据同步,而要解决这个问题,就不得不引入共识算法,通过算法来保障各个节点之间的数据的⼀致性;
- Distro 协议是阿里巴巴自研的⼀个最终⼀致性协议,而最终⼀致性协议有很多,比如Gossip(流行病协议)、Eureka 内的数据同步算法。而 Distro 算法是集 Gossip 以及 Eureka 协议的优点并加以优化而出来的。对于原生的 Gossip,由于随机选取发送消息的节点,也就不可避免的存在消息重复发送给同⼀节点的情况,增加了网络的传输的压力,也给消息节点带来额外的处理负载。而Distro算法引入了权威 Server 的概念,每个节点负责⼀部分数据以及将自己的数据同步给其它节点,有效的降低了消息冗余的问题;

Distro协议具体执行逻辑

数据初始化

新加入的 Distro 节点会进行全量数据拉取。具体操作是轮询所有的 Distro 节点,通过向其它的机器发送请求拉取全量数据。在全量拉取操作完成之后,Nacos 的每台机器上都维护了当前的所有注册上来的非持久化实例数据。

数据校验

在 Distro 集群启动之后,各台机器之间会定期的发送心跳。心跳信息主要为各个机器上的所有数据的元信息(之所以使用元信息,是因为需要保证网络中数据传输的量级维持在⼀个较低水平)。这种数据校验会以心跳的形式进行,即每台机器在固定时间间隔会向其它机器发起⼀次数据校验请求。⼀旦在数据校验过程中,某台机器发现其它机器上的数据与本地数据不⼀致,则会发起⼀次全量拉取请求,将数据补齐。

写操作

对于⼀个已经启动完成的 Distro 集群,在⼀次客户端发起写操作的流程中,当注册非持久化的实例的写请求打到某台 Nacos 服务器时,Distro 集群处理的流程包括几个部分:
1、前置的 Filter 拦截请求,并根据请求中包含的 IP 和 port 信息计算其所属的Distro 责任节点,并将该请求转发到所属的 Distro 责任节点上;
2、责任节点上的 Controller 将写请求进行解析;
3、Distro 协议定期执行 Sync 任务,将本机所负责的所有的实例信息同步到其它节点上;

读操作

由于每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro 机器会直接从本地拉取数据,快速响应。 这种机制保证了 Distro 协议可以作为⼀种 AP 协议,对于读操作都进行及时的响应。在网络分区的情况下,对于所有的读操作也能够正常返回;当网络恢复时,各个 Distro 节点会把各数据分片的数据进行合并恢复。

Distro 协议是 Nacos 对于临时实例数据开发的⼀致性协议。其数据存储在缓存中,并且会在启动时进行全量数据同步,并定期进行数据校验。在 Distro 协议的设计思想下,每个 Distro 节点都可以接收到读写请求。所有的Distro协议的请求场景主要分为三种情况:
1、当该节点接收到属于该节点负责的实例的写请求时,直接写入;
2、当该节点接收到不属于该节点负责的实例的写请求时,将在集群内部路由,转发给对应的节点,从而完成读写;
3、当该节点接收到任何读请求时,都直接在本机查询并返回(因为所有实例都被同步到了每台机器上);

Distro 协议作为 Nacos的内嵌临时实例⼀致性协议,保证了在分布式环境下每个节点上面的服务信息的状态都能够及时地通知其它节点,可以维持数十万量级服务实例的存储和最终一致性

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

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

相关文章

Spring Security(7)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 有时某些业务或者功能&#xff0c;需要在用户请求到来之前就进行一些判断或执行某些动作&#xff0c;就像在Servlet中的FilterChain过滤器所做的那样&#xff0c…

A Self-Attentive model for Knowledge Tracing论文笔记

原文链接和代码链接A Self-Attentive model for Knowledge Tracing | Papers With Code motivation&#xff1a;传统方法面临着处理稀疏数据时不能很好地泛化的问题。 本文提出了一种基于自注意力机制的知识追踪模型 Self Attentive Knowledge Tracing (SAKT)。其本质是用 Tra…

我的创作二周年纪念日

我的创作二周年纪念日 文章目录我的创作二周年纪念日机缘最初成为创作者的初心:1. 自我简介2. 日常学习过程中的记录收获在创作的过程中都有哪些收获?1. 获得了多少粉丝的关注?2. 获得了多少正向的反馈&#xff0c;如赞、评论、阅读量?3. 认识和哪些志同道合的领域同行?日常…

剑指Offer专项突破版(76)—— 数组中的第 k 大的数字

题目 剑指 Offer II 076. 数组中的第 k 大的数字 思路 假设有个划分函数divide&#xff1a; divide&#xff1a;将num在[l,r]范围内&#xff0c;按照nums[l]进行划分&#xff0c;返回一个数组range&#xff0c;划分为&#xff1a; 所有小于nums[l]的数&#xff1a;移动到nu…

nginx连接前后端分离项目 或 负载均衡映射多个服务器

nginx的两种用法&#xff1a; 打通前后端项目&#xff0c;前后端分离的项目&#xff0c;通过nginx建立连接 负载均衡&#xff0c;一台机器请求转发至多个服务器 1. 前后端分离项目&#xff0c;打通前后端项目 前端项目中的配置&#xff1a; 后端项目的ip和端口号就是正常的 …

verilog实现分频(奇数分频和偶数分频,通用版)

大家好&#xff0c;最近写了一些分频器的设计&#xff0c;发现奇数分频和偶数分频是比较常用分频效果&#xff0c;所以写了一个比较简单的分频代码&#xff0c;适用于奇数分频和偶数分频&#xff08;不考虑占空比&#xff09;&#xff0c;代码已经经过测试&#xff0c;需要可自…

微服务框架 SpringCloud微服务架构 5 Nacos 5.7 Nacos 与 Eureka 的对比

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.7 Nacos 与 Eureka 的对比5.7.1 Nacos 注册中心细节分析5.7.2 临…

基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 资本是保险公司经营的核心要素,是资产配置的重要约束条件。本文在马克维茨方法的基础上,将偿付能力引入了资产配置的优化模型。…

VH6501模板工程介绍(一)

VH6501硬件结构 1.式样 1.正向有5个灯&#xff0c;用来指示干扰的触发状态&#xff0c;干扰类型&#xff08;数字或模拟&#xff09;&#xff0c;通道通信以及设备状态。 2.两个DB9接口&#xff08;公头male和母头female&#xff09;&#xff0c;这是CAN或CANFD通道&#xff0…

(二)Java 线程

一、创建和运行线程 1. 方法一&#xff0c;直接使用 Thread Slf4j(topic "c.Test1") public class Demo {public static void main(String[] args) {Thread t new Thread(){Overridepublic void run() {log.debug("running");}};t.setName("t1&qu…

Casein-PEG-Indocyanine green 络蛋白-聚乙二醇-吲哚菁绿 Casein-ICG

产品名称&#xff1a;络蛋白-聚乙二醇-吲哚菁绿 英文名称&#xff1a;Casein-PEG-Indocyanine green 质量控制&#xff1a;95% 原料分散系数PDI&#xff1a;≤1.05 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;…

【免杀前置课——Windows编程】十三、事件与信号量——事件与互斥体区别、操纵信号量实现游戏多开访问控制(附代码)

事件 事件可以完全控制&#xff0c;其他无法控制线程的执行顺序&#xff0c;但是事件对象可以做到。 ***事件(Event&#xff09;***是在线程同步中最常使用的一种同步对象&#xff0c;事件包含一个使用计数&#xff0c;一个是用来表示自动重置/手动重置的布尔值&#xff0c;另…

[附源码]计算机毕业设计springboot高校后勤保障系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计springboot个性化名片网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL的索引与事务

目录 1.索引的本质 2.索引的使用 2.1查看索引 2.2创建索引 2.3删除索引 3.索引的数据结构 3.1B树 3.2B树 4.事务 4.1 事物的回滚(rollback) 4.2 事务的四大特性(ACID) 4.2.1 原子性 4.2.2 一致性 4.2.3 持久性 4.2.4 隔离性 5.并发引起的问题 5.1 "读脏数…

IDEA中debug启动报错Method breakpoints may dramatically slow down debugging

1.原因:是因为我们打断点太多了,可能在mapper或者service层打了断点导致启动失败 解决方案:1.去掉所有我们打的断点, 2.去掉mapper或者service中我们打的错误断点

学习swagger,使用正则改造项目, 生成接口文档

学习swagger&#xff0c;使用正则改造项目 关于SwaggerKnife4j生成统一接口文档教程请点击以下关于SwaggerKnife4j生成统一接口文档 1 关于构建swagger文档所需要的依赖和配置类 SwaggerKnife4j - 统一接口文档 我们以某一个项目的swagger升级改造为例。 2 如何使用正则表达…

Discourse 的左侧边栏可以修改吗

在默认的 Discourse 配置中&#xff0c;我们左侧的边栏可以根据自己的要求进行修改吗&#xff1f; 解决办法 针对自己登录的用户&#xff0c;你是可以自己调整左侧边栏的配置。 单击右上角你的个人头像&#xff0c;然后选择属性。 在切换的界面中&#xff0c;选择属性。 在出…

Postman内置动态参数和自定义的动态参数以及断言方式

一、问题&#xff1a;每次请求均需手动修改参数 解决方案&#xff1a;使用动态参数&#xff1a;内置动态参数/自定义动态参数&#xff0c;解决上述问题 二、Postman动态参数 1、内置动态参数&#xff0c;表现形式&#xff1a;{{$}} 2、常用的内置动态参数 {{$timestamp}} …

基于模糊小波神经网络的空中目标威胁评估(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在现代战争中, 随着信息化和智能化的飞速发展, 以及作战环境的日益复杂, 实时而准确地评估目标威胁, 不仅为空战决策提供科学的…