当前位置: 首页 > news >正文

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优化
    • 5.写到最后

前言

在上文讲到,在发布服务的场景下通过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: 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,正常情况会返回一个204
在这里插入图片描述
即完成受Spring-Cloud-Bus管控的所有微服务的配置热更新:
在这里插入图片描述
出现Keys refreshed[…]说明更新配置广播完毕,所有的目标微服务的配置都完成了热更新!一次调用更新所有,大大简化了操作

5.写到最后

以下是项目开源地址,欢迎大家体验:项目地址请点我!
在这里插入图片描述

相关文章:

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

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

郑州大学2024年寒假训练 Day7:数论

感觉这一块讲的有点太少了&#xff0c;只有辗转相除法&#xff0c;拓展欧几里得定理&#xff0c;素数筛&#xff0c;快速幂和逆元五个内容。数论的内容远远不止这些。不过一个视频也讲不了太多东西&#xff0c;讲的还是数学&#xff0c;也是没有办法。一边看题一边说吧。 辗转…...

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的&#xff1a;检测在一个窗口中是否有物体。 eg:以猫脸检测举例&#xff0c;当给出一张图片时&#xff0c;我们需要框出猫脸的位置并给出猫脸的大小&#xff0c;如…...

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

LaWGPT—基于中文法律知识的大模型

文章目录 LaWGPT&#xff1a;基于中文法律知识的大语言模型数据构建模型及训练步骤两个阶段二次训练流程指令精调步骤计算资源 项目结构模型部署及推理 LawGPT_zh&#xff1a;中文法律大模型&#xff08;獬豸&#xff09;数据构建知识问答模型推理训练步骤 LaWGPT&#xff1a;基…...

一文弄明白KeyedProcessFunction函数

引言 KeyedProcessFunction是Flink用于处理KeyedStream的数据集合&#xff0c;它比ProcessFunction拥有更多特性&#xff0c;例如状态处理和定时器功能等。接下来就一起来了解下这个函数吧 正文 了解一个函数怎么用最权威的地方就是 官方文档 以及注解&#xff0c;KeyedProc…...

alibabacloud学习笔记06(小滴课堂)

讲Sentinel流量控制详细操作 基于并发线程进行限流配置实操 在浏览器打开快速刷新会报错 基于并发线程进行限流配置实操 讲解 微服务高可用利器Sentinel熔断降级规则 讲解服务调用常见的熔断状态和恢复 讲解服务调用熔断例子 我们写一个带异常的接口&#xff1a;...

Code Composer Studio (CCS) - Licensing Information

Code Composer Studio [CCS] - Licensing Information 1. Help -> Code Composer Studio Licensing Information2. Upgrade3. Specify a license fileReferences 1. Help -> Code Composer Studio Licensing Information 2. Upgrade ​​​ 3. Specify a license file …...

uniapp引入微信小程序直播组件

方法1.小程序跳转视频号直播 微信小程序跳转到视频号 1.1微信开放平台注册 https://open.weixin.qq.com/ 2.2 方法2.使用小程序提供的直播组件 参考 微信小程序跳转视频号直播 小程序直播官方文档 https://developers.weixin.qq.com/miniprogram/dev/component/live-play…...

五个简单的C#编程案例

案例一&#xff1a;Hello, World! csharp using System; class Program { static void Main() { Console.WriteLine("Hello, World!"); } } 这个案例是最基础的C#程序&#xff0c;它打印出“Hello, World!”到控制台。每个C#程…...

Zlibrary低调官宣2024年最新网址,国内可直接访问,免费下载海量电子书籍

最近过节&#xff0c;文章也没怎么写&#xff0c;明天要上班了&#xff0c;今天写篇文章做个预热。 春节期间&#xff0c;“知识大航海”群里&#xff0c;有位群友分享了一个Zlibrary的最新地址&#xff0c;感谢这位群友妹妹的热心分享&#xff0c;这个地址国内可以直接访问。 …...

Android 开机启动

一、添加权限 <uses-permission android:name"android.permission.RECEIVE_BOOT_COMPLETED"/> 二、写一个广播接收器 public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if(Intent.ACT…...

二叉树相关算法需了解汇总-基础算法操作

文章目录 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历102.二叉树的层序遍历107.二叉树的层次遍历倒序199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针104.二叉树的最大深度111.二叉…...

万字干货-京东零售数据资产能力升级与实践

开篇 京东自营和商家自运营模式&#xff0c;以及伴随的多种运营视角、多种组合计算、多种销售属性等数据维度&#xff0c;相较于行业同等量级&#xff0c;数据处理的难度与复杂度都显著增加。如何从海量的数据模型与数据指标中提升检索数据的效率&#xff0c;降低数据存算的成…...

探索前端框架的世界:一场前端之旅

在网络世界中&#xff0c;网页开发领域的一颗明星是前端框架。这些框架为开发者提供了丰富的工具和技术&#xff0c;帮助他们构建出漂亮、高效的网页应用。现在&#xff0c;让我们随着小明的故事一起来探索一下吧。 小明的梦想 小明是一位年轻有为的前端开发者&#xff0c;他…...

class complex

class complex from C_OOP_base1_houjie complex.h #ifndef __COMPLEX__ // 防卫式声明 guard; 名称自定义 #define __COMPLEX__// 0. forward declarations class complex;complex& __doapl (complex* ths, const complex& r);// 1. class declarations class compl…...

数据库系统概论整理与总结

数据库系统概论 第一章&#xff1a;绪论 四个基本概念 四个概念 数据&#xff1a;Data 数据库&#xff1a;DataBase 数据库管理系统:DBMS 数据库系统:DBS 打个比喻&#xff0c;比如说菜鸟物流&#xff1a; Data&#xff1a;快递 DB&#xff1a;物流厂库 DBMS&#xff1a;对…...

打通新势力NAS权限壁垒,绿联私有云安装Portainer,实现更强大的Docker功能

打通新势力NAS权限壁垒&#xff0c;绿联私有云安装Portainer&#xff0c;实现更强大的Docker功能 对于国产新势力NAS来说&#xff0c;因为安全问题并没有完全开放SSH权限&#xff0c;所以还不能和传统NAS那样直接通过Docker run命令来部署容器&#xff0c;同时&#xff0c;对于…...

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…...

RedisDesktopManager无法远程连接到Linux虚拟机中Redis的docker容器的一种解决方案

1.问题描述 除了RedisDesktopManager以外&#xff0c;使用java代码也无法连接到centos7虚拟机中的docker容器中的Redis &#xff0c;按照网上其他博主的解决方案&#xff0c;在排除Linux防火墙问题&#xff0c;端口映射问题&#xff0c;redis.conf配置文件问题以后&#xff0c…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...