热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实战讲解Spring配置中心Config同步更新配置信息(图+文)

1缘起本文接着上一篇文章:实践讲解Spring配置中心confighttps:blog.csdn.netXin_101articledetails127584130




1 缘起

本文接着上一篇文章:实践讲解Spring配置中心confighttps://blog.csdn.net/Xin_101/article/details/127584130,实现配置中心文件刷新后自动同步到其他服务,
保证了连接到配置中心的服务实时获取最新的配置文件,
同样,以图文的方式讲解工程实现,
实现原理会在后续的文章中讲解。


2 架构

Spring配置中心Config自动同步配置文件的架构及实现流程架构如下图所示,
由图可知,Spring配置中心Config使用总线的方式,将变更的消息同步到消息队列Q,
分发到其他服务监听消息队列(Q1,Q2,…,Qn),
其他服务将消息加载到各自的内存中。
连接到配置中心的其他服务,会在各自的服务中创建并监听对应的队列(Q1,Q2,…,Qn),
这样,其他服务的数据会同步更新。
在这里插入图片描述
服务启动后,注册中心监控面板如下图所示,
由图可知,有两个服务:CONFIG和COMMON两个服务注册到Eureka,
其中,CONFIG为Spring配置中心,COMMON为测试的服务。
在这里插入图片描述
Spring配置中心和测试的一个服务启动后,会各自创建并监听对应的队列,
RabbitMQ的监控的队列如下图所示,
由图可知,Spring配置中心监听的队列:springCloudBus.anonymous.2s6VCOyFS2iH-KlGKKaz6g
其他服务监听的队列:springCloudBus.anonymous.ZfL2pRe2Q6WWZSoUK5V7mg
在这里插入图片描述


3 配置中心SpringConfig

自动同步配置文件变更,需要引入总线组件,Spring提供的总线组件:bus-amqp,
很好地解决了配置中心数据变更分发的问题,
连接到SpringConfig的服务可以同步自动获取变更的内容。


3.1 依赖

新引入的依赖有bus-amqp和actuator,
bus-amqp用于消息传递,actuator用于URL监听,触发消息同步。


<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.2.3.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
dependency>

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>

3.2 配置参数

配置参数中有两点变更&#xff0c;配置如下&#xff1a;
&#xff08;1&#xff09;使用本地路径存储配置文件&#xff0c;用于测试文件变更&#xff08;替换resources&#xff0c;这里服务启动后无法变更&#xff09;&#xff1b;
&#xff08;2&#xff09;暴露触发数据更新的URI&#xff0c;用于触发数据传递&#xff08;通过队列&#xff09;。

spring:
application:
name: config
profiles:
active: native
cloud:
config:
server:
native:
search-locations: file:D:/JProject/spring-config-file
rabbitmq:
host: localhost
port: 5672
username: xindaqi
password: 123456
publisher-confirm-type: correlated
publisher-returns: true
virtualHost: /tutorial
listener:
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
concurrency: 1
max-concurrency: 1
retry:
enabled: true
server:
port: 9002
servlet:
session:
timeout: PT10S
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8001/eureka/eureka
management: # 暴露监控路径
endpoints:
web:
exposure:
include: bus-refresh

3.3 共用的配置文件

共用的配置文件&#xff1a;D:/JProject/spring-config-file/application-dev.yml&#xff0c;
其中&#xff0c;my.config用于测试文件内容变更。

spring:
devtools:
restart:
enabled: true
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_monkey_run?useUnicode&#61;true&characterEncoding&#61;UTF-8&useSSL&#61;false&serverTimezone&#61;Asia/Shanghai
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 6000
filters: stat, wall
stat-view-servlet:
enabled: true
login-username: admin
login-password: 123456
logging:
level:
root: DEBUG
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count&#61;countSql
my:
config: xiaohuahua

3.4 启动

注意使用&#64;EnableConfigServer开启配置中心。

package com.monkey.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* 启动类.
*
* &#64;author xindaqi
* &#64;date 2021-04-30 18:22
*/

