【Spring Cloud】分布式配置动态刷新

news2024/11/17 7:47:54

目录

  • 问题
  • 解决方案
    • 1.使用Spring Boot Actuator监控接口【不推荐】
      • 流程图
      • 使用Spring Boot Actuator的步骤
    • 2.Spring Cloud Bus
      • 第一种方案问题
      • Spring Cloud Bus
      • 流程图
      • Spring Cloud Bus实现客户端刷新的步骤
      • 开发准备
      • 实现
        • 1. 在config-server中添加依赖
        • 2.在config-server中添加配置
          • application.yml
          • bootstrap.yml
        • 3.在config-client中添加依赖
        • 4.在config-client中添加配置
          • application.yml
          • bootstrap.yml

上一篇博客讲了一下SpringCloud的分布式配置: 【Spring Cloud】分布式配置,但是存在一些问题,如:如何动态刷新?

问题

  • 目前已经掌握了Spring Cloud Config配置中心的的用法,但是当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,需要客户端重启才可以获取最新的信息。
  • 因此我们需要客户端能够动态进行更新,幸好Spring Cloud官方已经给出方案,所以我们只需要使用就行了。

解决方案

1.使用Spring Boot Actuator监控接口【不推荐】

  • Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。
  • 所有的这些特性可以通过JMX或者HTTP endpoints来获得。
  • 根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时获取系统应用的各项监控指标。

总结成一句话:Spring Boot Actuator是监控系统健康情况的工具。

流程图

在这里插入图片描述

使用Spring Boot Actuator的步骤

  • 第一步:在config-client中添加POM依赖。

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  • 第二步:添加配置信息

    management:
    	endpoints:
    		web:
    			exposure:
    				inclued: refresh
    
  • 第三步:添加@RefreshScope注解,启动demo-gateway项目。

  • 第四步:修改Git仓库demo-gateway-dev.properties文件中eureka.port的值。

  • 第五步:使用POSTMAN 通过POST请求发送到http://localhost:7600/actuator/refresh

  • 第六步:访问http://localhost:8085/port 可以看到配置内容被更新了

2.Spring Cloud Bus

第一种方案问题

  • 第一种解决方案中,我们客户端发现每次获取最新配置都需要手动进行刷新,如果少的的话还可以使用,但是多的话就比较繁琐了,虽然我们可以使用类似Github的WebHook的工具。
  • WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。
  • 但是当客户端越来越多的时候WebHook已经不好使用了,每次新增客户端都需要更改WebHook会显得很麻烦,Spring Cloud官方给出了非常好的解决方案。
  • Spring Cloud Bus可以完美解决这一问题。

