【微服务 Spring Cloud Alibaba】- Nacos 服务注册中心

目录

1. 什么是注册中心?

1.2 注册中心的作用

2. SpringBoot 整合 Nacos 实现服务注册中心

2.1 将服务注册到 Nacos

2.2 实现消费者

3. 服务列表各个参数的含义、作用以及应用场景


1. 什么是注册中心?

注册中心是微服务架构中的一个重要组件,它用于实现服务注册服务发现

【思考一】什么叫服务注册 ? 什么叫服务发现 ?

  • 服务注册就是生产者,它是服务的提供方,它用于将服务存储起来;
  • 服务发现是注册中心将服务列表推送给调用服务的消费者 / 消费者向注册中心拉取服务列表;

Nacos 结合了两者的优势,提供了一个更加灵活和高效的服务发现机制。在默认情况下,Nacos 使用推模式来通知消费者,但消费者仍然会定期拉取服务列表,以应对可能出现的消息丢失或延迟等问题。

【思考二】为什么需要服务注册和服务发现呢 ?服务之间直接调用存在什么问题呢 ?

① 服务注册与服务发现是为了更好的实现服务与服务之间的通信,降低服务与服务间的耦合度(健康检测机制)

② 服务之间直接调用存在的问题:

  1. 每个服务都可能有很多份,那我在调用的时候,就需要写很多份,而且需要一个一个手动分配,工作量太大;
  2. 微服务里边,服务起码得是集群B1,B2,B3......,如果直接写死,当某一天,某些服务挂了,就会引发一系列问题,从而就无法保证系统的高可用。

具体有以下几个问题:

  1. 单点故障:因为调用方直接依赖于特定的服务实例,所以当这个实例不可用时,调用方无法找到其他的可用实例,从而导致整个调用链路中断。

  2. 延迟与超时:当一个服务不可用,调用方可能会因为网络超时而等待很长时间,这会导致用户体验下降,并可能引发其他的连锁故障。

  3. 无法进行负载均衡:如果多个实例都可用,但调用方总是直接调用某一个特定实例,那么这将导致流量分布不均,某些实例可能会过载,而其他实例则处于空闲状态。

  4. 无法进行故障转移:当目标服务实例出现故障时,调用方无法自动切换到其他健康的实例。

  5. 扩展性受限:如果服务需要进行扩展,增加新的实例,调用方可能需要修改代码或配置来适应新的服务地址,这增加了运维的复杂性。

  6. 不透明的依赖关系:如果所有的服务都是直接相互调用,那么很难快速地了解服务之间的依赖关系,这在故障排查时可能会增加很多麻烦。

基于以上问题,所以我们需要使用服务注册于服务发现来更好的实现服务与服务之间的通信!

1.2 注册中心的作用

  • 服务注册:服务实例启动时,将自身注册到注册中心,包括服务名,地址,端口等;
  • 服务发现:消费者向注册中心拉取服务列表 / 注册中心推送服务列表给消费者;
  • 服务健康检测:注册中心会定期检测服务实例的健康状态,并过滤不健康的实例;
  • 服务路由:决定如何将请求分发到合适的服务实例,通常涉及到负载均衡策略;
  • 服务监控:监控服务的状态,如响应时间、错误率等,以便及时发现并处理问题;
  • 服务更新:当服务实例信息变更时,向注册中心发送更新信息通知。

2. SpringBoot 整合 Nacos 实现服务注册中心

2.1 将服务注册到 Nacos

实现之前,Nacos 服务要启动起来,创建好 SpringBoot 多模块项目(一个父模块和两个子模块)

如果不会创建 SpringBoot 多模块项目的,可以去看我的这篇文章:https://blog.csdn.net/xaiobit_hl/article/details/134144828

【实现步骤】

  1. 添加 Nacos discovery 支持 
  2. 配置 Nacos 连接信息
  3. 编写代码(开发接口)

PS:完成以上三步后,当前项目就会自动注册到 Nacos 中!

② Nacos 连接信息

spring:application:name: nacos-discovery-demo# Nacos 服务名 (命名不要使用下划线 _,早期的SpringCloud版本不支持)cloud:nacos:discovery:server-addr: localhost:8848  # 连哪个 Nacos 的注册中心username: nacospassword: nacos# ephemeral: false   # false 设置此服务为永久实例,true 为临时实例
server:port: 0  # 动态端口号

