Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。使用Spring Cloud Bus后的架构如图所示。
需要安装rabbitMQ,安装rabbitMQ的详情请参考:https://blog.csdn.net/qq_35098526/article/details/80009424这篇文章主要讲Windows下的安装过程。
创建三个模块:
eureka-server eureka服务注册中心
config-server 配置中心服务端
config-client 配置中心客户端
1. eureka-server 模块pom文件配置如下,这里跟第一章节一样 ,不多说。
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.harrygroupId>
<artifactId>eureka-serverartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>
<name>eureka-servername>
<description>EUREKA 服务注册中心description>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.1.RELEASEversion>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Finchley.M9spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
<repositories>
<repository>
<id>spring-milestonesid>
<name>Spring Milestonesname>
<url>https://repo.spring.io/milestoneurl>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
project>
2. config-server 配置中心服务端pom配置,这里引入了spring-cloud-starter-bus-amqp。
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.harrygroupId> <artifactId>config-serverartifactId> <version>0.0.1-SNAPSHOTversion> <packaging>jarpackaging> <name>config-servername> <description>Demo project for Spring Bootdescription> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.0.1.RELEASEversion> <relativePath/> parent> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <java.version>1.8java.version> <spring-cloud.version>Finchley.M9spring-cloud.version> properties> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> 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-testartifactId> <scope>testscope> dependency> dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>${spring-cloud.version}version> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> <repositories> <repository> <id>spring-milestonesid> <name>Spring Milestonesname> <url>https://repo.spring.io/milestoneurl> <snapshots> <enabled>falseenabled> snapshots> repository> repositories> project>
application.yml 配置
eureka: client: serviceUrl: defaultZone: http://localhost:8889/eureka/ spring: application: name: config-server cloud: config: server: git: uri: https://gitee.com/honghh/spring-cloud-config # 配置git仓库地址 searchPaths: config-doc # 配置仓库路径 # username: # 访问git仓库的用户名 # password: # 访问git仓库的用户密码 # label: #配置仓库的分支 server: port: 8989
在application.yml可以看到引入了git仓库地址,如果仓库是私有的,需要输入访问的账号和密码,这个地址是我自己测试用的,是公开的,可以不输入账号密码。searchPaths:config-doc# 配置仓库路径如果仓库路径是根目录则不需要写这个,如果是多级目录,可以写成A/B/C格式。
2. config-client 配置中心客户端这里需要注意pom文件中引入了spring-cloud-starter-bus-amqp,spring-boot-starter-actuator,spring-retry
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.harrygroupId> <artifactId>config-clientartifactId> <version>0.0.1-SNAPSHOTversion> <packaging>jarpackaging> <name>config-clientname> <description>Demo project for Spring Bootdescription> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.0.1.RELEASEversion> <relativePath/> parent> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> <java.version>1.8java.version> <spring-cloud.version>Finchley.M9spring-cloud.version> properties> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-configartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-bus-amqpartifactId> dependency> <dependency> <groupId>org.springframework.retrygroupId> <artifactId>spring-retryartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-actuatorartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>${spring-cloud.version}version> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> <repositories> <repository> <id>spring-milestonesid> <name>Spring Milestonesname> <url>https://repo.spring.io/milestoneurl> <snapshots> <enabled>falseenabled> snapshots> repository> repositories> project>
bootstrap.yml 配置
eureka: client: serviceUrl: defaultZone: http://localhost:8889/eureka/ server: port: 8881 spring: application: name: config-client cloud: config: label: master profile: dev discovery: enabled: true service-id: config-server rabbitmq: host: localhost port: 5672 username: guest password: guest #management: # security: # enabled: false #spring boot1.5.x 版本配置 management: endpoints: web: exposure: include: bus-refresh
这里写入rabbitMQ的配置和management的配置,我们可以看到有一段注释的代码,解析看下面注意有坑①。
依次启动eureka-server、confg-cserver,启动两个config-client,端口为:8881
1.访问http://localhost:8881/hi浏览器显示:
2这时我们去代码仓库将config-client-dev.properties下的foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/bus/refresh,你会发现config-client会重新读取配置文件。可以看到控制台打印日志如图。注意有坑 ①
3. 再次请求http://localhost:8881/hi
到这里操作就已经完成。接下来我们讲一下遇到的问题
① 上面提到请求 http://localhost:8881/bus/refresh但是你在运行的时候遇到报404的错误
图5.1
图5.2
首先,你要确认是post请求,如图5.1是get请求,是会报404的错误的
但是图5.2中用的是post请求为什么还会报错
这里就是我所说的坑看项目中的pom文件我用的是spring boot 2.0.1.RELEASE版本,查资料看到一篇文章 https://ask.csdn.net/questions/684123
详情如下:
SpringBoot2.0Config客户端自动刷新时没有/bus/refresh端点
Spring Cloud ConfigClient的配置自动刷新
目前的博客和视频都是Spring Boot1.5.x的,安装rabbitmq,导入依赖,配置yml,添加@RefreshScope,启动Config client时日志都会打印出/bus/refresh这个端口,但是到spring boot2.0就不再打印这个端口,也无法访问。即使yml配置暴露actuator的所有端口,也就只有/actuator/refresh这个端口(这个端口是只更新一个的)。
请问Spring boot 2.0如何实现Config Client自动刷新配置
Spring boot 2.0的改动较大,/bus/refresh全部整合到actuador里面了,所以之前1.x的management.security.enabled全部失效,不适用于2.0
适用于2.0的配置是这样的:
management:
endpoints:
web:
exposure:
include: bus-refresh
另外注解
@RefreshScope
需要在配置的页面加上,就是说附带@Value的页面加上此注解
请求刷新的页面由原来1.5.x的localhost:8888/bus/refresh
变成:http://localhost:8888/actuator/bus-refresh
注意:config-server和config-client的配置都得加上
management:
endpoints:
web:
exposure:
include: bus-refresh
所以这就是上面为什么这样改的原因,执行刷新的的请求为:
http://localhost:8881/actuator/bus-refresh
代码我已同步到码云git :https://gitee.com/honghh/spring-cloud-config