【SpringCloud】一文详谈Nacos

在这里插入图片描述

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》《项目实战》

🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、服务注册
  • 二、分级存储模型
    • 模拟服务实例集群
    • 同集群优先的负载均衡
    • 权重配置
    • 小结
  • 三、环境隔离
    • 创建namespace
    • 给微服务配置namespace
    • 小结
  • 四、Nacos与Eureka的区别
  • 五、Nacos配置管理
    • 统一配置管理
    • 配置热更新
    • 配置共享
    • 小结
  • 总结


前言

前面的文章讲诉过Eureka注册中心,现在让我们看看Nacos注册中心的魅力,为什么它更受欢迎。大家只需要跟着我的讲解走,并不需要自己也有相对应的案例代码。主要讲诉服务注册、分级存储模型、负载均衡、权重配置、环境隔离、Nacos配置管理等。


一、服务注册

假设项目结构:
– cloud-demo(父工程)
----- user-serviceii(查询用户服务)
----- order-service(查询订单服务,查询结果包含用户id)
order-server服务中会调用user-server服:订单服务中调用用户服务使得返回订单的同时也返回了用户信息。
这里需要知道,Nacos服务自带负载均衡,所以不需要想Eureka一样添加注解引入负载均衡。

cloud-demo父工程中添加spring-cloud-alibaba的管理依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在user-service和order-service的application.yml中添加nacos地址:

spring:cloud:nacos:server-addr: 192.168.198.140:8848 # Nacos 服务端地址

启动并测试:
在这里插入图片描述

二、分级存储模型

假设用户服务在上海、北京、杭州三个地方拥有服务器实例,这些同地区实例组成集群,所以每次调用用户服务就相当于去集群找服务实例:
在这里插入图片描述
这种情况,服务调用尽可能选择本地集群的服务,因为本地访问速度更快。跨集群调用延迟较高本地集群不可访问时,再去访问其它集群。

模拟服务实例集群

修改user-service的application.yml文件,添加集群配置:

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ # 集群名称

右键当前用户服务启动器,点击Copy Configuration:
在这里插入图片描述
在这里插入图片描述

按照此方法配置一个8083端口的集群为SH的服务、端口为8082的集群为HZ的服务。加上原本的用户服务总共三个服务。
重启服务,查看Nacos:
在这里插入图片描述
配置好后,我调用订单服务几次,根据控制台日志的打印,发现订单服务调用了用户集群为SH、HZ的服务,所以Nacos并不会实现根据同集群优先来实现负载均衡(主要是因为默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡)。

同集群优先的负载均衡

但是Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例

修改order-service的application.yml文件,修改负载均衡规则

userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

配置完毕后重启就实现了优先挑选同地区集群实例。

权重配置

实际部署中会出现这样的场景:

  • 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
  • 但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
  • 因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重
在这里插入图片描述
在弹出的编辑窗口,修改权重:
在这里插入图片描述

注意:如果权重修改为0,则该实例永远不会被访问。

小结

Nacos服务分级存储模型

  • 一级是服务,例如user-service
  • 二级是集群,例如杭州或上海
  • 三级是实例,例如杭州机房的某台部署了user-service的服务器实例

NacosRule负载均衡策略

  • 优先选择同集群服务实例列表
  • 本地集群找不到提供者,才去其它集群寻找,并且会报警告
  • 确定了可用实例列表后,再采用随机负载均衡挑选实例

实例的权重控制

  • Nacos控制台可以设置实例的权重值,0~1之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为0则完全不会被访问

三、环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:
在这里插入图片描述
我们可以点击页面新增按钮,添加一个namespace:
在这里插入图片描述
然后,填写表单:
在这里插入图片描述
就能在页面看到一个新的namespace:
在这里插入图片描述

给微服务配置namespace

给微服务配置namespace只能通过修改配置来实现。

例如,修改order-service的application.yml文件:

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

重启order-service后,访问控制台,可以看到下面的结果:
在这里插入图片描述
在这里插入图片描述
此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:
在这里插入图片描述

小结

Nacos环境隔离

  • 每个namespace都有唯一id
  • 服务设置namespace时要写id而不是名称
  • 不同namespace下的服务互相不可见

四、Nacos与Eureka的区别

Nacos的服务实例分为两种l类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例

在这里插入图片描述

异同

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

五、Nacos配置管理

统一配置管理

  • 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置
  • Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

在这里插入图片描述
在nacos中添加配置文件
在这里插入图片描述
然后在弹出的表单中,填写配置信息:
在这里插入图片描述
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

从微服务拉取配置
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会application.yml之前被读取,流程如下:
在这里插入图片描述
1)引入nacos-config依赖

首先,在user-service服务中,引入nacos-config的客户端依赖:

<!--nacos配置管理依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2)添加bootstrap.yaml

然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

spring:application:name: userservice # 服务名称profiles:active: dev #开发环境,这里是dev cloud:nacos:server-addr: localhost:8848 # Nacos地址config:file-extension: yaml # 文件后缀名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