③ 实现接口

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext context; // 用于获取动态端口号// 服务@RequestMapping("/getnamebyid")public String getNameById(Integer id) {return "provider-name-" + id +" | port:" + context.getWebServer().getPort();}
}

PS:接口的实现不重要,重要的是我们能把它注册到注册中心,然后能通过另一个项目,调用到它!

【思考】为什么服务注册到注册中心,需要使用动态端口? 而不使用固定端口?

        只有当用户去使用 Nacos 的时候,才需要使用一个固定的端口号,它不能每次变化,每次变的话,用户就猜不出来这个端口号是多少。

        而对于微服务这边,它只需要将服务注册到注册中心,供消费者来使用,具体端口号是多少,对于程序来说,它不必预先知道。

并且使用动态端口有以下好处:

  1. 灵活性:动态端口允许服务在任何可用的端口上启动,避免了手动配置端口或处理端口冲突的问题。

  2. 高可用性:如果某个端口不可用(被其他进程占用或由于某些原因被阻止),服务可以选择其他任何可用的端口来启动,这增加了服务的高可用性。

  3. 简化配置:不需要为每个服务的实例手动分配和管理固定的端口号。

  4. 支持多实例:动态端口允许在同一台机器上运行多个相同的服务实例,这对于快速扩展和负载均衡很有利。

【测试服务注册中心】

当我们将服务注册到注册中心后,就可以在 Nacos  控制台看到这些信息了:

 

这个时候,我们就可以测试一下微服务里边的接口好不好使,点击操作下面的详情:

我们拿着 IP + 动态端口去访问接口,是可以正常访问得到的:

 【上线下线 Nacos 服务的作用】

        服务的上线与下线通常是指服务实例的动态注册与注销,利用这一特性,可以实现以下几种发布策略:

  1. 灰度发布:灰度发布是指先让部分用户试用新版本,而其它用户还在使用旧版本。通过Nacos,可以将新版本的服务实例注册到Nacos中,然后通过权重配置,让部分用户路由到新的服务实例上。(也可以通过标签配合 geteway 网关规则)

  2. 蓝绿部署:蓝绿部署是一种将新旧版本同时部署的策略,通过路由控制用户流量到不同的版本。通过Nacos的服务注册与发现,可以轻松地实现蓝绿部署:新版本(绿色)可以注册到Nacos,当确认新版本稳定后,可以将流量切换到新版本,同时下线旧版本(蓝色)。

  3. 金丝雀发布:金丝雀发布是灰度发布的一种,它先将新版本发布给一小部分用户,然后根据这部分用户的反馈和系统的表现,决定是否将新版本推广给更多的用户。利用Nacos的权重配置,可以轻松地实现金丝雀发布。

  4. 紧急回滚:如果新版本出现问题,就可以快速地在Nacos中下线新版本的服务实例,同时上线旧版本的服务实例,以此来实现紧急回滚。

PS:当服务被下线时,注册中心在公布服务列表的时候,就不会包含已经下线的服务了,即使它是健康状态。

【点击上线或下线报错问题】

        当点击上线下线如果报错了,或者创建临时实例 / 永久实例,报错了,可以通过以下方法来解决:

① 停止 Nacos 服务 (Ctrl  C 多按几遍)

② 删除 nacos/data 目录下的 protocol 文件夹 (非常好使)

③ 开启 Nacos 服务,再次点击上下线就不会报错了

2.2 实现消费者

【前置工作】

1. 创建一个消费者的 module,在 pom.xml 文件中声明父节点

<parent><groupId>com.example</groupId><artifactId>nacos-discovery-demo</artifactId><version>0.0.1-SNAPSHOT</version>
</parent>

2. 删除不必要的依赖:test,nacos-discovery,java.version 等声明,以及 dependencyManagement 依赖。

3. 在父模块中声明子模块

<modules><module>provider</module><module>consumer</module>
</modules>

【实现步骤】

  1. 添加框架支持 【nacos discovery、spring cloud LoadBalancer、spring cloud OpenFeign】
  2. 配置 Nacos 连接信息
  3. 开启 OpenFeign 功能
  4. 声明 OpenFeign 式的 Service 【生产者的的服务】
  5. 调用服务【调用生产者的服务】

② 配置 Nacos 连信息

spring:application:name: nacos-consumer-democloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-enabled: false  #消费者(不需要将此服务注册到 nacos)server:port: 8080  # 使用固定端口

③ 开启 OpenFeign 功能

