Nacos注册中心最全详解(图文全面总结)

Nacos注册中心最全详解(图文全面总结)-mikechen

Nacos注册中心是微服务的核心组件,也是大厂经常考察的内容,下面我就重点来详解Nacos注册中心@mikechen

微服务注册中心

微服务注册中心,是用于管理和、协调微服务架构中各个服务的组件。

比如:大家熟知的Eureka、Nacos…这些都是平常开发,经常使用到的注册中心。

Nacos注册中心最全详解(图文全面总结)-mikechen

Nacos 既可以作为服务注册中心,也可以作为配置中心,接下来我们详细解析 Nacos 注册中心功能原理@mikechen

 

Nacos注册中心原理

微服务,注册中心原理,主要会涉及到:服务注册、服务发现…等机制。

整体流程,如下图所示:

Nacos注册中心最全详解(图文全面总结)-mikechen

Nacos 的注册中心功能,依赖于以下3大关键组件:

1.Nacos Server

提供服务注册和发现的核心组件,负责管理服务实例、健康检查和服务列表的维护。

2.Nacos Client

服务提供者和消费者通过 Nacos Client 与 Nacos Server 进行通信,完成服务注册、发现以及心跳续约等功能。

3.Naming 模块

Nacos 的服务注册与发现模块。Nacos 将每个服务视为一个命名实体,客户端可以通过服务名动态发现可用的实例。

 

Nacos注册中心工作流程

整体工作流程,如下:

Nacos注册中心最全详解(图文全面总结)-mikechen

首先,是服务注册。

服务启动时,将其地址、和相关元数据,注册到注册中心。

比如:

  • 服务名称(Service Name):服务的逻辑名称,用于区分不同的服务实例;
  • 实例 ID(Instance ID):服务实例的唯一标识符,通常由服务名称、和实例的 IP、端口…等信息生成;
  • IP 地址(IP Address):服务实例所在机器的 IP 地址;
  • 端口(Port):服务运行的端口号,用于其他服务进行访问,比如:8020、8021…等等;
  • 健康检查 URL(Health Check URL):注册中心使用该 URL 定期检查服务实例是否健康;
  • 元数据(Metadata):额外的服务信息,可能包括服务版本、所在区域(Zone/Region)、负载情况…等。

示例,如下:

hostname: localhost  # 实例的主机名
    instance-id: my-service-1  # 实例 ID
    prefer-ip-address: true  # 是否使用 IP 地址注册
    ip-address: 127.0.0.1  # 服务的 IP 地址
    lease-renewal-interval-in-seconds: 10  # 心跳发送间隔

注册中心,会维护一张服务注册表,记录所有可用的服务实例,而且,当新的实例上线或离线时,注册表会更新。

 

其次是,服务发现

Nacos注册中心最全详解(图文全面总结)-mikechen

服务发现,指的是:服务消费者(Service Consumer)在需要调用其他服务时,向注册中心发送请求,询问某个服务的可用实例信息。

这里我以Nacos为例,比如:消费者请求某个服务时,Nacos返回可用的服务实例列表。

spring:
  application:
    name: service-a  # 服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos 注册中心地址

然后,消费者根据负载均衡算法,选择一个服务实例。

常见的负载均衡算法,有包含:轮询、随机、最少连接………等等。

如果 service-*** 有多个实例运行(例如:端口为 8081 、和 8082 的两个实例)。

Nacos 会自动处理服务实例的负载均衡,@LoadBalanced 注解会确保调用时自动选择一个可用的服务实例。

如下所示:

@Bean
   @LoadBalanced  // 开启负载均衡
   public RestTemplate restTemplate() {
       return new RestTemplate();
   }

 

再次,就是健康检查

比如:注册中心监控服务的状态,如果某个服务实例不可用,会从注册表中移除。

注册中心,会定期检查已注册服务的健康状态,比如:主动探测(主动发起 HTTP 请求、或 TCP 连接)和被动探测(服务实例的心跳检测…等等)。

如果某个服务实例未能通过健康检查,注册中心会将其标记为不可用,并从注册表中移除该实例,防止客户端调用不可用的服务。

比如:Nacos 定期通过心跳检测服务实例的健康状况,如果某个实例失效,Nacos 会自动将其从可用实例列表中移除。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法