您现在的位置是:首页 > 正文

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

2024-04-01 07:25:31阅读 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脚踏实地一步步来吧,保持学习,保持进步。

网站文章

  • 索引本质

    索引本质

    https://www.cnblogs.com/novalist/p/6410964.html索引的本质MySQL官方对于索引的定义为:索引是帮助MySQL高效获取数据的数据结构。即可以理解为:索引是...

    2024-04-01 07:24:51
  • duilib中CTextUI控件设置文字时不刷新显示的bug

    duilib中CTextUI控件设置文字时不刷新显示的bug

    duilib CTextUI 文字不刷新显示

    2024-04-01 07:24:44
  • Dockerfile构建mysql 最新发布

    Dockerfile构建mysql 最新发布

    33062是主机的端口,3306是容器的mysql端口,容器名称–name mysql2,-v文件映射 主机/dockerval/mysql2对应/var/lib/mysql,最后mysql2是镜像名...

    2024-04-01 07:24:37
  • ajax异步调试,实现AJAX的基本步骤

    要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、UR...

    2024-04-01 07:24:31
  • 安装Kibana,kibana的使用教程

    安装Kibana,kibana的使用教程

    Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在ElasticSearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kib...

    2024-04-01 07:23:49
  • 【教程】PDF组件Spire.PDF 教程:如何在C#,VB.NET中将HTML样式化文本插入PDF

    【教程】PDF组件Spire.PDF 教程:如何在C#,VB.NET中将HTML样式化文本插入PDF

    Spire.PDF 是一个专业的PDF组件,能够独立地创建、编写、编辑、操作和阅读PDF文件,支持 .NET、WPF和Silverlight三个版本,本文介绍了如何通过Spire.PDF 在如何在C#,VB.NET中将HTML样式化文本插入PDF。

    2024-04-01 07:23:42
  • WPF 获取DataGrid里的模板内的ComboBox控件

    DataGridTemplateColumn tempColumn1 = GridName.Columns[0] as DataGridTemplateColumn; FrameworkElement...

    2024-04-01 07:23:36
  • electron 应用打包配置

    electron 应用打包配置

    一、安装 electron-buildernpm install electron-builder --save-dev二、 在 package.json 中配置文件{ "name": "cloud...

    2024-04-01 07:22:53
  • CentOS7 防火墙

    CentOS7 防火墙

    用centos7会发现,用以前的方式查看、打开和关闭防火墙都无效了。这是因为centos7的防火墙改用firewalld,而不再使用iptables了。1、先是看centos7的防火墙的状态,查看的命令为:sudo systemctl status firewalld.service或者sudo systemctl status firewalld或者systemctl status fi...

    2024-04-01 07:22:45
  • Kubernetes基础入门(完整版)

    Kubernetes基础入门(完整版)

    简介 Kubernetes这个名字源于希腊语,意为"舵手"或"飞行员”。k8s这个缩写是因为k和s之间有八个字符。Google在 2014年开源了Kubernetes项目...

    2024-04-01 07:22:37