SpringCloud中的nacos注册中心分析

一、概述
服务注册中心是整个微服务架构体系中的关键组件之一,它负责服务的注册、发现及管理。nacos可以作为注册中心使用,提供了一种简化微服务架构中服务发现,服务注册及健康检查的功能,可以方便地管理微服务的实例。

二、nacos特性
1.服务发现:nacos支持基于DNS和基于RPC的服务发现,服务提供者注册服务后,服务消费者可以使用DNS TODO或者HTTP&API查找和发现服务。

2.服务健康检查:nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。nacos支持传输层和应用层的健康检查,此外,nacos还提供了统一的健康检查仪表盘,帮助您根据健康检查状态管理服务的可用性以及流量。

3.动态 DNS 服务: nacos 提供了内置的 DNS 服务,通过 DNS 查询可以获取到注册在 nacos 上的服务实例信息。

4.多环境和命名空间: nacos 支持多环境(例如开发、测试、生产)和命名空间的管理,可以更灵活地组织和管理配置信息。

三、nacos 注册中心原理分析
1.nacos实现服务注册发现流程
(1)服务注册:服务提供者在启动时,将自己的服务信息注册到nacos 注册中心,nacos 客户端会通过发送REST请求的方式向nacos server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。 nacos server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。注册的实例可以是临时实例或非临时实例,根据实际需要选择注册类型。

(2)服务心跳:在服务注册后,nacos client会维护一个定时心跳来持续通知 nacos server,说明服务一直处于可用状态,防止被剔除,默认 5s发送一次心跳。

(3)服务同步:如果是集群部署,Nacos 服务端集群之间会互相同步服务实例,用来保证服务信息的一致性。

(4)服务发现:服务消费者定期向Nacos注册中心拉取最新的服务列表。这个服务列表包含了可用的服务实例信息,使得消费者能够了解到当前可用的服务。nacos 客户端在调用服务提供者服务时,会发送一个REST请求给nacos 服务端,获取上面注册的服务清单,并且缓存在nacos 客户端本地,同时会在nacos客户端本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。

(5) 异常处理与服务推送: nacos注册中心具有异常处理机制。当注册中心发生异常或停止运行时,它会主动推送更新后的服务信息给服务消费者。这样,消费者能够及时感知到注册中心的状态变化,并作出相应的调整,确保系统的稳定性。

(6)负载均衡: 服务消费者在获取到服务列表后,会在缓存的服务列表上进行负载均衡。这确保了请求能够被均匀分配到不同的服务实例上,避免了单点故障的发生。

2.nacos 服务分层模型
nacos 的服务分级存储模型是其设计架构的一个重要组成部分,它有助于更好地管理和组织服务信息。这个模型分为三个层级,分别是服务、集群和实例。

(1)服务: 服务是 nacos 中的最高层级,它代表了一个抽象的服务实体,通常以服务的名称来标识,例如 roleservice。服务可以包含一个或多个集群。

(2)集群: 集群是服务的下一层级,用于表示同一个服务的多个实例的分组。一个服务可以分布在不同的集群中,每个集群可以包含一个或多个实例。以地理位置或部署环境为例,一个服务可以有多个集群。
(3)实例: 实例是服务的最低层级,它代表了一个具体的服务实例,通常对应一个运行中的服务节点。每个集群中可以包含一个或多个实例,每个实例都具有唯一的 IP 地址和端口号,并提供了服务的访问地址。

这种模型的设计使得 nacos 能够更好地管理和组织服务信息,服务可以以地理位置、部署环境等为单位进行划分,每个集群中包含多个实例,具备了高可用性和负载均衡的特性。

3.nacos 注册中心的两种调用方式
(1)使用 RestTemplate + Spring Cloud LoadBalancer
(2)使用 OpenFeign + Spring Cloud LoadBalancer

这里说下第一种的做法:
增加 RestTemplate 的 LoadBalanced 支持。
在Spring Boot启动类上添加 @EnableDiscoveryClient 注解,然后使用 @LoadBalanced 注解替换 Ioc 容器中的 RestTemplate。
示例代码如下:

@SpringBootApplication
@EnableDiscoveryClient 
public class DemoApplication {
 
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication .class, args);
    }
}

接着使用RestTemplate 调用接口。

@RestController 
public class DemoController {
    @Autowired
    private RestTemplate restTemplate;
 
    @RequestMapping("/getUserName")
    public String getUserName(Integer id) {
        return restTemplate.getForObject("http://nacos-discovery-demo/user/getUserName?id="+id,String.class);
    }
}

