不管是什么注册中心,我们服务的提供者(其实只要是配置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的动作,保证了及时性。
总结
- Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
- Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式