<九>spring-cloud Hoxton.SR2 spring-cloud-bus消息总线的搭建使用
文章目录
本地项目的基础环境
环境 | 版本 |
---|---|
jdk | 1.8.0_201 |
maven | 3.6.0 |
Spring-boot | 2.2.4.RELEASE |
Spring-cloud | Hoxton.SR2 |
《<一>spring-cloud Hoxton.SR2版 服务注册与发现–eureka搭建以及集群搭建》
《<二>spring-cloud Hoxton.SR2 负载均衡ribbon搭建使用》
《<三>spring-cloud Hoxton.SR2 负载均衡openfeign搭建使用》
《<四>spring-cloud Hoxton.SR2 断路器hystrix搭建使用》
《<五>spring-cloud Hoxton.SR2 hystrix Dashboard监控搭建使用》
《<六>spring-cloud Hoxton.SR2 网关组件zuul搭建使用》
《<七>spring-cloud Hoxton.SR2 网关组件gateway搭建使用》
《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》
具体代码信息,可以查看《码云》
文档信息,可以参考《spring-cloud中文网》;《spring官网》
这篇文章是基于《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》;
是针对多个客户端配置刷新的一个深层次解决方式;下面的案例,是基于上篇应用的复制,改造;
1、安装rabbitmq
为了方便安装,我这里基于docker形式的安装
1.1、下载rabbitmq
docker pull rabbitmq:management
1.2、执行运行指令
docker run -d --name rabbitmq_01 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
1.3、访问rabbitmq的web客户端
账号密码就是指令里的 admin/admin
1、基于bus的spring-cloud-config 配置中心server端项目搭建
1.1、搭建新的项目badger-spring-cloud-config-server-bus
,pom文件如下
主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client
,配置中心config-server的包spring-cloud-config-server
,消息总线的jar包spring-cloud-starter-bus-amqp
;
上篇可以不需要Eureka;这次,多个客户端通知形式刷新的时候,需要Eureka的注册中心
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-config-server-bus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-config-server-bus</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2、主类上加注解@EnableConfigServer
和eureka的注解@EnableEurekaClient
/**
* @EnableConfigServer 开启config服务端的注册
* @author liqi
*/
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerBusApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerBusApplication.class, args);
}
}
1.3、yaml的配置文件
server:
port: 9500
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-config-server-bus
cloud:
config:
server:
git:
uri: https://gitee.com/liqi01/badger-spring-cloud.git
default-label: master
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin
management:
endpoints:
web:
exposure:
include: "bus-refresh"
跟上篇《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》,yaml文件中,只是新增了rabbitmq
的基础配置,已经暴露了spring-cloud-bus的刷新点位bus-refresh
;
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin
management:
endpoints:
web:
exposure:
include: "bus-refresh"
2、基于bus的spring-cloud-config 配置中心server端测试演示
2.1、测试演示
我在https://gitee.com/liqi01/badger-spring-cloud.git
这个git地址下,演示的yml
的配置文件名称application-bus.yml
;文件内容如下:
test:
port: 10000
这里避免下面的多个客户端启动的时候,默认拉去的是端口是10000,导致我本地单机启动重复端口,导致项目无法启动;新增了一个配置文件application-bus.yml
;内容也换成了test.port
启动运用;通过url地址访问:
http://localhost:9500/master/application-bus.yml
得到正常结果;
test:
port: 10000
修改git上application-bus.yml
文件的端口的值;改回10001
后;再继续访问配置中心config-server应用;
http://localhost:9500/master/application-bus.yml
可以看到文件内容端口信息,已经改回到了10001
了;可以确认,git上的配置文件,已经改成功了;并且配置中心,也已经拿到最新的文件内容;
3、基于bus的spring-cloud-config 配置中心使用端client端项目搭建
3.1、搭建新的项目badger-spring-cloud-config-client-bus
,pom文件如下
主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client
,配置中心config-server的包spring-cloud-config
;spring-cloud-bus的jar包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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2、主类上eureka的注解@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
@RestController
@RefreshScope
public class ConfigClientBusApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientBusApplication.class, args);
}
@Value("${test.port}")
String port;
@Value("${spring.cloud.client.ip-address}")
String address;
@GetMapping("/demo")
public String demo() {
return "我的地址是-->" + address + ":" + port;
}
}
这里需要注意的是@Value("${test.port}")
获取的test.prot的属性;
3.3、bootstrap.yml配置文件
server:
port: 10000
management:
endpoints:
web:
exposure:
include: '*'
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-config-client-bus
cloud:
config:
label: master
name: application
profile: bus
uri:
- http://localhost:9500
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin
如果配置文件名字叫application.yml
,那么通过config加载的配置文件,不生效;启动的端口,还是上述配置文件中的9051
;
需要把配置文件名称改成bootstrap.yml
;优先级要高于application.yml
;
label:分支名称
name:配置文件的名称;
profile:运行环境;
uri:配置中心的地址;
新增了rabbitmq的基础配置;
4、基于bus的spring-cloud-config 配置中心client端测试演示
4.1、演示
启动Eureka服务,端口为8761
启动应用badger-spring-cloud-config-client-bus
;端口为10000;
直接访问url,也可以看到具体的内容信息
我的地址是-->172.16.2.54:10000
;
4.2、遇到的问题
修改git上application-bus.yml
文件的端口的值;改回10001
后;
1、配置中心服务端
再继续访问配置中心config-server应用;
http://localhost:9500/master/application-bus.yml
可以看到文件内容端口信息,已经改回到了10001
了;可以确认,git上的配置文件,已经改成功了;并且配置中心,也已经拿到最新的文件内容;
2、配置中心客户端
客户端,后台并没有刷新;访问下面地址后,跟上述结果一致,没有变化;
说明,客户端获取的配置文件,没有刷新;
跟之前是一致的,还是需要手动触发刷新;
curl -X POST "http://localhost:10000/actuator/refresh"
不一样的是:
1、在上一篇的案例中,没有加入spring-cloud-bus 消息总线
,目前只是启动了一个config的client端,如果启动多个client端,那么需要针对多个client端,做多次的刷新;
2、当前应用加入了消息总线
;那么我们启动多个client端的时候,是不是只用手动刷新一次,就可以通知到其他的应用自动去刷新呢?
4.3、再次测试演示
1、启动新的客户端应用badger-spring-cloud-config-client-bus
;端口为11000;
目前启动的应用列表:
1.1、客户端应用badger-spring-cloud-config-client-bus 启动了2个,端口分别为10000、11000;
正常访问;
1.2、配置中心服务端应用badger-spring-cloud-config-server-bus,端口为9500
http://localhost:9500/master/application-bus.yml
正常访问
1.3、Eureka服务列表如下:
2、修改git上的application-bus.yml
文件的端口,改成10002(上面的测试,改成了10001)
客户端:没有刷新的情况下,内容还是10001
服务端:内容已经变成了10002;
http://localhost:9500/master/application-bus.yml;
3、手动刷新配置中心服务端;
注意:上述的测试,以及之前的上篇文章《<八>spring-cloud Hoxton.SR2 配置中心config服务端、客户端的搭建使用》中;
手动刷新的,都是基于客户端client刷新的;使用消息总线后,分发是从服务端,向下(client)发送的;
curl -X POST "http://localhost:9500/actuator/bus-refresh"
刷新配置中心的服务端后,再次请求客户端
可以看到内容,都已经变成了10002了;
4、应用结构
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gii7ayx7g6j311s0u0agg.jpg)
具体代码信息,可以查看《码云》