@SpringBootApplication
@EnableFeignClients   // 开启 OpenFeign
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

PS:在启动类上加上 @EnableFeignClients  注解!

④ 声明 OpenFeign 式的 Service

@Service
@FeignClient("nacos-discovery-demo") //调用nacos中的nacos-discovery-demo服务
public interface UserService {@RequestMapping("/user/getnamebyid")  // 调用生产者的接口public String getNameById(@RequestParam("id") Integer id); //@RequestParam
}

方法中的参数最好添加 @RequestParam 注解,否则可能拿不到参数。

⑤ 调用服务

@RestController // 消费者
public class BusinessController {@Autowiredprivate UserService userService;@RequestMapping("/getnamebyid")public String getNameById(Integer id) {return userService.getNameById(id);}
}

 【测试消费者】

开启两个生产者和一个消费者(测试负载均衡默认的轮询方式)

根据配置信息,使用 localhost:8080/getnamebyid?id=2 进行访问>>

第一次访问:

 

刷新后:(轮询的方式)

3. 服务列表各个参数的含义、作用以及应用场景

1. 服务名:服务的唯一标识符,用于区分不同的服务,对应我们配置文件写的 spring.application.name.

2. 分组名称:服务的分组标识,用于将服务进行逻辑隔离的。我们可以根据不同的环境或用途为服务设置不同的分组,例如“测试组”、“开发组”、“生产组”等。这样的隔离机制有助于管理和维护服务。

3. 集群数目:在一个服务内,可以有多个集群,每个集群下有多个服务实例。

4. 实例数:当前服务注册到Nacos的总实例数量,包括健康和不健康的实例。

5. 健康实力数:可以正常提供服务,没有故障的实例。

6. 触发保护阈值:它是一个 0-1 之间的数,表示当健康实例数低于此阈值时,Nacos会阻止所有服务实例的自动注销,以保护剩余的健康实例。(可以在服务详情里面的编辑服务中进行设置)

为什么要有保护阈值 ?

        它是为了防止服务雪崩的。比如说服务集群里边原本有 1000 个实例,但是现在有 999 个实例都挂了,只剩下一个实例了,那么原本 1000 个人干的活,现在就只剩一个人了,如果我们再把所有的活再派给这一个人来干,那么这个人他肯定也不在了,他肯定离职了。对于咱们系统来说也是一样,如果集群实例数太少的话,这时候还把所有的流量分发过去,那就会造成服务瘫痪,进而造成上游调用这个服务的整体瘫痪,进而造成服务雪崩。所以需要保护阈值。

保护阈值它是如何防止服务雪崩的 ?

        想要解决服务雪崩,无非就是加锁排队,但是 Nacos 它本身又不做限流,只有注册中心和配置中心,那它是怎么做到既没有限流功能,又要保证不会发生雪崩问题的呢?它的做法是 "躺平",当保护阈值为 true 的时候,它会将所有的请求分发给所有的服务实例(不管健康与否),即使有些服务实例已经挂掉了,以此来保护所剩无几的健康实例!

【保护阈值演示案例】

① 准备两个永久服务实例,一个消费者,然后停掉一个服务

如何快速创建相同实例 >>

  

PS:永久实例 - 对应配置文件中的 ephemeral: false

② 将保护阈值设置为 0.5,这时保护阈值就变为 true 了

③ 使用消费者调用服务

例如:localhost:8080/getnamebyid?id=2

        当我们更改了权重,阈值等参数,它默认是会有缓存的,感知不到,所以需要重启消费者才能看到 nacos 的防止雪崩的策略。

重启消费者后 >>

第一次访问:

第二次访问:

PS:第三次访问和第一次访问一样,第四次访问又报错,这就是 Nacos 的一个解决服务雪崩的手段!

【服务详情中的一些参数的含义】

1. 元数据:与服务相关的额外信息,可以是键值对形式的任意数据。(它会自动设置进去)

2. 服务路由类型:用于指定如何在消费者和成产者之间进行路由决策的,它可以实现请求的负载均衡。

PS:服务路由类型最主要的作用就是实现 CMDB,地域就近访问的,什么叫地域就近访问

        当有北京的调用者来获取服务的时候,他肯定是调用北京的服务是最快的,因为对于北京的调用者来说,北京的网络,路由调的次数肯定比深圳少,所以它的速度肯定快,那么深圳的调用者肯定是调用深圳的服务最快,这就是地域就近访问。