Spring Cloud Bus

  • Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。Spring Cloud Bus 将分布式的节点用轻量级的消息代理(RabbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
  • 大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一。

流程图

在这里插入图片描述

Spring Cloud Bus实现客户端刷新的步骤

  1. 提交代码触发post给Server端发送bus/refresh
  2. Server端接收到请求并发送给Spring Cloud Bus
  3. Spring Cloud Bus接到消息并通知给其它客户端
  4. 其它客户端接收到通知,请求Server端获取最新配置
  5. 全部客户端均获取到最新的配置

开发准备

  • Spring Cloud Bus 主要使用MQ进行消息的发送与接收。
  • 可以根据情况来进行选择,主要使用的是哪个MQ就用哪一个就行了。
  • 这里我们就用RabbitMQ作为示例来进行讲解。
  • 关于RabbitMQ的内容,可以看我之前的博客内容

实现

1. 在config-server中添加依赖
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
2.在config-server中添加配置
application.yml
server:
  port: 7900
spring:
  application:
    name: demo-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxxx/env_project.git
          search-paths: config-file
    bus:
      trace:
        enabled: true
  rabbitmq:
    host: 192.168.29.80
    port: 5672
    username: admin
    password: admin
eureka:
  client:
    service-url:
      defaultZone: http://192.168.2.220:7776/eureka/
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
bootstrap.yml
encrypt:
  key: demo-config-server
3.在config-client中添加依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
4.在config-client中添加配置
application.yml
server:
  port: 8085
eureka:
  client:
    service-url:
      defaultZone: http://192.168.2.220:7776/eureka/
spring:
  rabbitmq:
    host: 192.168.29.80
bootstrap.yml
spring:
  cloud:
    config:
      uri: http://localhost:7900
      profile: dev
      label: dev
      name: demo-gateway
  application:
    name: demo-config-client

在这里插入图片描述在这里插入图片描述

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

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

相关文章

动手学操作系统(四、MBR读取硬盘加载Loader)

动手学操作系统&#xff08;四、MBR读取硬盘加载Loader&#xff09; 在上一节中&#xff0c;我们学习了使用MBR来直接控制显卡进行显示&#xff0c;在这一节中我们学习如何让MBR来操作硬盘&#xff0c;加载Loader来完成操作系统的后续启动过程。 文章目录 动手学操作系统&…

OrangePi_Kunpeng_Pro开发板测验——性能巨人

文章目录 &#x1f4d1;前言一、开箱初体验的愉悦二、产品规格概述三、前置工作四、性能测试4.1 CPU 性能测试4.1.1 单线程 CPU 测试4.1.2 多线程 CPU 测试 4.2 内存性能测试4.2.1 内存读写性能测试4.2.2 高负载内存测试 4.3 I/O 性能测试4.4 网络性能测试4.5 测试小结4.5.1 CP…

基于广义极大极小凹惩罚的心电信号降噪方法(MATLAB R2021B)

凸优化是数学最优化的一个子领域&#xff0c;研究定义于凸集中的凸函数最小化问题。由于心电信号降噪的过程可以理解为求信号的稀疏近似解&#xff0c;因此基于凸优化和稀疏性表达的去噪方法可用于心电信号处理。在凸优化的数学模型中&#xff0c;惩罚项的选取对最终结果会产生…

那些不起眼但很好玩的API合辑

那些不起眼但很好玩的API&#xff0c;为我们带来了许多出人意料的乐趣和惊喜。这些API可能看起来并不起眼&#xff0c;但它们却蕴含着无限的创意和趣味性。它们可以是一些小游戏API&#xff0c;让我们可以在闲暇时刻尽情娱乐&#xff1b;也可以是一些奇特的音乐API&#xff0c;…

gradio image 类型

3种类型&#xff0c;默认是 numpy.array numpy.array PIL.Image str file path. 互相转换 # 从路径到 numpy.ndarray import cv2 image_mask cv2.imread(imagePath) print(type(image_mask))# 从路径到 PIL.IMAGE from PIL import Image image_maskImage.open(imagePath) pri…

zynq PS端 GPIO

记录一下PS端 GPIO 1. GPIO 简介 ZYNQ PS 中包含一组丰富的外设&#xff0c;用于和外部设备进行通信。ZYNQ 的 IO 包括对外连接的 GPIO 和内部 PS 与 PL 通信的 AXIO。其中对外的 GPIO 又分为两种&#xff1a;MIO 和 EMIO。 MIO 和 EMIO 只是 GPIO 信号的两种接口&#xff0c…

wangEditor富文本实现自定义插入数据(手把手)

插件版本如下: vue2版本 “@wangeditor/editor”: “^5.1.23”, “@wangeditor/editor-for-vue”: “^1.0.2”, 文件截图如下: 一、plugins/index.js 入口文件,整合模块导出外部使用 import withMention from ./plugin import renderElemConf from ./render-elem import …

ES升级--04--SpringBoot整合Elasticsearch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringBoot整合Elasticsearch1.建立项目2.Maven 依赖[ES 官方网站&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html](…

C++ vector 模拟实现

vector的底层也是一个动态数组&#xff0c;他与 string 的区别就是&#xff0c;string 是专门用来存储字符类数据的&#xff0c;为了兼容C语言&#xff0c;使用C语言的接口&#xff0c;在string的动态数组内都会都开一块空间用来存 \0 &#xff0c;而vector则不会。 首先我们要…

水电收费远程抄表

1.前言&#xff1a;从传统到现代的改变 水电收费远程抄表&#xff0c;是科学技术在公共服务领域的一次重要运用&#xff0c;它改变了过去人力上门服务抄表的传统模式&#xff0c;提高了高效率&#xff0c;降低了偏差&#xff0c;为群众与企业带来了极大的便利。这种系统运用智…

富途面试题:用面向对象的思想设计人关门的场景

我工作两年后&#xff0c;有一次不成功的富途证券的面试&#xff0c;印象非常深刻&#xff0c;面试官提出了一个看似简单实则充满深意的问题&#xff1a;如何用面向对象的思想设计一个人关门的场景&#xff1f; 我当时是这样设计的&#xff0c;创建两个类&#xff1a;Person和D…

Linux命令那么多,先来一篇文件和目录管理命令!

&#x1f4a1;本文建议大家收藏&#xff01; 文件和目录管理命令 1. ls - 列出目录内容 ls命令是Linux中最常用的命令之一&#xff0c;用于列出目录中的文件和子目录。 ls显示当前目录下的所有文件和目录。 ls -l以长格式列出目录内容&#xff0c;显示文件权限、所有者、大…

云途探索——移动云云日志接入实践

目录 1 前言2 新手入门2.1 前置条件2.2. 配置采集对象及规则2.3 安装Agent2.4 日志管理 3 使用场景3.1 优势3.2 应用场景 4 总结 1 前言 随着人工智能、大数据、物联网以及云计算时代的到来&#xff0c;在日志数据量持续爆增、日志数据日益多样化的今天&#xff0c;传统日志服…

Java(六)——抽象类与接口

文章目录 抽象类和接口抽象类抽象类的概念抽象类的语法抽象类的特性抽象类的意义 接口接口的概念接口的语法接口的特性接口的使用实现多个接口接口与多态接口间的继承抽象类和接口的区别 抽象类和接口 抽象类 抽象类的概念 Java使用类实例化对象来描述现实生活中的实体&…

[数据集][图像分类]家庭场景下的家具分类数据集1010张101类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1010 分类类别数&#xff1a;101 类别名称:[“bath_bath”,“bath_heated_t…

java版CRM客户关系管理系统源码-CRM客户关系管理系统的技术架构与功能实现

CRM客户关系管理系统的技术架构与功能实现 一、引言 随着市场竞争的日益激烈&#xff0c;客户关系管理&#xff08;CRM&#xff09;已成为企业赢得市场、提升客户满意度、促 进业务增长的关键手段。本文旨在介绍一款先进的CRM客户关系管理系统的技术架构与功能实现&#xff0…

C++:类的内存分布

类的成员变量和方法是分开存储的&#xff0c;内存给类实例化出的对象开辟空间时只开辟成员变量所占用的空间。类中的所有方法&#xff08;成员函数&#xff09;都会放在代码区&#xff0c;所以类的大小一般只计算类中成员变量的对齐之后大小的综合&#xff08;如果没有虚函数的…

Java设计模式 _行为型模式_观察者模式

一、观察者模式 1、观察者模式 观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象。 2、实现思路 &#xff08;1&#xff09;、定义被观察者的行为&…

ETLCloud中如何执行SQL脚本

SQL脚本 在数据库管理与数据分析的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;脚本扮演着举足轻重的角色。作为一门专为关系型数据库设计的编程语言&#xff0c;SQL不仅能够执行数据的检索、更新、插入及删除等基…

算法与数据结构:二叉排序树与AVL树

ACM大牛带你玩转算法与数据结构-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a; 哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep66799?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说系列课程-年度会…