nacos 2.1.0
前言
最近在学习nacos心跳机制的。我一开始从网上搜到了许多2.0之前的配置,结果并不起作用,并且默认心跳机制也与自己实际测试不同。在我看了nacos官网文档之后,我明白了nacos2.0之后的架构有狠了很大的变化。其中临时实例的心跳机制变为了通过长连接来维持的设计。
nacos的心跳设计
首先我们看一下官方对健康检查的设计说明
OpenAPI 的注册方式实际是用户根据自身需求调用 Http 接口对服务进行注册,然后通过 Http 接
口发送心跳到注册中心。在注册服务的同时会注册⼀个全局的客户端心跳检测的任务。在服务⼀段
时间没有收到来自客户端的心跳后,该任务会将其标记为不健康,如果在间隔的时间内还未收到心
跳,那么该任务会将其剔除。
SDK 的注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x 版本中,旧版的还是仍然通过
OpenAPI 的方式),客户端会定时的通过 RPC 连接向 Nacos 注册中心发送心跳,保持连接的存
活。如果客户端和注册中心的连接断开,那么注册中心会主动剔除该 client 所注册的服务,达到下
线的效果。同时 Nacos 注册中心还会在注册中心启动时,注册⼀个过期客户端清除的定时任务,
用于删除那些健康状态超过⼀段时间的客户端。
简单来说,nacos在2.0之前是OpenAPI 的Http接口保持心跳。2.0之后如果采用的是SDK(nacos client)注册的,那么默认的是使用RPC长连接来保持心跳。
不管是OpenAPI还是RPC,心跳设计都是一个原理。
首先客户端主动上报心跳,刷新活跃时间。然后服务端有线程定时检查客户端的活跃时间。活跃时间超过限制的,将会被服务器踢出。
所以接下来介绍nacos的rpc心跳和http心跳的时候,主要介绍的就是5个点:
- 主动上报心跳
- 刷新活跃时间
- 服务端定时检查活跃时间
- 服务器主动探测(rpc长连接)
- 清除不健康客户端
OpenAPI的心跳设计
注意: 我学习的OpenAPI的设计代码是nacos2.1.0的代码,不是1.X版本
我们介绍nacos1.X的心跳设计的时候,就是在介绍OpenAPI,也就是HTTP保持心跳的。
nacos通过http发送心跳的时候。我们可以通过在客户端设置一些参数,来控制心跳发送的间隔,多久收不到心跳节点会不健康以及多久收不到心跳节点会被剔除。这些参数可以在PreservedMetadataKeys这个类里查看
package com.alibaba.nacos.api.naming;
/**
* Some keys of metadata that are recognized by Nacos.
*
* @author nkorange
* @since 1.0.0
*/
public class PreservedMetadataKeys {
/**
* The key to indicate the registry source of service instance, such as Dubbo, SpringCloud, etc.
*/
public static final String REGISTER_SOURCE = "preserved.register.source";
public static final String HEART_BEAT_TIMEOUT = "preserved.heart.beat.timeout";
public static final String IP_DELETE_TIMEOUT = "preserved.ip.delete.timeout";
public static final String HEART_BEAT_INTERVAL = "preserved.heart.beat.interval";
public static final String INSTANCE_ID_GENERATOR = "preserved.instance.id.generator";
}
- HEART_BEAT_TIMEOUT 多久没有收到心跳标记为不健康
- HEART_BEAT_INTERVAL 心跳间隔时间
- IP_DELETE_TIMEOUT 多久没有收到心跳删除实例
这些参数我们可以设置在元数据里面,当服务注册的时候这些数据就会发送到服务器。当服务器收到之后,每一次做健康检查将通过收到的配置来检查实例的健康。这些参数不配的话,在服务端也是有默认值的。
//Constants.java
public static final long DEFAULT_HEART_BEAT_TIMEOUT = TimeUnit.SECONDS.toMillis(15);
public static final long DEFAULT_IP_DELETE_TIMEOUT = TimeUnit.SECONDS.toMillis(30);
public static final long DEFAULT_HEART_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5);
RPC长连接的心跳设计
连接活跃检测的线程池为COMMON_SERVER_EXECUTOR
rpc长连接模式就是服务端把每一个连接都做了缓存。会有一个定时任务检查连接的活跃时间。与OpenAPI不同的是,rpc模式不能自定义连接的不健康和需要删除的时间,写死20s。
//ConnectionManager.java
private static final long KEEP_ALIVE_TIME = 20000L;
服务端健康检查大概流程。

为什么需要长连接?
为什么nacos2.0会推出长连接,nacos官方文档给出了答案。
配置和服务器模块的数据推送通道不统⼀,http 短连接性能压力巨大,未来 Nacos 需要构建能够 同时支持配置以及服务的长链接通道,以标准的通信模型重构推送通道。
| 产品 | 痛点 |
|---|---|
| Nacos Naming | 丢包,云架构下无法 反向推送 |
| Nacos Config | http 短连接,30 秒定 期创建销毁连接,GC 压力大 |
最后
建议有疑问的同学,多看看nacos的官方文档。小弟不才,整理可能有误,希望各位指出。

1492

被折叠的 条评论
为什么被折叠?