3. 权重:实例级别的设置。范围为 0-10000,用于负载均衡决策,权重越大,分配给该实例的流量越大。当权重为 0 的时候,和点击下线功能是一样的效果。

Nacos 的负载均衡策略总的来说有两种方式:

① 基于健康检测和权重

② 基于第三方 CMDB 的标签负载均衡器

这在官方的 《Nacos架构与原理》一书中原话是这样说的:

在 Nacos 0.7.0 版本中,我们除了提供基于健康检查和权重的负载均衡方式外,
还新提供了基于第三方 CMDB 的标签负载均衡器

🍁临时实例 VS 永久实例

① 定义和删除方式不同

1. 永久实例:其注册信息会一直保留在 Nacos 服务器上,直到主动注销或被删除。这就意味着即使服务实例下线,或者不健康了,他的注册信息仍然会保留在 Nacos 上。

2. 临时实例:其注册信息在服务实例下线,断开连接或者不健康时,会自动从服务注册列表中被删除。

如何删除永久实例:1.停服务;2. 删除 nacos/data 目录下的 protocol 文件夹;3. 启动 nacos 服务

② 健康检测机制不同

1. 永久实例:服务器反向探测机制,服务器主动来询问永久实例的健康与否。

2. 临时实例:客户端主动上报机制,客户端主动向服务器汇报自己的健康与否。

PS:临时实例每隔 5 秒就会主动上报一次自己的健康状态,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果 Nacos 服务端在 15 秒都没收到心跳,就会将实例设置为不健康,在 30 秒没收到心跳时就会将这个临时实例摘除。

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

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

相关文章

数模竞赛那么累,究竟能给我带来什么?

国赛官网上有这么一句话&#xff1a;一次参赛&#xff0c;终生受益。 学生时代&#xff0c;我对这句话没啥感触。 因为刚开始学数模时感觉很没头绪&#xff0c;书也看不懂&#xff0c;论文也看不懂&#xff0c;看啥都看不懂。 比赛时题目看不懂&#xff0c;答案搜不到&#xf…

数据资产入表来了!企业如何构建数据资产

背景 2023年8月21日&#xff0c;财政部会计司公布《企业数据资源相关会计处理暂行规定》&#xff08;财会〔2023〕11号&#xff09;&#xff08;以下简称“《暂定规定》”&#xff09;&#xff0c;“数据资产入表”正式来了&#xff0c;为企业构建数据资产体系吹响号角&#x…

【接口测试】目前市面上流行的接口大多有哪几种协议的接口?

首先&#xff0c;关于协议这个词&#xff0c;你要清楚。 接口测试它是基于什么进行测试的&#xff0c;接口测试是什么测试类型&#xff0c;其实有有时候问到一个问题&#xff0c;关联性很强。很多关联性的问题你都可以去考虑。 首先接口测试一个功能黑盒测试&后端&#x…

go-gin-vue3-elementPlus带参手动上传文件

文章目录 一. 总体代码流程1.1 全局Axios部分样例1.2 上传业务 二. 后端部分三. 测试样例 go的mvc层使用gin框架. 总的来说gin的formFile封装的不如springboot的好.获取值有很多的坑. 当然使用axios的formData也有不少坑.现给出较好的解决办法 以下部分仅贴出关键代码 一. 总…

5分+肿瘤预后模型生信分析如何做?单细胞分析+干湿结合

今天给同学们分享一篇单细胞分析干湿结合的生信文章“Tumor-associated endothelial cell prognostic risk model and tumor immune environment modulation in liver cancer based on single-cell and bulk RNA sequencing: Experimental verification”&#xff0c;这篇文章于…

企业通过ISO/IEC 27001的必要性阐述

文章目录 什么是ISO 27001?ISO 27001认证的必要性1&#xff0c;保护信息资产2&#xff0c;合规性要求3&#xff0c;提高客户信任4&#xff0c;降低安全风险5&#xff0c;提高内部效率6&#xff0c;改进供应链安全7&#xff0c;提高员工意识8&#xff0c;连续改进 推荐阅读 什么…

【Unity】Addressables资源管理笔记

【Unity】Addressables资源管理笔记 Addressables是一种用于管理资源的系统。允许以一种灵活的方式加载、卸载和管理资源&#xff0c;无论是场景、预制件、材质、纹理、音频剪辑等。 一、快速实现 安装Addressables插件 把对象添加到组 1&#xff09;打开AddressablesGroups面…

GB28181协议如何注册

