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

news2024/10/2 8:37:20

文章目录

    • 前言
    • 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-center
  cloud:
    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: true
    server:
      #三级缓存开关
      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-service
  cloud:
    config:
      uri: http://localhost:8086    #config服务端的地址
      label: master
      profile: dev              #开发环境

并在application.yml中配置actuator支持

#Actuator
management:
  endpoint:
    shutdown:
      enabled: false
  endpoints:
    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[…]说明更新配置广播完毕,所有的目标微服务的配置都完成了热更新!一次调用更新所有,大大简化了操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA(十)2022版本 Services中服务窗口不显示端口号解决

目录 一、问题描述二、问题分析三、解决方案3.1 设置启动参数【生效】3.2 方法二&#xff1a;设置环境变量【不生效】3.3 方法三&#xff1a;删除缓存【不生效】 四、补充&#xff1a;如何手动控制端口显示 一、问题描述 我们在使用 IDEA 的过程中&#xff0c;会发现在 Servic…

Midjourney V6超深度评测;开源人工智能:创新的前沿

&#x1f989; AI新闻 &#x1f680; Midjourney V6超深度评测&#xff1a;超现实主义细节爆表 摘要&#xff1a;国外网友Andre Kovalev对Midjourney V6进行了超深度评测&#xff0c;发现V6相较于V5.2在图片真实感、细节表现方面有较大提升。V6拥有超现实主义的特点&#xff…

FA-分配行重分配报错【APP-OFA-48313】

FA-重分配行报错 已存在行只能分多次转移调整 Ref1&#xff1a; APP-OFA-48313 You Cannot Create Identical Distribution Lines with Transfer (Doc ID 336894.1) APPLIES TO: Oracle Assets - Version 11.5.10.0 and later Information in this document applies to any…

ESP32-UDP通信 (Arduino)

ESP32配置UDP通信 介绍 用户数据报协议UDP UDP&#xff08;User Datagram Protocol&#xff09;是一种在计算机网络中常用的传输层协议&#xff0c;它与TCP&#xff08;Transmission Control Protocol&#xff09;一样属于传输层协议的一种。UDP主要用于在网络中传输数据&…

算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

Hello&#xff0c;大家好&#xff0c;我是星恒 呜呜呜&#xff0c;今天给大家带来的又是一道经典的动归难题。 题目&#xff1a;leetcode 410给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k_ 个非空的连续子数组。设计一个算法使得这 k _个子数组…

【Linux】第三十三站:日志

文章目录 一、实现一个简单的日志1.简介2.可变参数3.错误等级4.时间5.打印每一条参数6.与前面的一些代码搭配使用 二、完整代码 一、实现一个简单的日志 1.简介 我们运行代码的时候&#xff0c;我们希望有各种各样的运行时候的一些信息。这也就是日志 它一半有日志时间&…

Python 字符串不可变性的优缺点

随着计算机技术的快速发展&#xff0c;越来越多的编程语言被发明出来&#xff0c;每种编程语言都有自己独特的特点和优势。以我经常使用python写爬虫为例&#xff0c;在 Python 中&#xff0c;字符串是不可变的&#xff0c;这意味着一旦字符串被创建&#xff0c;就不能被修改。…

【机组】微程序控制单元实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

Laykefu客服系统 任意文件上传漏洞复现

0x01 产品简介 Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系统,旨在帮助企业有效管理和提供优质的客户服务。 0x02 漏洞概述 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞,而且当请求中Cookie中的”user_name“不为…

嵌入式C语言基本编写规范

最重要的一条规则 编写代码时最重要的一条规则是&#xff1a;检查周围的代码并尝试模仿它。 作为维护人员&#xff0c;如果收到的补丁明显与周围代码的编码风格不同&#xff0c;这是令人沮丧的。这是不尊重人的&#xff0c;就像某人穿着泥泞的鞋子走进一间一尘不染的房子。 …

RT-Thread 17. 中断发送信号量后线程去处理信号量

1. 代码 //sem.c #include <rtthread.h> #include <rtdevice.h> #include "drv_gpio.h"#define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5#define LED3_PIN GET_PIN(B, 3) ALIGN(RT_ALIGN_SIZE) static char thread3_stack[1024]; static struct…

2023 IoTDB Summit:北京城建智控科技股份有限公司高级研发主管刘喆《IoTDB在城市轨道交通综合监控系统中的应用》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

CRM是什么软件?

阅读本文&#xff0c;你将了解&#xff1a;一、CRM是什么软件&#xff1b;二、CRM软件如何进行客户管理&#xff1b;三、CRM软件有什么价值&#xff1b;四、优秀案例分享。 一、CRM是什么软件 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

最佳 C++ 编译器

我喜欢 C&#xff0c;这已经不是什么秘密。我偏爱 C 的一个原因是&#xff0c;C 是一个“开放”的编程语言&#xff0c;任何人都可以使用自己喜欢的编译器。当然&#xff0c;C 编译器的种类也很多。同样&#xff0c; C IDE 也不少&#xff0c;我在之前的一个博客中讨论过这个话…

深度了解六西格玛培训:用MINITAB软件优化数据处理和项目管理——张驰咨询

在追求卓越的道路上&#xff0c;六西格玛培训不仅是一种管理哲学&#xff0c;更是一套科学精细的工具箱。它起源于摩托罗拉的制造车间&#xff0c;但如今它的精粹已经应用到各个行业&#xff0c;无论规模大小&#xff0c;都在追求完美的产品和服务质量。 在张驰咨询&#xff0…

SwiftUI 纯手工打造 100% 可定制的导航栏

功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…

Unity SRP 管线【第五讲:URP烘培光照】

本节&#xff0c;我们将跟随数据流向讲解UEP管线中的烘培光照。 文章目录 一、URP烘培光照1. 搭建场景2. 烘培光照参数设置MixedLight光照设置&#xff1a;直观感受 Lightmapping Settings参数设置&#xff1a; 3. 我们如何记录次表面光源颜色首先我们提取出相关URP代码&#…

ctfshow-反序列化(web267-web270)

目录 web267 web268 web269 web270 总结 web267 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具&#xff0c;它提供了一些基础功能和规范&#xff0c;可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架&#xff0c;它们提供…

基于Java SSM框架实现共享充电宝管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现共享充电宝管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享充电宝管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带…