spring cloud通天代之Nacos怎么进行服务注册?

228 阅读8分钟

哈喽大家好,这里是最锋利的矛,上期和大家了解“老家伙”eureka,今天我们来一起来研究下现如今国内应用最多的注册中心Nacos。

在了解最重要的服务注册之前,先来了解下nacos中可以注册的两种实例,这个概念很重要,在后面的服务注册、心跳机制等都有不小的区别。

临时实例和永久实例

在Nacos中服务实例可以分为两种类型:临时实例和永久实例。主要区别体现在它们的生命周期管理和健康状态的处理上。

临时实例

  • 注册和存储:当一个服务实例注册为临时实例时,它的信息只会在 Nacos 的内存中保存,不会被持久化到磁盘。这意味着如果 Nacos 重启,这些信息将会丢失。
  • 心跳机制:为了保持临时实例的活跃状态,客户端必须定期向 Nacos 发送心跳请求。如果 Nacos 在一段时间内(默认是 30 秒)没有收到心跳信号,它会认为该实例已宕机并将其从服务列表中移除。
  • 健康检查:由于依赖于心跳机制,Nacos 可以快速地检测到实例的故障,并从服务发现列表中剔除,以避免服务调用方调用到不可用的服务。
  • 应用场景:比较适合于业务服务,服务下线之后可以不需要在注册中心中查看到。

永久实例

  • 注册和存储:与临时实例不同,永久实例的信息会被持久化到 Nacos 的存储层(如数据库),这样即使 Nacos 重启,这些信息也不会丢失。
  • 故障容忍:即使永久实例宕机,Nacos 也不会自动将其从服务列表中移除。这意味着服务调用方仍然可以看到该实例的存在,但通常会标记为不健康状态。
  • 应用场景:永久实例更适合于那些希望在服务实例短暂故障后仍能恢复并继续提供服务的情况,例如数据库服务器,它们通常需要更长的时间来恢复,而且服务调用方可能需要知道所有可能的实例,即使某些实例暂时不可用。

实例类型的选择可以在配置文件中通过以下属性来指定(默认为临时实例):

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public
        group: DEFAULT_GROUP
        metadata:
          version: v1
        # 以下配置可以放在每个服务的配置文件中,根据需要分别设置
        instance-id: service-instance-1
        ephemeral: true # 临时实例
        
        # 或者
        instance-id: service-instance-2
        ephemeral: false # 永久实例

但在 Nacos2.0 版本后,持久化属性的定义被抽象到服务中,一个服务只能被定义成持久化服务或非持久化服务,一旦定义完成,在服务生命周期结束之前,无法更改其持久化属性。

明白了两种实例的区别,我们开始最重要的服务注册。

服务注册

Nacos提供两种服务注册的机制,OpenAPI注册与SDK注册,他们两的注册过程也略有区别。

OpenAPI注册

  1. 客户端初始化:当一个服务启动时,其客户端(服务提供者)会初始化 Nacos Discovery Client,并配置必要的参数,如 Nacos 服务器地址、命名空间、分组等。
  2. 服务实例元数据准备: 客户端会收集服务实例的元数据,包括服务名、服务实例的 IP 地址、端口号、服务版本、权重、健康状态、元数据(如自定义标签)等信息。
  3. 注册 请求发送:客户端调用 Nacos Discovery Client 的注册接口,将服务实例的元数据封装成注册请求,发送给 Nacos 服务器。
  4. 服务器接收与验证:Nacos 服务器接收注册请求,进行合法性校验,如检查服务名是否存在,元数据是否符合预期格式等。
  5. 实例信息存储:校验通过后,Nacos 服务器将服务实例信息存储到内存中。对于临时实例,信息主要保存在内存中,而永久实例的信息会被持久化存储。
  6. 心跳机制(仅临时实例) :对于临时实例,客户端会定期(默认每 5 秒一次)向 Nacos 服务器发送心跳请求,以证明服务实例仍然活跃。Nacos 服务器会记录这些心跳,并在一定时间内(默认是 30 秒)未收到心跳时,将该实例视为不可用并从服务列表中移除。

SDK注册

  1. 设置 环境变量:你可能需要配置一些环境变量或配置文件,比如API密钥、服务器地址、认证信息等,以便SDK能够正确地与服务注册平台通信。

  2. 初始化 SDK:在你的应用程序中,你需要初始化SDK,这通常涉及到创建一个SDK实例,并传递必要的配置参数。

  3. 调用注册方法:使用SDK提供的接口来注册你的服务。这通常包括提供服务的名称、版本、端点URL、健康检查路径等信息。

  4. 处理响应:SDK会处理与服务注册平台的通信,并返回一个响应,告知你注册是否成功。你应当检查这个响应并采取适当的行动,比如在失败时重试注册。

区别

简而言之,OpenAPI会Http 接口对服务进行注册,而SDK会通过RPC 与注册中心保持长连接。

健康检查机制

image.png

主要分两种方式:心跳机制和Nacos主动探测机制。

临时实例健康检查机制

image.png

临时实例和永久实例最大的不同就是临时实例拥有心跳机制。

在通过http注册成功后,还会注册一个全局的客户端心跳检测的任务,后续通过http不断上报心跳,在服务一段时间没有收到来自客户端的心跳后,该任务会将其标记为不健康,如果在间隔的时间内还未收到心跳,那么该任务会将其剔除。

而通过RPC注册的是和Nacos维持了一个长链接,一旦这个连接断开,服务端就会认为这个连接注册的服务实例不可用,之后就会将这个服务实例从服务注册表中提出剔除。

除此之外,Nacos还会主动检测机制。

Nacos服务端也会启动一个定时任务,默认每隔3s执行一次,这个任务会去检查超过20s没有发送请求数据的连接

一旦发现有连接已经超过20s没发送请求,那么就会向这个连接对应的客户端发送一个请求,如果请求不通或者响应失败,此时服务端也会认为与客户端的这个连接异常,从而将这个客户端注册的服务实例从服务注册表中剔除。

永久实例健康检查机制

image.png

对于永久实例的的监看检查,Nacos 采用的是注册中心探测机制,注册中心会在永久服务初始化时根据客户端选择的协议类型注册探活的定时任务。Nacos 现在内置提供了三种探测的协议,即Http、TCP 以及 MySQL 。

一般而言 Http 和 TCP 已经可以涵盖绝大多数的健康检查场景。MySQL 主要用于特殊的业务场景,例如数据库的主备需要通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是一个检查数据库是否为主库的 MySQL命令。

由于持久化服务的实例的在被主动删除前一直存在的特性,探活的定时任务会不断探测服务的健康状态,并且将无法探测成功的实例标记为不健康。但是有些时候会有这样的场景,有些服务不希望去校验其健康状态,Nacos 也是提供了对应的白名单配置,用户可以将服务配置到该白名单,那么Nacos 会放弃对其进行健康检查,实例的健康状态也始终为用户传入的健康状态。

总结

本篇主要讲了在Nacos中临时实例和永久实例的区别,在服务注册以及健康检查的不同点。

下一期,对服务发现进行解析,持续关注学习哦。

记得点赞,记得点赞,记得点赞...

老生常谈eureka之如何实现AP? - 掘金 (juejin.cn)