前言 GB28181协议是视频监控领域的国家标准&#xff0c;本文将解析如何在FFmpeg中增加对GB28181协议的支持&#xff0c;使其可以与支持GB28181协议的设备进行通信与控制&#xff0c;实现设备的注册、保活以及流媒体的传输。 1.背景介绍 GB28181协议指的是国家标准GB/T 28181…

自定义类型结构体(上)

目录 结构体类型的声明结构体的概念结构体的声明特殊的声明结构的自引用 结构体变量的创建和初始化结构成员访问操作符 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1…

2023年【R1快开门式压力容器操作】报名考试及R1快开门式压力容器操作实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R1快开门式压力容器操作报名考试是安全生产模拟考试一点通总题库中生成的一套R1快开门式压力容器操作实操考试视频&#xff0c;安全生产模拟考试一点通上R1快开门式压力容器操作作业手机同步练习。2023年【R1快开门式…

BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)

一、介绍 BurpSuite是渗透测试、漏洞挖掘以及Web应用程序测试的最佳工具之一&#xff0c;是一款用于攻击web 应用程序的集成攻击测试平台&#xff0c;可以进行抓包、重放、爆破&#xff0c;包含许多工具&#xff0c;能处理对应的HTTP消息、持久性、认证、代理、日志、警报。 二…

Windows11无法打开Photoshop CC 2017问题解决

情况描述&#xff1a; Windows11上&#xff0c;双击Photoshop CC 2017没反应 解决办法&#xff1a; 此时需要启动Windows的“事件查看器”来确认问题出在哪里。可以直接通过开始菜单搜索启动&#xff0c;也可以通过右键点击“此电脑”->“管理”&#xff0c;然后找到事件查…

java基础+数据库基础+系统+JVM问题

的哎的哎 1、基础部分 java线程池 队列的选择 答&#xff1a; SingleThreadPool:适用于多个任务顺序执行的场景。 它使用的是LinkedBlockingQueue<>()&#xff0c;无界的阻塞队列&#xff0c;就意味着会有内存溢出的风险。 FixedThreadPool: 适用于任务量固定耗时长的…

Find My移动硬盘|苹果Find My技术与移动硬盘结合,智能防丢,全球定位

当今已经是数据的时代&#xff0c;各种东西需要保存下来的很多&#xff0c;电脑、手机等设备更换频率也快&#xff0c;确实每个人都需要一个自己的"数据库"&#xff0c;而移动硬盘无疑是最有性价比、最简单使用的选择。移动硬盘一直是我们生活中不可或缺的存储工具&a…

DevChat:VSCode中基于大模型的AI智能编程助手

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 1. 前言2. 安装2.1 注册新用户2.2 在VSCode中安装DevChat插件2.3 设置Access Key 3. 实战使用4. 总结 1. 前言 DevChat是由Merico公司精心打造的AI智能编程助手。它利用了最先进的大语言模型技术&#xff0c;像人类…

IDEA在service面板中不显示微服务的项目

在.idea文件夹下的workspace文件中的project标签内添加如下代码段&#xff0c;&#xff0c;重启idea即可看到所有服务出现在了service面板中 <component name"RunDashboard"><option name"configurationTypes"><set><option value&q…

干货来袭 只需套用模板就能制作的电子相册的网站

随着科技的不断发展&#xff0c;电子相册已经成为了我们生活中不可或缺的一部分。但是&#xff0c;制作电子相册的过程却往往让人感到头疼。那么&#xff0c;有没有一种简单易用的方法来制作电子相册呢&#xff1f;今天&#xff0c;就给大家介绍一款只需套用模板就能制作的电子…

opencv c++ canny 实现 以及与halcon canny的对比

Opencv和C实现canny边缘检测_opencv边缘增强-CSDN博客 一、canny实现步骤 1、图像必须是单通道的&#xff0c;也就是说必须是灰度图像 2、图像进行高斯滤波&#xff0c;去掉噪点 3、sobel 算子过程的实现&#xff0c;计算x y方向 、梯度&#xff08;用不到&#xff0c;但是…

预安装win11的电脑怎么退回正版win10?

对于新购的笔记本 通常来讲预装的系统是全新安装的&#xff0c;是没有之前Windows10系统文件的&#xff0c;无法回退。 可以打开设置-----系统----恢复-----看下是否有该选项。 ------------------------------------------------------------------------------- 若是在上述…

Vue.js中的双向数据绑定(two-way data binding)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…