&#64;SpringBootApplication
&#64;EnableConfigServer
public class ConfigApplication {
private static final Logger logger &#61; LoggerFactory.getLogger(ConfigApplication.class);
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
logger.info(">>>>>>>>Config启动成功");
}
}

启动服务时&#xff0c;会监听队列&#xff0c;日志信息如下图所示。
在这里插入图片描述


3.5 修改共用文件内容

初始文件内容&#xff1a;

my:
config: xiaohuahua

变更后的内容&#xff1a;

my:
config: xiaolanlan

3.6 刷新参数

通过刷新接口&#xff0c;将最新数据同步到队列&#xff0c;并触发数据同步。
测试结果如下图所示&#xff0c;
这里&#xff0c;没有响应体&#xff0c;只有响应码&#xff1a;204。
在这里插入图片描述
刷新数据时&#xff0c;RabbitMQ中的数据监控如下图所示&#xff0c;
虽然没有在队列中看到数据&#xff0c;但是&#xff0c;通过消息速率&#xff0c;
可知&#xff0c;确实是有数据经过该队列的。
在这里插入图片描述


4 其他服务配置

与Spring配置中心一样&#xff0c;需要总线和接口监控组件&#xff0c;
集成bus-amqp和actuator。


4.1 依赖

依赖如下&#xff1a;


<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.2.3.RELEASEversion>
dependency>

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-clientartifactId>
dependency>

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>

4.2 配置参数

直接使用bootstrap.yml&#xff0c;内容如下&#xff1a;
说明&#xff1a;不配置application.yml&#xff0c;因为没有使用config配置中心时&#xff0c;application.yml配置了其他的环境文件&#xff08;application-dev.yml等&#xff09;&#xff0c;
当使用config配置中心的文件测试时&#xff0c;使用公共环境文件替代了项目中的环境文件&#xff08;application-dev.yml等&#xff09;。

spring:
cloud:
config:
discovery:
enabled: true # 开启发现spring-config服务
service-id: config # spring-config服务ID
name: application # spring-config服务中的配置文件前缀
profile: dev # spring-config服务中的配置文件后缀&#xff0c;完整&#xff1a;application-dev.yml
rabbitmq:
host: localhost
port: 5672
username: xindaqi
password: 123456
publisher-confirm-type: correlated
publisher-returns: true
virtualHost: /tutorial
listener:
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
concurrency: 1
max-concurrency: 1
retry:
enabled: true
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8001/eureka/eureka
management: # 暴露监控路径
endpoints:
web:
exposure:
include: bus-refresh

4.3 接口

为测试配置自动刷新&#xff0c;使用&#64;Value读取配置配置my.config&#xff0c;
使用&#64;RefreshScope触发获取变更的数据&#xff0c;样例如下&#xff1a;

package com.monkey.common.api;
import com.monkey.common.common.response.Response;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 配置数据接口.
*
* &#64;author xindaqi
* &#64;since 2022-10-28 17:46
*/

&#64;RestController
&#64;RequestMapping("/api/v1")
&#64;RefreshScope
public class ConfigDataApi {
&#64;Value("${spring.datasource.url}")
String datasourceUrl;
&#64;Value("${my.config}")
String myConfig;
&#64;GetMapping("/datasource/url")
public Response<String> getDatasourceUrl() {
return Response.success(datasourceUrl);
}
&#64;GetMapping("/my-config")
public Response<String> getMyConfig() {
return Response.success(myConfig);
}
}

第一次的读取配置文件结果如下图所示。
在这里插入图片描述
当Spring配置中心变更数据时&#xff0c;对应的其他客户端&#xff08;连接到配置中心的服务&#xff09;监听的队列会同步获取到消息&#xff0c;
日志信息如下图所示。
在这里插入图片描述
更直观的展示通过RabbitMQ监控面板可以看到&#xff0c;如下图所示&#xff0c;
由图可知&#xff0c;有新的数据入队&#xff0c;并被消费&#xff0c;此时&#xff0c;该服务内存中的配置数据已自动更新。

