Nacos注册表解读

基本介绍

在 Nacos 中,注册表是其中一个重要的组件,用于管理服务的注册和发现。

注册表是一个存储服务实例信息的数据库,它记录了所有已注册的服务实例的相关信息,包括服务名称、IP 地址、端口号等。

通过注册表,服务提供者可以将自己的服务注册到平台上,而服务消费者可以从注册表中获取到可用的服务列表.注册表的作用是实现服务的自动发现和动态调用,为微服务架构的实施提供支持。

注册表核心概念

  • 服务实例:注册表中的基本单位,代表一个运行中的服务。每个服务实例都有一个唯一的标识符,可以通过该标识符在注册表中进行查找和访问。
  • 服务名称:每个服务实例都属于一个特定的服务名称,服务名称是在服务注册时定义的,用于对服务进行分类和管理
  • IP 地址: 服务实例的网络地址,用于标识服务的运行位置
  • 端口号:服务实例所监听的端口,用于接收服务请求
  • 健康状态:注册表中的服务实例会定期向平台报告自己的健康状态,以确保只有可用的服务实例被提供给消费者
  • 元数据:注册表中的服务实例还可以携带一些额外的元数据,用于描述服务的特性和配置信息。

源码解析注册表的构成

主要代码入口位于:naming模块中的com.alibaba.nacos.naming中的controller中,找到register方法

    @CanDistro@PostMapping@Secured(parser = NamingResourceParser.class, action = ActionTypes.WRITE)public String register(HttpServletRequest request) throws Exception {final String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);final String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);NamingUtils.checkServiceNameFormat(serviceName);final Instance instance = parseInstance(request);serviceManager.registerInstance(namespaceId, serviceName, instance);return "ok";}

 查看ServiceManager的结构 :引入了一个多层map,最外层的String指的是Namespace,然后对应的值Map就是根据不同环境的服务,再分层就是组Group——>对应的Service,Service可能包含多种服务

@Component
public class ServiceManager implements RecordListener<Service> {/*** Map(namespace, Map(group::serviceName, Service)).*/private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();

 

跟进查看Service(服务):Service中里面用了一个HashMap,存储服务的集群,对应Cluster实例

   //String集群名字,Cluster实例private Map<String, Cluster> clusterMap = new HashMap<>();

 根据查看Cluster(实例):发现最终的实例使用HashSet存储起来的,有临时和非临时两种情况

    //永久实例,Set存服务@JsonIgnoreprivate Set<Instance> persistentInstances = new HashSet<>();//临时实例@JsonIgnoreprivate Set<Instance> ephemeralInstances = new HashSet<>();

Nacos是多级存储模型,最外层通过namespace来实现环境隔离,然后是group分组,分组下就是服务,一个服务有可以分为不同的集群,集群中包含多个实例。

  • 其注册表结构为一个Map,类型是:Map<String, Map<String, Service>>
  • 外层key是namespace_id,内层key是group+serviceName,
  • Service内部维护一个Map,结构是:Map<String,Cluster>,key是clusterName,值是集群信息
  • Cluster内部维护一个Set集合,元素是Instance类型,代表集群中的多个实例。 

首先最外层是一个Map,结构为:Map<String, Map<String, Service>>

  • key:是namespace_id,起到环境隔离的作用。namespace下可以有多个group

  • value:又是一个Map<String, Service>,代表分组及组内的服务。一个组内可以有多个服务

    • key:代表group分组,不过作为key时格式是group_name:service_name

    • value:分组下的某一个服务,例如userservice,用户服务。类型为Service,内部也包含一个Map<String,Cluster>,一个服务下可以有多个集群

      • key:集群名称

      • value:Cluster类型,包含集群的具体信息。一个集群中可能包含多个实例,也就是具体的节点信息,其中包含一个Set<Instance>,就是该集群下的实例的集合

        • Instance:实例信息,包含实例的IP、Port、健康状态、权重等等信息

注册表作用

  • 服务发现:注册表充当了服务发现的角色,服务提供者将自己的服务实例注册到注册表中,而服务消费者可以从注册表中获取到可用的服务列表,从而实现服务的自动发现和调用
  • 负载均衡:注册表中会记录多个相同服务名称的服务实例,消费者可以通过负载均衡算法从中选择一个合适的服务实例进行调用,从而实现服务的负载均衡
  • 故障转移:当某个服务实例发生故障或下线时,注册表可以快速检测到并将其从可用服务列表中移除,从而避免将请求发送到不可用的服务实例上
  • 动态扩展:当需要增加新的服务实例时,只需将其注册到注册表中即可,而不需要修改服务消费者的代码,从而实现服务的动态扩展。

注册表工作流程

