Nacos注册表解读

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 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存服务
    @JsonIgnore
    private Set<Instance> persistentInstances = new HashSet<>();
    //临时实例
    @JsonIgnore
    private 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 地址和端口号
  • 服务提供者接收到请求后进行处理,并将响应发送给服务消费者
  • 注册表定期检测服务实例的健康状态,如果发现有服务实例故障或下线,会将其从可用服务列表中移除


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
Java Nacos 数据库
使用 nacos 搭建注册中心及配置中心
使用 nacos 搭建注册中心及配置中心
68 5
|
2月前
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
73 3
|
7天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
21天前
|
安全 Nacos 数据安全/隐私保护
升级指南:从Nacos 1.3.0 到 2.3.0,并兼容 Seata 的鉴权配置
本文详细介绍了如何在微服务环境下从 Nacos 1.3.0 升级到 2.3.0,并确保 Seata 各版本的兼容性。作者小米分享了升级过程中的关键步骤,包括备份配置、更新鉴权信息及验证测试等,并解答了常见问题。通过这些步骤,可以帮助读者顺利完成升级并提高系统的安全性与一致性。
69 8
升级指南:从Nacos 1.3.0 到 2.3.0,并兼容 Seata 的鉴权配置
|
1月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
1月前
|
应用服务中间件 Nacos 数据库
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
Nacos 1.2.1 集群搭建(三) Nginx 配置 集群
47 1
|
1月前
|
SQL 关系型数据库 MySQL
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
Nacos 1.2.1 集群搭建(二)MySQL、cluster 配置
41 1
|
1月前
|
缓存 Cloud Native Java
【紧急救援】Nacos配置上线后失效?手把手教你如何轻松搞定命名空间修改难题!
【8月更文挑战第15天】Nacos是关键的云原生服务管理平台,用于动态服务发现与配置管理。但在使用其管理微服务配置时,可能会遇到命名空间内的配置更新后不生效的问题。本文探讨此问题并提供解决方案。首先需确认Nacos服务器运行正常及客户端正确连接。接着检查客户端缓存配置,可通过禁用缓存或缩短缓存间隔来即时更新配置。例如,在Spring Cloud Alibaba Nacos配置中心中启用自动刷新功能,并设置每5秒拉取新配置。同时,对于新增配置项,需重启客户端应用。还需检查Nacos服务器日志排除异常,并考虑升级Nacos版本解决兼容性问题。通过这些步骤,通常可有效解决配置不生效的难题。
37 0
|
1月前
|
安全 Nacos 数据库
【技术安全大揭秘】Nacos暴露公网后被非法访问?!6大安全加固秘籍,手把手教你如何保护数据库免遭恶意篡改,打造坚不可摧的微服务注册与配置中心!从限制公网访问到启用访问控制,全方位解析如何构建安全防护体系,让您从此告别数据安全风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其公网暴露可能引发数据库被非法访问甚至篡改的安全隐患。本文剖析此问题并提供解决方案,包括限制公网访问、启用HTTPS、加强数据库安全、配置访问控制及监控等,帮助开发者确保服务安全稳定运行。
83 0
|
1月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
79 0