nacos2.X服务注册心跳学习分享

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 Confighttp 短连接,30 秒定 期创建销毁连接,GC 压力大

最后

建议有疑问的同学,多看看nacos的官方文档。小弟不才,整理可能有误,希望各位指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值