  • 服务提供者将自己的服务实例注册到注册表中,包括服务名称、IP 地址、端口号等信息
  • 服务消费者从注册表中获取可用的服务列表,并选择一个合适的服务实例进行调用。
  • 服务消费者通过负载均衡算法选择的服务实例,将请求发送到该实例的 IP 地址和端口号
  • 服务提供者接收到请求后进行处理,并将响应发送给服务消费者
  • 注册表定期检测服务实例的健康状态,如果发现有服务实例故障或下线,会将其从可用服务列表中移除

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

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

相关文章

定时获取公网ip并发送邮件提醒

前一段时间路由器刷的老毛子固件“穿透服务”中定时更新阿里DDNS失败了&#xff0c;用了很久第一次遇到。所以需要做个备用的措施用来实时获取公网ip信息 1、基于python实现 开启邮箱的SMTP功能拿到授权码(不是登录密码) #!/usr/bin/python # -*- coding: UTF-8 -*- import …

【RocketMq系列-01】RocketMq安装和基本概念

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709 RocketMq安装和基本概念 一&#xff0c;RocketMq安装和基本概念1&#xff0c;RocketMq基本安装(本地安装)2&#xff0c;Rocketmq的核心概念2.1&…

6.7二叉树的最小深度(LC111)

审题要清楚&#xff1a; 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点&#xff08;左右孩子都为空的节点才是叶子节点&#xff01;&#xff09;。 算法&#xff1a; 既可以求最小高度&#xff0c;也可以直接求深度。 最小高度&#xff1a; 后序…

JVM面试必备

目录 JVM三大问题 一、JVM内存区域划分 ​编辑 二、JVM类加载机制 双亲委派模型&#xff08;常考) 类加载的格式&#xff0c;类卸载 三、垃圾回收&#xff08;GC) 具体垃圾回收GC步骤 1.判定对象是否为垃圾 方案1:引用计数 方案2&#xff1a;可达性分析 2.释放对象的…

供应链|顶刊MSOM论文解读:服务竞争下的库存共享

问题背景 在汽车、玩具等行业中&#xff0c;零售商之间的库存共享变得十分常见。库存共享可以解决由需求不确定导致的库存错配问题。如果零售商之间同意共享库存&#xff0c;那么当需求较少、自身库存过剩时&#xff0c;可以将过剩库存卖给其他零售商&#xff1b;反之&#xf…

图像分类(一) 全面解读复现AlexNet

解读 论文原文&#xff1a;http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf Abstract-摘要 翻译 我们训练了一个庞大的深层卷积神经网络&#xff0c;将ImageNet LSVRC-2010比赛中的120万张高分辨率图像分为1000个不…

WinForms C# 导入和导出 CSV 文件 Spread.NET

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件 2023 年 11 月 17 日 使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。 Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎&#xff0c;具有 450 多个函数以及导入和导出 Micros…

React+后端实现导出Excle表格的功能

最近在做一个基于Reactantd前端框架的Excel导出功能&#xff0c;我主要在后端做了处理&#xff0c;这个功能完成后&#xff0c;便总结成一篇技术分享文章&#xff0c;感兴趣的小伙伴可以参考该分享来做导出excle表格功能&#xff0c;以下步骤同样适用于vue框架&#xff0c;或者…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

在VS Code中使用VIM

文章目录 安装和基本使用设置 安装和基本使用 VIM是VS Code的强大对手&#xff0c;其简化版本VI是Linux内置的文本编辑器&#xff0c;堪称VS Code问世之前最流行的编辑器&#xff0c;也是VS Code问世之后&#xff0c;我仍在使用的编辑器。 对VIM无法割舍的原因有二&#xff0…

Springboot 项目启动类放置位置

文章目录 Springboot 项目启动类放置位置springboot 默认包扫描机制启动类放在特定位置springboot 启动注解理解配置启动类扫描特定的包1、 ComponentScan2、利用 SpringBootApplication 注解的 scanBasePackages 属性 Springboot 项目启动类放置位置 如果我们使用 IDEA 或者 …

C++标准模板(STL)- 类型支持 (类型关系,检查两个类型是否相同,std::is_same)

类型特性 类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完…