不管是什么注册中心,我们服务的提供者(其实只要是配置Nacos的信息的服务)在启动时,都会把自己的信息提交给注册中心,注册中心会把这些信息保存拿下来,当消费者需要消费时,就可以去找注册中心要这些信息,这就叫做服务的拉取或者是服务发现,但是,这种拉取的动作,并不是每一次请求都要做的。
所以作为消费者,在做服务的拉取是,会将拉取到的服务信息,缓存到一个服务列表中,接下来的一段时间,就不用去拉取了,就直接使用缓存列表中的信息即可,这点可以在Ribbon中的DynamicServerListLoadBalancer体现,消费者会定时的隔一段时间去重新拉取一次。

Nacos和Eureka的对比

心跳检测

Nacos较余Eureka多了一个健康检测的功能,Nacos会把服务的提供者分为临时实例非临时实例,默认情况下,所有的实例都是临时实例。
临时实例会每隔一段时间想注册中心发起心跳检测,告诉自己还活着,当在一定时间,注册中心没有收到提供者的心跳,会将其剔除,这一点和Eureka没有差别,可能在间隔时间上有一定的差距,Nacos会快一些。
但是,Nacos中的非临时实例就不是去向注册中心发送心跳了,而是由Nacos主动询问非临时实例:“你是否还活着”,活着就继续存有非临时的信息,如果发现非临时实例挂掉了,也不会将其剔除,而是会标记其不健康了,它会等着非临时的恢复,这是和Eureka不同之一。

如何配置非临时实例:

在application.yml中配置:

spring:
  application:
    name: userservice # userservice的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos的注册地址
      discovery:
        ephemeral: false      #false-非临时实例      true-临时实例
服务发现

Eureka中,在消费者拉取服务的时候,比如说每隔30秒拉取一次,拉取完成之后,这时候有提供者A挂掉了,但是此时又有请求想要发到提供者A那里,此时就不能处理了,会处理失败。
但是在Nacos中不会,尽可能的避免了这种问题,Nacos中,对于服务的发现,消费者不仅是定时拉取了服务,而且Nacos在提供者挂掉之后,会立即通知消费者,所以在消费者的缓存服务列表中,会很及时地保持有健康的提供者,较于Eureka,多了一个主动pull的动作,保证了及时性。

image-1655219078621

总结

  • Nacos与eureka的共同点
    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别
    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式