概述
Nacos和Eureka心跳机制对比(一)
- 心跳机制
- Nacos的实现
- 客户端
- 服务端
心跳机制
在微服务框架中,我们利用注册中心统一对各个服务进行管理,这时,就需要知道各个服务的健康状态,也就是各个服务定时发送一个自定义的结构体(心跳包)到注册中心,让对方知道自己还活着,以确保连接的有效性的机制。
Nacos的实现
我们以springboot为例,引入nacos:
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
查看jar结构如下:
客户端
- 我们从
spring.factories
开始,首先看他装配了哪些类:
我们进去这个跟registry
相关的类:
可以看到这里注入了三个bean实例:
nacosServiceRegistry
:表示向服务端注册的动作,主要实现了具体注册的方法;nacosRegistration
:该类封装了具体的注册信息;nacosAutoServiceRegistration
:实现了org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration ,代表了nacos注册中心的标准实现,类似的还有zookeeper,也是这种方式。
AbstractAutoServiceRegistration
实现了ApplicationListener
,而事件event和Listener是共同存在的,通过观察者模式 来完成spring的事件机制。而AbstractAutoServiceRegistration
是spring-cloud-common中的一个类,也是一个WebServerInitializedEvent
监听器,会在webserver启动后回调。
-
我们进入事件的回调方法:
onApplicationEvent()
->bind()
->start()
->registerManagement()
来看看nacos的实现:这里会调用NacosServiceRegistry.class的register()
方法
-
在
register()
方法中调用了namingService.registerInstance()
的注册逻辑:
-
在
registerInstance()
中会做两件事:
组装心跳包beatInfo
发送心跳beatReactor.addBeatInfo()
其中beatReactor是在NacosNamingService构造函数中初始化的,是一个延迟队列的线程池。
在addBeatInfo中:
其中beatTask是个Runnable实现类:
5. 在sendBeat中通过http发送心跳请求。
服务端
- 客户端在发送http请求后,根据请求路径,在服务端找到相应controller:
com.alibaba.nacos.naming.controllers.InstanceController#beat
在handleBeat
方法中处理心跳请求:
- 在
handleBeat
方法中主要做了三件事:
首先,查询心跳包中服务,获取服务实例
其次,判断服务实例存不存在,如果不存在,重新注册
最后,processClientBeat()
方法异步更新该服务的信息(刷新最近一次心跳时间)
processClientBeat()
方法和ClientBeatProcessor
结构如下:
最后
以上就是文艺红酒为你收集整理的Nacos和Eureka心跳机制对比心跳机制的全部内容,希望文章能够帮你解决Nacos和Eureka心跳机制对比心跳机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复