本例中,就是去读取userservice-dev.yaml:

在这里插入图片描述
3)读取nacos配置

在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
在这里插入图片描述
在页面访问,可以看到效果:
在这里插入图片描述

配置热更新

我们最终的目的是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。要实现配置热更新,可以使用两种方式:

1)方式一
在@Value注入的变量所在类上添加注解@RefreshScope:
在这里插入图片描述
然后你将上面Nacos中的创建的统一管理配置中的日期格式修改为yyyy/MM/dd HH:mm:ss
不要重启服务,访问localhost:8081/user/now,发现返回格式变了,这就实现了热更新。

2)方式二
使用@ConfigurationProperties注解代替@Value注解。
在user-service服务中,添加一个类,读取patterrn.dateformat属性:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;
}

在UserController中使用这个类代替@Value:
在这里插入图片描述

配置共享

  • 其实微服务启动时,会去nacos读取多个配置文件,例如:
    • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
    • [spring.application.name].yaml,例如:userservice.yaml
  • 而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

1)添加一个环境共享配置
我们在nacos中添加一个userservice.yaml文件:
在这里插入图片描述
2)在user-service中读取共享配置
在user-service服务中,修改PatternProperties类,读取新添加的属性:
在这里插入图片描述
在user-service服务中,修改UserController,添加一个方法:
在这里插入图片描述
分析:
首先我在nacos中添加了一个共享配置,写了个接口返回服务读取前缀为pattern配置文件的内容。现在我的user-server服务profile是dev,所以我访问接口能够获取dataformat和envShareValue两个值。这里能获取dataformat,是因为我们在上面讲诉时在nacos创建了userserver-dev.yml统一配置文件,环境为dev。当我们修改profile为test,你再次访问接口会发现只能获取envShareValue的值,因为profile不是dev了,这也就说明[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

多服务共享配置优先级

在这里插入图片描述

小结

将配置交给Nacos管理的步骤

  • 在Nacos中添加配置文件
  • 在微服务中引入nacos的config依赖
  • 在微服务中添加bootstrapyml,配置nacos地址当前环境、服务名称、文件后缀名。这些决定了程序启动时去naces读取哪个文件

Nacos配置更改后,微服务可以实现热更新,方式:

  • 通过@Value注解注入,结合@RefreshScope来刷新
  • 通过@ConfigurationProperties注入,自动刷新
  • 不是所有的配置都适合放到配置中心,维护起来比较麻烦
  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

微服务会从nacos读取的配置文件:

  • [服务名]-[spring,profile.active].yaml,环境配置
  • [服务名].yaml,默认配置,多环境共享
  • 优先级:[服务名]-[环境].yaml > [服务名].yaml > 本地配置

微服务默认读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,默认配置
  • [服务名].yaml,多环境共享

不同微服务共享的配置文件

  • 通过shared-configs指定
  • 通过extension-configs指定
  • 优先级:环境配置 > 服务名.yaml>extension-config > extension-configs > shared-configs >本地配置

总结

以上就是Nacos的全部讲解。

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

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

相关文章

Linux之用户账号、用户组和与账号有关的系统文件

目录 一、基本介绍 1.用户和用户组 2.UID和GID 二、 账户管理 1.查看用户的UID和GID 2.添加账户 3.删除账号 4.修改账号 5.账户口令 三、分组管理 1.新增用户组 2.删除用户组 3.修改用户组 4.用户组切换 四、与账号有关的系统文件 1./etc/passwd 2./etc/shado…

李宏毅深度强化学习导论——当奖励是稀疏的

引言 这是李宏毅强化学习的笔记&#xff0c;主要介绍如何处理稀疏奖励问题。 稀疏奖励 当我们拿Actor和环境互动后可以得到很多奖励&#xff0c;整理之后可以得到分数 A A A&#xff0c;然后可以训练Actor。 但RL中有时会出现多数情况下奖励为零&#xff0c;此时我们不知道动…

行存储与列存储:大数据存储方案的选择与优缺点分析

随着大数据时代的来临&#xff0c;数据的规模和复杂性呈指数级增长&#xff0c;传统的关系数据库已经不再适应这一巨大的存储量和计算要求。在大数据存储领域&#xff0c;行存储和列存储成为两种备受关注的存储方案。本文将探讨行存储和列存储的定义、优缺点&#xff0c;并结合…

第十四届省赛大学B组(C/C++)岛屿个数

目录 题目链接&#xff1a;岛屿个数 解题思路&#xff1a; AC代码&#xff08;BFSDFS&#xff09;&#xff1a; 题目链接&#xff1a;岛屿个数 小蓝得到了一副大小为 MN 的格子地图&#xff0c;可以将其视作一个只包含字符 0&#xff08;代表海水&#xff09;和 1&#xff0…

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;看提示主要是栈和树。这题其实不是二叉树的遍历题&#xff0c;而是检验二叉树基础知识的题&#xff0c;也许有些难想。第一种解法是&#xff1a;把有效的叶子节点使用…

【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

与一般的Dataloader的区别在于我们对图像进行了随机裁剪&#xff0c;需要进行额外的操作才能将其打包到dataloader里面 这一段的代码如下&#xff1a; if args.distributed:sampler_train DistributedSampler(dataset_train)sampler_val DistributedSampler(dataset_val, shu…

Python 自学(九) 之异常处理,文件及目录操作

目录 1. try ... except ... else ... finally 排列 P231 2. write, read, seek, readline, readlines 基本文件操作 P245 3. os模块 基本目录操作 P249 4. os.path 模块 复杂目录操作 P250 5. os 模块 高…

Spring之循环依赖

什么是循环依赖? 依赖的相互引用,如下列的这种形式 Component public class A {Autowiredprivate B b;}Component public class B {Autowiredprivate A a; } Spring是如何解决循环依赖的 Spring是通过三级缓存来解决循环依赖 singletonObjects : 单例bean,已经实例化,完成…

牛客2024年愚人节比赛(A-K)

比赛链接 毕竟是娱乐场&#xff0c;放平心态打吧。。。 只有A一个考了数学期望&#xff0c;其他的基本都是acmer特有的脑筋急转弯&#xff0c;看个乐呵即可。 A 我是欧皇&#xff0c;赚到盆满钵满&#xff01; 思路&#xff1a; 我们有 p 1 p_1 p1​ 的概率直接拿到一件实…

Redis改造原始代码

基础篇Redis 5.2.2.改造原始代码 代码说明: 1.在我们完成了使用工厂设计模式来完成代码的编写之后&#xff0c;我们在获得连接时&#xff0c;就可以通过工厂来获得。 &#xff0c;而不用直接去new对象&#xff0c;降低耦合&#xff0c;并且使用的还是连接池对象。 2.当我们…

FreeROST作业day2

1.总结串口的发送和接收功能使用到的函数 串口发送数据函数&#xff1a; HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); UART_Handle…

【LeetCode】热题100:排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] …

