从零开始 Spring Cloud 4:Nacos

news2025/2/5 11:55:24

从零开始 Spring Cloud 4:Nacos

image-20230714102655393

图源:laiketui.com

Nacos 是 Alibaba 研发的用于 Spring Cloud Alibaba 的服务注册中心组件,符合 Spring Cloud 官方标准,同样被 Spring Cloud 官方接纳,所以我们可以在 Spring Cloud 中用 Nacos 替换 Eureka 作为服务注册中心。

本文将演示如何用 Nacos 作为注册中心。

本文的示例项目基于上篇文章。

基础

安装 & 启动

Nacos 服务端的安装和启动可以参考这篇文章。

本篇文章使用的 Nacos 版本是1.4.1。

依赖

在根项目中添加 Spring Cloud Alibaba 相关依赖:

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

在子模块中删除 Eureka 相关依赖,并添加 Nacos 客户端相关依赖:

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

配置文件

在子模块的配置文件中添加 Nacos 服务端地址:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

因为这里使用了一个低版本的 Nacos,其负载均衡使用的是 Ribbon 而非上文介绍的 LoadBalancer,它们定制负载均衡策略的方式略有不同,所以这里可能还需要删除@LoadBalancerClient注解,否则会导致应用启动失败。

启动2个子模块(Eureka 除外)的3个实例,此时在 Nacos 控制面板就能看到注册的服务信息:

image-20230716145149721

测试

对接口 localhost:8080/order/101 进行请求,就能观察到两个 shopping-user 服务实例轮流接受请求并返回数据,所以 Ribbon 同样默认使用轮询策略。

集群

Nacos 中,服务按照集群来进行组织,这可以用以下的图进行表示:

image-20210713232522531

如果服务没有特别设置,默认会分配到 DEFAULT 集群:

image-20230716152456417

下面我们看如何设置服务所在的集群。

设置

在子模块 shopping-usershopping-order 配置文件中添加以下内容:

spring:
  cloud:
    nacos:
      discovery:
        cluster-name: HZ # 集群名称

这样产生的3个实例都会被分配到 HZ 这个集群。

集群名称可以随意填写,这里用 HZ 代表杭州,BJ代表北京,表示两个异地机房。

重启3个服务实例,再次进入 Nacos 控制面板的服务详情,就能看到这3个服务实例都归属于 HZ 这个集群。

为了进行对比,这里再添加一个 shopping-user 实例,并分配到 BJ 集群。

image-20230716153906282

Nacos 控制面板中应该会出现一个新的实例,并属于 BJ 集群。

Nacos 策略

集群是为了能够按地域和网络划分服务实例,以便服务实例能够“就近”访问接口,比如理想情况下 HZ的 shopping-order 就应该访问 HZ的 shopping-user 的接口,只有在集群内的服务都挂掉的情况下才会跨集群访问。

但默认的情况下并非如此,实际访问 localhost:8080/order/101 就能发现,依然会有几率出现 HZ 集群的 shopping-order 访问 BJ 集群的 shopping-user 实例的情况出现,这是因为此时我们使用的依然是 Ribbon 默认的轮询策略。

要实现我们希望的“优先访问本集群内的服务”这个效果,需要让 Ribbon 使用 Nacos 策略。

修改子模块 shopping-order 的配置文件,添加以下配置:

shopping-user: #服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

这个配置可以让子模块 shopping-order 的负载均衡策略变成NacosRule

重启子模块 shopping-order

现在再访问 localhost:8080/order/101 就不会再出现跨集群访问的情况。

如果我们关闭 HZ 集群的两个 shopping-user 实例,再次访问就能看到进行了跨集群调用,并且 shopping-order 实例的控制台输出以下警告信息:

07-16 15:54:20:987  WARN 32960 --- [nio-8080-exec-4] c.alibaba.cloud.nacos.ribbon.NacosRule   : A cross-cluster call occurs,name = shopping-user, clusterName = HZ, instance = [Instance{instanceId='192.168.0.46#8083#BJ#DEFAULT_GROUP@@shopping-user', ip='192.168.0.46', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='BJ', serviceName='DEFAULT_GROUP@@shopping-user', metadata={preserved.register.source=SPRING_CLOUD}}]

这里的 A cross-cluster call occurs 说明了一次跨集群调用已经发生,言下之意是我们需要检查同集群下的服务是否挂掉了,可能需要重启服务。