在这里插入图片描述

第二次的读取配置文件结果如下图所示&#xff0c;数据自动更新成功。
在这里插入图片描述


5 小结

&#xff08;1&#xff09;自动同步更新配置中心数据&#xff1a;通过bus-amqp和开放刷新接口实现&#xff1b;
&#xff08;2&#xff09;Spring配置中心和其他连接到配置中心的服务会各自监听一个队列&#xff0c;同步消息&#xff1b;
&#xff08;3&#xff09;在配置中心刷新数据&#xff0c;并通过总线方式&#xff0c;同步消息到其他队列&#xff0c;其他服务通过&#64;RefreshScope更新数据。







推荐阅读
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 一文了解消息中间件RabbitMQ
    消息中间件---RabbitMQ1消息中间件的作用2.常用的消息中间件3消息中间件RabbitMQ3.1RabbitMQ介绍3.3RabbitMQ的队列模式3.3RabbitMQ的 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 本课程详细解析了Spring AOP的核心概念及其增强机制,涵盖前置增强、后置增强和环绕增强等类型。通过具体示例,深入探讨了如何在实际开发中有效运用这些增强技术,以提升代码的模块化和可维护性。此外,还介绍了Spring AOP在异常处理和性能监控等场景中的应用,帮助开发者更好地理解和掌握这一强大工具。 ... [详细]
  • 在RabbitMQ中,消息发布者默认情况下不会接收到关于消息在Broker中状态的反馈,这可能导致消息丢失的问题。为了确保消息的可靠传输与投递,可以采用确认机制(如发布确认和事务模式)来验证消息是否成功抵达Broker,并采取相应的重试策略以提高系统的可靠性。此外,还可以配置消息持久化和镜像队列等高级功能,进一步增强消息的可靠性和高可用性。 ... [详细]
  • 黄聪:MySQL主从复制配置,实现高效读写分离
    大型网站为应对高并发访问,不仅需要在前端实现分布式负载均衡,还需在数据业务和访问层采取有效措施。采用传统的数据结构已无法满足需求,通过配置MySQL主从复制,可实现高效的读写分离,显著提升系统性能和稳定性。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 从单机存储进化为接口和存储的分离概述接口服务层对外提供REST服务,数据服务层提供数据存储功能。两者之间通过消息队列进行通信,数据服务层的所有数据服 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • IIS配置大全:从基础到高级的全面指南
    IIS配置详解:从基础到高级的全面指南IIS前端配置与web.config文件紧密相关,相互影响。本文详细介绍了如何设置允许通过的HTTP请求方法,包括HEAD、POST、GET、TRACE和OPTIONS。提供了两种主要的配置方法,并探讨了它们在实际应用中的优缺点。此外,还深入讲解了其他高级配置选项,帮助读者全面提升IIS服务器的性能和安全性。 ... [详细]
  • Go语言中Goroutine与通道机制及其异常处理深入解析
    在Go语言中,Goroutine可视为一种轻量级的并发执行单元,其资源消耗远低于传统线程,初始栈大小仅为2KB,而普通线程则通常需要几MB。此外,Goroutine的调度由Go运行时自动管理,能够高效地支持成千上万个并发任务。本文深入探讨了Goroutine的工作原理及其与通道(channel)的配合使用,特别是在异常处理方面的最佳实践,为开发者提供了一套完整的解决方案,以确保程序的稳定性和可靠性。 ... [详细]
  • 本文探讨了 VS2008 的高效激活技巧和安全解决方案。通过详细分析软件的安装与卸载流程,提供了多种合法且安全的激活方法,旨在帮助用户避免非法破解带来的风险,确保软件的稳定运行和数据安全。 ... [详细]
  • LVS-DR数据包流向分析介绍
    下文给大家带来LVS-DR数据包流向分析介绍,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍, ... [详细]
author-avatar
手机用户2602932547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有