linux进程fork函数的讲解。

通过指令,查看接口的详细信息 man forkOn success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately. 这里的返回值的意…

FPGA设计_加法器

文章目录 前言补充&#xff1a;各种门电路符号一、半加器二、全加器三、串行进位加法器3.1、verilog代码设计 四、超前进位加法器4.1、verilog代码设计 五、进位链CARRY4 前言 在之前一篇介绍7系列FPGA底层资源的时候&#xff0c;我们提到过每一个slice当中有一个CARRY4&#…

玫瑰图和雷达图(自备)

目录 玫瑰图 数据格式 绘图基础 绘图升级&#xff08;文本调整&#xff09; 玫瑰图 下载数据data/2020/2020-11-24 mirrors_rfordatascience/tidytuesday - 码云 - 开源中国 (gitee.com) R语言绘图—南丁格尔玫瑰图 - 知乎 (zhihu.com) 数据格式 rm(list ls()) libr…

2024年新算法-冠豪猪优化算法(CPO),CPO-RF-Adaboost,CPO优化随机森林RF-Adaboost回归预测-附代码

冠豪猪优化算法&#xff08;CPO&#xff09;是一种基于自然界中猪群觅食行为启发的优化算法。该算法模拟了猪群在寻找食物时的集群行为&#xff0c;通过一系列的迭代过程来优化目标函数&#xff0c;以寻找最优解。在这个算法中&#xff0c;猪被分为几个群体&#xff0c;每个群体…

CA根证书——https安全保障的基石

HTTPS通信中&#xff0c;服务器端使用数字证书来证明自己的身份。客户端需要验证服务器发送的证书的真实性。这就需要一个可信的第三方机构&#xff0c;即CA&#xff0c;来颁发和管理证书。CA根证书是证书颁发机构层次结构的顶级证书&#xff0c;客户端信任的所有证书都可以追溯…

python实现泊松回归

1 什么是基于计数的数据&#xff1f; 基于计数的数据包含以特定速率发生的事件。发生率可能会随着时间的推移或从一次观察到下一次观察而发生变化。以下是基于计数的数据的一些示例&#xff1a; 每小时穿过十字路口的车辆数量每月去看医生的人数每月发现的类地行星数量 计数数…

行车记录打不开?别慌,数据恢复有高招!

行车记录打不开&#xff0c;这恐怕是许多车主都曾经遭遇过的烦恼。在驾驶途中&#xff0c;行车记录仪本应是记录美好瞬间、保障行车安全的重要工具&#xff0c;但一旦它出现打不开的情况&#xff0c;所有的期待与信赖便瞬间化为乌有。面对这种情况&#xff0c;我们该如何应对&a…

web学习笔记(五十一)

目录 1. post请求和get请求的区别 2. CORS 跨域资源共享 2.1 什么是同源 2.2 什么是同源策略 2.3 如何实现跨域资源共享 2.4 使用 cors 中间件解决跨域问题 2.5 JSONP 接口 2.6 实现 JSONP 接口的步骤 1. post请求和get请求的区别 传参方式不同&#xff1a;get请求参数…