写点什么

Nacos 心跳机制实现快速上下线

  • 2023-03-17
    湖南
  • 本文字数:1746 字

    阅读完需:约 6 分钟

我们都知道 Spring Cloud Alibaba Nacos 是通过客户端和服务端的心跳机制,来实现服务的注册和下线的,Nacos 的心跳机制默认是存在 BeatInfo 的 period 属性里面的,默认的心跳周期是 5s,心跳的超时时间是 15s,就意味着如果超过 15 秒不发送心跳,Nacos 就认为这个服务不健康了,超过 30 秒该实例就将被 Nacos 删除下线。


在某种情况下,显然不太满足公司项目的要求,默认的心跳时间 30 秒太长了,服务的上线和下线的感知还是有点慢的,为了能让服务上下线进行快速感知,我调整了 Nacos 的心跳配置时间。

Metadata 元数据

但是如何修改 Nacos 的默认心跳配置呢?这里就涉及到元数据的一个概念,说实话之前我也不知道什么元数据,通过自定义修改了 Nacos 的心跳时间配置,才知道是需要用到元数据的。


我们知道 Spring 之前的版本是通过 XML 的拓展机制,进行文件配置的,我们需要自定义很多 xml 文件,进行一些针对于项目自身业务的个性化配置,xml 的这种配置实在让人看着繁琐,随着 Spring3.0+版本的发展,通过注解的方式就能进行个性化配置。

ClassMetadata

对 Class 进行适配,我们可以看到这个接口有很多方法,基本是对 Class 的一些配置,包括是 isAnnotation(否是注解)、isAbstract(是否抽象类)、hasEnclosingClass(是否是内部类)等,只需要知道它是一个对 Class 进行配置的接口就行。



这里可以看到 StandardClassMetadataMethodsMetadataSimpleAnnotationMetadata 继承了 ClassMetadata 和 AnnotatedTypeMetadata 两个顶层接口:

  • StandardClassMetadata:基于反射实现元数据的获取;

  • MethodsMetadata:获取元数据方法的接口;这里我们就不深究了,大概知道有这些就可以了。


Spring 中常见的一些元注解

@Target@Retention@Documented@Inherited@interface 这些都是我们在声明自定义注解的时候需要配置的一些参数。

Nacos 心跳时间自定义配置

通过 yml 配置文件,配置元数据属性对 Nacos 心跳时间进行自定义配置。

spring:  application:    name: Lxlxxx-system  cloud:    nacos:      discovery:        metadata:          preserved.heart.beat.interval: 1000 #心跳间隔。时间单位:毫秒。心跳间隔          preserved.heart.beat.timeout: 3000 #心跳暂停。时间单位:毫秒。 即服务端6秒收不到客户端心跳,会将该客户端注册的实例设为不健康:          preserved.ip.delete.timeout: 3000 #Ip删除超时。时间单位:毫秒。即服务端9秒收不到客户端心跳,会将该客户端注册的实例删除:
复制代码

配置完后重启服务,通过对 NacosNamingService 类 Debug 断点,可以看到已将配置的心跳参数注入到 Instance 实例中,通过 NamingProxy 代理将服务注册到 Nacos。

查看服务详情,可以看到注册的服务,自定义心跳时间配置已被添加进去,舒服了。

Ribboon 的 ServerListRefreshInterval

但是仅仅这样是不够的,这样配置只能单纯保持微服务的快速响应上下线,但是在微服务的架构下,我们是通过 gateway 网关进行转发,访问到每个微服务实例的,ribbon 负载均衡会定时去拉去注册中心最新的服务实例给到 gateway,然后将最新的服务实例更新到本地缓存中。


Ribbon 对注册中心服务拉取主要在 PollingServerListUpdater 这个类里面,通过获取 ribbon 的 ServerListRefreshInterval 自定义参数去拉取最新服务实例的频率,这里就简单介绍下 ribbon 负载均衡组件之一服务列表刷新器

//默认30秒去执行一次刷新private static int LISTOFSERVERS_CACHE_REPEAT_INTERVAL = 30 * 1000; // msecs;
复制代码



ribbon:  ServerListRefreshInterval: 3000
复制代码

将 gateway 的 yml 配置文件,设置 ribbon 的拉取最新服务实例的频率为 3s,这样就能配合着客户端服务的注册,实现服务的快速上下线。

总结

Nacos 服务注册和发现太慢这个问题,我也是在公司项目中发现,每次发布构建完项目,我通过 swaager 访问接口文档就会半天刷不出来,调用也是需要等一会才能调用,所以我就试着修改了项目的 Nacos 的心跳配置参数。


最后多 bb 几句,我们在学习技术了解技术底层的同时,本身就是服务于我们的业务的,根据自身项目的需求去制定匹配自己业务的配置,这也就是架构思想的开始,我们都不希望永远写代码,做技术的都想进阶当架构师,前提需要吃透底层逻辑,万变不离其宗,XDM 脚踏实地一步步来吧,保持学习,保持进步。


作者:Lxlxxx

链接:https://juejin.cn/post/7210744398639775805

来源:稀土掘金

用户头像

还未添加个人签名 2021-07-28 加入

公众号:该用户快成仙了

评论

发布
暂无评论
Nacos心跳机制实现快速上下线_Java_做梦都在改BUG_InfoQ写作社区