实际上 Nacos 策略的具体内容是:优先在本集群内用乱序策略访问服务,本集群内服务都不可用时,跨集群访问。

权重

可以用权重控制同一个集群下的同一个服务的不同实例的访问优先级。

默认情况下服务实例的权重都是 1:

image-20230716160755510

权重的可选值是0~1之间。可以通过编辑修改权重:

image-20230716160950417

这里将 8081 端口的实例权重修改为 0.1,为 8082 端口权重的 1/10,现在对接口 localhost:8080/order/101 进行多次访问,可以看到即使访问了20多次,8081 端口的实例也只会发生2次接口调用,概率大约是后者的1/10。

特别的是,如果将权重修改为0,那么服务将不再会被访问。

环境隔离

Nacos提供了namespace来实现环境隔离功能。

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

image-20210714000101516

默认情况下,Nacos 会存在一个 public 命名空间:

image-20230716163836775

服务默认都在 public 命名空间中:

image-20230716164000555

可以添加新的命名空间:

image-20230716164106626

命名空间 ID 需要在 Nacos 中唯一,新建的时候可以不填,Nacos 会生成一个 UUID 作为 ID:

image-20230716164242760

在子模块 shopping-order 配置中添加:

spring:
  cloud:
    nacos:
      discovery:
        namespace: fbb59711-b6c7-4cd0-b796-c497f0608c77

重启服务后就能在 Nacos 控制面板中看到 shopping-order 这个服务已经归属到 dev 这个命名空间下了。

现在访问接口 localhost:8080/order/101 就会报错:

No instances available for shopping-user

因为此时 shopping-ordershopping-user 分属不同命名空间,是不可见的,不能互相访问。

可以利用这点对不同开发环境的接口进行隔离。

非临时实例

Nacos 的服务实例分为临时实例与非临时实例,默认是临时实例。

它们的区别是:

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

此外,临时实例仅通过30秒一次的心跳检测向 Nacos 上报状况,而非临时实例则由 Nacos 主动发起请求进行检测状态,健康状态监测的时效性要更好,但同样也更消耗 Nacos 服务器的资源。

可以通过以下配置将服务实例修改为非临时实例:

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

与 Eureka 的区别

Nacos 和服务消费者、提供者的关系可以用下图表示:

image-20210714001728017

Nacos与eureka的共同点

  • 都支持服务注册和服务拉取
  • 都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别

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

The End,谢谢阅读。

本文的完整实例可以从这里获取。

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

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

相关文章

FPGA XDMA 中断模式实现 PCIE3.0 测速试验 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xf…

同步和异步的区别

同步&#xff0c;可以理解为在执行完一个函数或方法之后&#xff0c;一直等待系统返回值或消息&#xff0c;这时程序是处于阻塞的&#xff0c;只有接收到返回的值或消息后才往下执行其他的命令&#xff1b; 异步&#xff0c;执行完函数或方法后&#xff0c;不必阻塞性地等待返回…

缓存服务使用总结

1、介绍 分布式缓存方案缓存服务搭建 2、分布式缓存方案&#xff08;重点掌握&#xff09; 2.1、什么是缓存 通常将数据从数据库中同步一份到内存中&#xff0c;客户端直接从内存中查询数据&#xff0c;减少了和数据库的交互次数&#xff0c;提高查询性能&#xff08;因为内…

什么是 WebSocket?Java 中如何实现 WebSocket?

什么是 WebSocket&#xff1f;Java 中如何实现 WebSocket&#xff1f; WebSocket 简介 WebSocket 是一种新型的网络协议&#xff0c;它允许客户端和服务器之间进行双向通信&#xff0c;可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的&#xff0c;使用标准的 TCP 连…

