Spring Cloud Alibaba NacosNacos心跳机制实现快速上下线
Posted 逆流°只是风景-bjhxcc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Alibaba NacosNacos心跳机制实现快速上下线相关的知识,希望对你有一定的参考价值。
文章目录
前言
我们都知道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进行配置的接口就行。
这里可以看到StandardClassMetadata
、MethodsMetadata
、SimpleAnnotationMetadata
继承了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的心跳配置参数。
我们在学习技术了解技术底层的同时,本身就是服务于我们的业务的,根据自身项目的需求去制定匹配自己业务的配置,这也就是架构思想的开始,我们都不希望永远写代码,做技术的都想进阶当架构师,前提需要吃透底层逻辑,万变不离其宗,保持学习,保持进步。
Spring Cloud Alibaba入门十:Nocas配置中心使用
1. 项目pom.xml引入依赖文件
<!-- 1.引入Nacos配置中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 创建bootstrap.yml配置文件
Nacos的Data ID详解:
Nacos配置管理中,配置文件的Data ID的默认格式如下:
${prefix}
Nacos配置管理中,配置文件的Data ID的完整格式如下:
${prefix} - ${spring.profiles.active} . ${file-extension}
Data ID格式说明:
1.${prefix}默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置
注意:除了默认配置文件(spring.application.name)的Data ID,其他配置文件的Data ID必须写上后缀
2.${spring.profiles.active}取spring.profiles.active的值,如(dev、prod、test)
注意:当${spring.profiles.active}为空时,对应的连接符"-"也将不存在,Data ID的拼接格式变成${prefix}.${file-extension}
3.${file-extension}为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置;目前只支持properties和yaml类型
4.建议采用默认格式,使用不同的表空间来放置不同的配置文件
spring:
application:
应用名称(Nacos会将该名称当做服务名称,同时也是配置管理中默认的Data ID)
name: nacos-config-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
指定命名空间,默认:public
namespace: pro
# 指定命名空间下的分组,默认:DEFAULT_GROUP
group: order
# Nacos配置管理中dataId的前缀名称,默认为spring.application.name的值
prefix: com.qfx.springcloud.config
# Nacos配置管理中配置内容的数据格式,默认.Properties(可不写)
file-extension: yaml
# ==========↑↑↑↑↑↑ 一般情况只需要以上的这些配置信息就可以了 ↑↑↑↑↑↑==========
# 引用其他配置文件(方式一),以数组形式存放,文件优先级低于extension-configs引用方式
shared-configs:
# 下标[0],下标越大优先级越高
- data-id: com.qfx.springcloud.common.properties
# 动态感知Nacos配置文件信息的改变,默认false
refresh: true
# 默认DEFAULT_GROUP
group: common-001
# 下标[1],下标越大优先级越高
- data-id: com.qfx.springcloud.common.properties
refresh: true
# 引用其他配置文件(方式二),以数组形式存放,文件优先级高于shared-configs引用方式
extension-configs:
# 下标[0],下标越大优先级越高
- data-id: com.qfx.springcloud.common.properties
refresh: true
group: common-002
# 下标[1],下标越大优先级越高
- data-id: com.qfx.springcloud.common.properties
refresh: true
group: common-003
# 配置文件优先级(优先级大的会覆盖优先级小的,并形成互补),唯独prefix与默认配置文件(spring.application.name)互斥,prefix会覆盖默认配置文件,默认配置中所有配置信息都不会生效
# 优先级如下:
# spring.cloud.nacos.config下的prefix完整格式
# ↓
# spring.cloud.nacos.config下的prefix默认格式
# ↓
# 默认配置文件(spring.application.name)
# ↓
# extension-configs(下标越大优先级越高)
# ↓
# shared-configs(下标越大优先级越高)
## 3. Nacos新建配置信息
> 在Nacos中创建配置文件,namespace、group等信息要符合bootstrap.yml配置文件中迪对应
```shell
server:
port: 8070
4. 配置文件引用
4.1 方式一:把配置信息都放置在Nacos中
4.2 方式二:把配置信息变量放置在Nacos中
4.2.2 创建application.yml文件
# 以下内容建议放置在application.properties或者application.yml文件中,优先级:application.properties > application.yml
spring:
datasource:
driver-class-name: ${my.datasource.driver-class-name}
url: ${my.datasource.url}
username: ${my.datasource.username}
password: ${my.datasource.password}
以上是关于Spring Cloud Alibaba NacosNacos心跳机制实现快速上下线的主要内容,如果未能解决你的问题,请参考以下文章