4.nacos服务注册中心数据模型
4.1.服务定义
服务的定义包括以下几个内容:
(1)命名空间(Namespace):nacos数据模型中最顶层、也是包含范围最广的概念,用于在类似环境或租户等需要强制隔离的场景中定义。

(2)分组(Group):nacos数据模型中次于命名空间的一种隔离概念,区别于命名空间的强制隔离属性,分组属于一个弱隔离概念,主要用于逻辑区分一些服务使用场景或不同应用的同名服务,最常用的情况主要是同一个服务的测试分组和生产分组、或者将应用名作为分组以防不同应用提供的服务重名。

(3)服务名(name):该服务的实际名称,一般用于描述该服务提供了某种功能或能力。
通常推荐使用运行环境作命名空间、应用名作为分组和服务功能作为服务名的组合来确保该服务的天然唯一性。

4.2.服务元数据
(1)健康保护阈值(ProtectThreshold):防止因过多实例故障,导致所有流量流入剩余实例,继而造成流量压力将剩余实例被压垮形成的雪崩效应,应将保护阈值定义为一个0到1之间的浮点数。当域名健康实例数占总服务实例数的比值小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群中剩余健康实例能正常工作。

(2)实例选择器(Selector):用于在获取服务下的实例列表时,过滤和筛选实例。该选择器也被称为理由器,目前nacos支持通过将实例的部分信息存储在外部元数据管理CMDB中,并在发现服务时使用CMDB中存储的元数据标签进行筛选的能力。
(3)拓展数据(extendData):用于用户在注册实例时自定义扩展的元数据内容,形式为k-v。

4.3.定义实例
由于服务实例是具体提供服务的节点,因此Nacos在设计实例的定义时,主要需要存储实例的一些网络相关的基础信息。

(1) 网络IP地址:该实例的IP地址,在Nacos2.0版本后支持设置为域名。
网络端口:该实例的端口信息。
(2) 健康状态(Healthy):用于表示该实例是否为健康状态,会在Nacos中通过健康检查手段进行维护。
(3) 集群(Cluster):用于标示该实例归属于哪个逻辑集群。
(4) 拓展数据(extendData):用与用户自定义扩展的元数据内容,形式为k-v。

4.4.实例元数据
(1) 权重(Weight):实例级别的配置。权重越大,分配给该实例的流量越大。
(2) 上线状态(Enable):标记该实例是否接受流量,优先级大于权重和健康状态。
(3) 拓展数据(extendData):用与用户自定义扩展的元数据内容,形式为k-v。
在Nacos2.0版中,实例数据被拆分为实例定义和实例元数据,只要对应着两种不同场景:开发运行场景以及运维场景。

5.nacos注册中心健康检查机制
(1).对于临时实例,Nacos采用心跳检测机制。注册的临时实例会定期向Nacos注册中心发送心跳包,证明自己正常运行。如果心跳包未按时到达,Nacos将删除该实例,确保注册中心中只有健康的服务实例。
(2)对于非临时实例,Nacos会主动向实例发起询问,检查其健康状态。如果发现异常,Nacos将更新实例的健康状态,同时在实例恢复正常后,将其状态恢复。

总结:
以上就是今天要讲的内容,本文简单介绍了nacos的注册中心相关内容,由上述内容可以知道,注册中心可以说用处非常之大的,它可以帮助我们
管理所有微服务、解决微服务之间调用管理错综复杂、难以维护的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Adipogen—Progranulin (human) ELISA Kit (mAb/mAb)

前颗粒蛋白(Progranulin,PGRN)是一种富含半胱氨酸的蛋白质,由~ 6kDa大小的颗粒蛋白(granulin,GRN)组成,具有多功能生物活性,在癌症、炎症、代谢性疾病和神经退行性疾病中…

2024洗地机名牌排行榜:细数最值得买的4大热门款

随着科技的迅速发展,人们的家里纷纷都添置了新的清洁工具——洗地机,它集合了吸、拖、洗于一体,减轻了很多家庭家务的负担,也成为了很多家庭改善清洁体验的新选择。那么市场上的洗地机品牌琳琅满目,我们要如何挑选一款…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器,想要高效的用好ChatGPT,首先,让我们从如何与它进行有效的对话开始。要知道,ChatGPT并非简单的问答机器,而是一个可以通过交互学习和适应的智能体。那么,如何让ChatGPT来更好地理解我们…

ruoyi创建子模块

点击项目 -> new -> Module 选择maven模式 构建完成 子项目默认会加入到父项目maven控制在 父项目 pom文件中 dependencyManagement 标签内加入一下代码 新建子模块的名称<!-- 测试--><dependency><groupId>com.safety</groupId><artifact…

vscode+vue开发常用插件整理

