SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

本文主要是介绍SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言
    • 1.痛点
    • 2.解决方案
    • 3.具体实现
      • 3.1搭建热配置服务
      • 3.2编写配置文件
      • 3.3搭建版本控制仓库
      • 3.4Eureka-Client引入以下依赖
      • 3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载
      • 3.6分别编写测试Controller
      • 3.7测试效果
      • 3.8下线场景压测
    • 4.SpringCloudBus优化

前言

在上文讲到,在发布服务的场景下通过MQ利用“下线”这一事件驱动去更新Ribbon缓存,搭配上更改Eureka的两个配置信息成功实现了Eureka服务下线无感知。当时就说这个过程中存在一个非常鸡肋的地方,就是在通知前要去更改Eureka的配置参数。本文将通过配置热更新搭配SpringCloudBus消息总线的方式来将其解决。

1.痛点

发布服务场景特殊,如果关闭Eureka-Server三级缓存、对Eureka-Client的参数进行修改势必会对高可用性产生影响。如果可以在这个过程中进行配置热更新,在下线旧服务发布新服务这一特定情况下对Eureka配置进行更改做到既支持服务的无感知下线,又不影响非此场景下Eureka的性能就好了。

2.解决方案

使用SpringCloudConfig+Actuator+Git来实现配置热更新,服务发布的场景下热更新配置,人为保证Eureka数据强一致用来实现服务下线无感知。服务发布完恢复Eureka原生配置保证高可用。总结来看就是在对服务数据一致性有要求的情况下,去做到一致性;没有此要求的情况下去还原高可用
在这里插入图片描述

3.具体实现

3.1搭建热配置服务

在这里插入图片描述
引入依赖:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId><version>2.2.3.RELEASE</version></dependency>
</dependencies>

3.2编写配置文件

#服务端口
server:port: 8086#指定应用名称
spring:application:name: config-centercloud:config:label: master #配置git仓库分支server:git:uri: https://gitee.com/lazy-sheep-java/cloud-config.git #配置git仓库地址search-paths: cloud-config/application.yml #配置仓库路径#username:  git_username #访问git仓库的用户名,公开仓库不配置用户名#password: git_password #访问git仓库的用户密码,公开仓库不配置密码

3.3搭建版本控制仓库

创建一个yml配置文件
在这里插入图片描述
application-dev.yml文件内容
声明:该文件内容是和项目中的参数一致的,没有作出更改

eureka:client:registry-fetch-interval-seconds: 3#每次获取全量注册信息disable-delta: true#服务消费者从注册中心拉取服务列表fetch-registry: trueserver:#三级缓存开关useReadOnlyResponseCache: false

3.4Eureka-Client引入以下依赖

<!-- spring cloud config 客户端 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载

spring:application:name: payment-servicecloud:config:uri: http://localhost:8086    #config服务端的地址label: masterprofile: dev              #开发环境

并在application.yml中配置actuator支持

#Actuator
management:endpoint:shutdown:enabled: falseendpoints:web:exposure:include: "*"

3.6分别编写测试Controller

@RestController
@RefreshScope
public class TryConfigController {@Value("${eureka.client.registry-fetch-interval-seconds}")private String seconds;@GetMapping("info")public String info(){return seconds;}
}
@RestController
@RefreshScope
public class TryController {@Value("${eureka.server.useReadOnlyResponseCache}")private String flag;@GetMapping("info")public String info(){return flag;}
}

3.7测试效果

到此时Eureka-Client端application.yml中的核心配置参数eureka.client.registry-fetch-interval-seconds的值为10秒,并且Eureka-server端三级缓存为开启状态
在这里插入图片描述

我们启动所有微服务,访问测试Controller的接口,观察该属性的值:
在这里插入图片描述在这里插入图片描述
可以看到为10S,与此同时观察控制台日志输出情况,Eureka-Client拉取Eureka-Server端的服务列表时间间隔:在这里插入图片描述
可见此时Eureka配置参数还与该模块下的application.yml保持一致!
在不全程不重启微服务的前提下,当我们向存在git仓库中的application-dev.yml文件进行更改(关闭了三级缓存,将Eureka-Client从Eureka-server拉取服务列表的时间变为2S),并且push上去。
在这里插入图片描述

在这里插入图片描述
此时分别调用Actuator提供的动态刷新接口去刷新对应微服务的热配置http://localhost:8088/actuator/refresh,http://localhost:10086/actuator/refresh,刷新成功并返回了如下结果:
在这里插入图片描述
在这里插入图片描述
此时调用测试接口,测试Eureka配置属性变化:
在这里插入图片描述
在这里插入图片描述
这说明不重启情况下完成了配置热更新,为了进一步观察效果,直接去日志中查看:
在这里插入图片描述
这说明热更新成功实现!

3.8下线场景压测

基于此,去做Eureka服务下线感知情况的压测,调用下线接口后立即压测,观察下线服务是否被负载均衡到:
在这里插入图片描述
立即使用Jmeter压测,可以看到异常情况是没有的:
在这里插入图片描述
观察控制台,下线服务实例是否被负载均衡到?
8083
在这里插入图片描述
8081
在这里插入图片描述
8084
在这里插入图片描述
可见完全没问题,这时就可以kill掉下线的服务实例,去发布新服务了,当新服务发布完毕又去push配置来热更新还原原生配置保证Eureka高可用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.SpringCloudBus优化

Spring-Cloud-Bus:广播配置文件的更改或服务的监控管理,用于实现微服务的监控和相互通信,配合SpringCloudConfig使用,实现配置的动态刷新。当一个服务刷新数据时,将信息放入消息总线中,其他监听该消息总线的服务就能得到通知并更新自身的配置

整个流程下来相信大家可以深刻体会到,每次Git中的配置文件发生更改,我都要去基于属性变更的微服务去调用http://localhost:对应端口/actuator/refresh发送POST请求,如果服务集群部署数量较少那运维工作量还不算大,但反之就有点折磨运维老哥了。
基于此,可以使用SpringCloudBus的广播模式将配置文件更新的动作广播出去,让受其管理的微服务、集群都去刷新配置
具体实现如下:
1.在目标微服务中配置好mq(如文章上面所示),并引入Spring-Cloud-Bus的依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2.当Git中的配置文件更新,直接调用接口:http://localhost:任选一个服务列表中的端口/actuator/bus-refresh POST
在这里插入图片描述
即完成受Spring-Cloud-Bus管控的所有微服务的配置热更新:
在这里插入图片描述
出现Keys refreshed[…]说明更新配置广播完毕,所有的目标微服务的配置都完成了热更新!一次调用更新所有,大大简化了操作

这篇关于SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632830

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象