java项目之(超市管理系统ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的超市管理系统。技术交流和部署相关看文章末尾&#xff01; 目录 开发环境&#xff1a; 后端&#xff1a; 前端&#xff1a; 数据库&…

【MySQL系列】深入学习数据类型

「前言」文章内容大致是数据库的数据类型。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、数据类型分类二、数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float类型2.3.2 decimal类型 2.4 字符串类型2.4.1 char类型2.4.2 varchar类型2.4.3 …

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

如何快速又高质量的输出PDF实验报告?

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到&#xff0c;最为常见的就是实验室信息管理…

rockchip linux Vendor storage 及SN添加

前言 在产品开发过程中,最后都会为产品编辑一个产品编号方便于管理和维护,而SN(Series Number)就是用于产品的生产编号。但是在linux中,并没有专门管理串码的驱动。 Vendor storage 是rockchip 被设计用来存储 SN,MAC,LAN,BT 等 vendor data。特征如下: 唯一的访问…

一些有意思的SCI

Gardner J K, Knopoff L. Is the sequence of earthquakes in Southern California, with aftershocks removed, Poissonian?[J]. Bulletin of the seismological society of America, 1974, 64(5): 1363-1367. [原文] 该论文的abstract只有一个单词&#xff1a;Yes。 目前该论…

MySQL索引使用原则,什么是覆盖索引、索引下堆、离散度……这些概念你弄明白了吗

文章目录 一、索引失效的场景二、列的离散度三、联合索引最左匹配1、什么时候用联合索引2、什么是覆盖索引 四、索引条件下推&#xff08;ICP&#xff09; 一、索引失效的场景 MySQL索引失效的场景&#xff0c;什么情况下会造成MySQL索引失效 二、列的离散度 什么是列的离散…

【Nacos】实战之配置中心加载多个配置文件

目录 复习未拆分前的yaml文件拆分配置文件dataSource.yamlmybatis.yamlother.yaml 微服务同时加载多个远程配置文件修改配置文件 复习 导入依赖在子模块里面创建 bootstrap.yaml 文件bootstrap.yaml 文件 添加需要的远程配置信息开始拆分以前的配置信息 未拆分前的yaml文件 拆…

服务器数据库被360后缀勒索病毒攻击怎么解决,勒索病毒解密

随着网络攻击日益猖獗&#xff0c;数据库遭遇勒索病毒的攻击已成为常见现象。而360后缀勒索病毒是一种恶意软件&#xff0c;它将加密数据库中的文件&#xff0c;并要求受害者支付赎金才能获得解密密钥。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器被360后…

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

文章目录 前言1. 电路原理图理解1.1 LED与KEY原理图理解1.2 BEEP蜂鸣器 2. 外部中断配置阐述3. STM32CubeMX配置4. 代码编写4.1 代码编写思路4.2 重写回调函数 TIPS总结 前言 这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关&#xff1b;本文从原理图开始到最后实…

工作日记20230714

1、报文id定义对&#xff0c;类库中和tracking中的报文长度定义一致&#xff0c;但是和一级那边的报文长度定义不一致&#xff0c;对方有可能会收到报文&#xff0c;但是发送方在发出数据后程序会自动中止。 2、结构体 如果定义结构体List的话&#xff0c;不用在()加初始值&a…

分享一下使用finalshell连接虚拟机失败的经历

今天在使用finalshell连接安装的Ubuntu的时候遇到了一点问题&#xff0c;通过root用户连接的时候一直连接失败。 然后照着网上的解决方式一个个试 一、安装oppenssh -server sudo apt-get install openssh-server 然后重启ssh sudo service ssh restart 二、设置密码 最后发…

【架构设计】谈谈防腐层的妙用

文章目录 前言一、一个简单的例子二、防腐层介绍总结 前言 最近在学习了解领域驱动模型DDD相关的内容&#xff0c;但是由于没有实际的项目支撑&#xff0c;所以大都是停留在一些理论层面。我发现这里面的一些设计思想还是非常有实用价值的&#xff0c;可以直接应用于你目前的项…

基于ssm+mybatis+mysql+jsp机票预定系统

基于ssmmybatismysqljsp机票预定系统 一、系统介绍二、功能展示1.主页2.个人中心3.用户管理(管理员)4.客机管理&#xff08;管理员&#xff09;5.航班管理&#xff08;管理员&#xff09;6.机票管理&#xff08;管理员&#xff09; 三、其它系统四、获取源码 一、系统介绍 系统…

nacos设置服务权重

nacos设置服务权重

飞行动力学 - 第8节-着陆性能 之 基础点摘要

飞行动力学 - 第8节-着陆性能 之 基础点摘要 1. 着陆性能1.1 空中直线段S11.2 拉平段S21.3 地面滑跑段S3 2. 着陆性能改善方法3. 起飞性能列举4. 参考资料 1. 着陆性能 总体距离S S1 S2 S3&#xff0c;越短性能越佳。 1.1 空中直线段S1 1.2 拉平段S2 1.3 地面滑跑段S3 2. 着…