前言&#xff1a; vscode新机开发常用插件整理 1、chinese 简体中文配置 2、file-jump 别名跳转&#xff0c;可以把引入的组件&#xff0c;通过ctrl地址名 跳转组件内部 3、Vue Peek&#xff1a;vue项目中的一些配置&#xff0c;安装后&#xff0c;能实现 ctrl组件名 跳转…

JavaEE进阶:基础知识

JavaEE&#xff1a;Java企业开发 Web网站的工作流程 ⽬前用户对PC端应⽤的开发结构模式主要分为C/S和B/S结构. CS即Client/Server&#xff08;客户机/服务器&#xff09;结构. 常⻅的C/S架构的应⽤⽐如QQ&#xff0c;CCTALK&#xff0c;各种⽹络游戏 等等&#xff0c;⼀般需…

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的&#xff1a;定义一个用于创建对象的接口。实质&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

MYSQL之增删改查(上)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 1、“增”——添加数据 1.1…

【简单介绍下R-Tree】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

228 基于matlab的神经网络人脸识别

基于matlab的神经网络人脸识别。 人脸识别以视网膜、 虹膜、 指纹等生物特征的识别作为生物标识符。生物特征识别不很容易伪造、 放错位置。新型脸识别使用的方法 RobustPCA 和径向基函数网络。程序已调通&#xff0c;可直接运行。 228 人脸识别 生物特征识 神经网络 - 小红书 …

【NTN 卫星通信】NTN的信关站应该建在哪些地方

1 概述 3GPP的卫星通信讨论了透传星和再生星两种方式。透传星方式&#xff0c;卫星主要是做为中继存在&#xff0c;基本上不做通信协议的处理。再生星方式&#xff0c;gNodeB的主要功能在卫星上&#xff0c;完成通信协议的主要内容。无论是透传星还是再生星&#xff0c;都需要通…

校园小情书微信小程序源码/社区小程序前后端开源/校园表白墙交友小程序

校园小情书前端代码&#xff0c;好玩的表白墙、树洞、校园论坛&#xff0c;可独立部署&#xff0c;也可以使用我部署的后台服务&#xff0c;毕业设计的好项目。 搭建教程&#xff1a; 一、注册管理后台 1、登录小情书站点进行注册&#xff1a;https://你的域名 2、注册成功…

【JavaEE多线程】线程中断 interrupt()

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

动态酷黑主页源码

效果图 PC端 &#xff08;移动端不能访问&#xff09; 部分代码 index.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta charset"ut…

java算法day58 | 单调栈part01 ● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 思路&#xff1a; 这道题用暴力求解法会超时。 那我们就要想如何只遍历一遍就能求解出每个位置的下一个更大值在哪呢。 主要的思想就是空间换时间。定义一个单调栈&#xff0c;每次遇到比栈顶元素小的或相等的&#xff0c;直接入栈&#xff0c;遇到比栈顶元素大的…

电学启蒙积木电子方案

东莞市酷得智能科技有限公司是一家集芯片贸易和电子方案定制开发的研发型公司&#xff0c;其中电子积木方案是酷得经营多年的其中一条比较成熟的研发线。电学积木玩具不仅仅是一种娱乐工具&#xff0c;更是一种教育工具&#xff0c;能够在孩子们的成长过程中发挥多方面的积极作…

微信小程序开发五(与springboot整合)

首先在微信开发者工具中开启不校验合法域名&#xff0c;这个才能本地访问 实现一个小功能&#xff1a; 展示数据信息&#xff0c;每条数据的颜色不一样 后端&#xff1a;springbootmybatisplusmysql 依赖&#xff1a; <dependency><groupId>com.baomidou</grou…

代码学习记录45---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

powershell@命令行提示符样式配置自定义@pwsh重写prompt显示电量内存时间等信息

文章目录 abstract流行的powershell prompt模块示例 powershell原生修改Prompt函数配置文档Prompt命令来自哪里 简单修改带上电量和时间的Prompt 复杂修改预览FAQ:没有必要修改相关仓库地址样式选择平衡样式花哨样式响应性能 小结 abstract 在 PowerShell 中&#xff0c;可以通…

国家级项目管理高级认证:CSPM-4级(高级)重磅推出

本周&#xff0c;圣略CSPM资深讲师老杨&#xff0c;赴北京参加CSPM-4级高级讲师培训&#xff0c;从现场带来第1手的资料&#xff0c;与大家分享&#xff1a; CSPM-4基本要求&#xff1a; 负责实现组织战略目标&#xff0c;以成果和收益为导向&#xff0c;需具备战略解析、收益…
最新文章