上节配置了spring cloud config server,集中管理配置文件,当配置文件发生变化时,客户端通过
curl -X POST http://客户端地址:端口/actuator/refresh 可以刷新客户端配置,但是如果微服务多了,一个微服务有多个实例在运行,需要一个个去刷新,采用bus消息总线,可以实现一键刷新所有实例的配置。
原理图:
一、启动kafka (安装参看我的其他文章)
cd kafka_2.12-2.1.0
启动自带的zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties &
启动kafka
bin/kafka-server-start.sh config/server.properties &
查看topic
bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --list
二、spring cloud config server 配置
1. pom.xml
-
<?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.0
</modelVersion>
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.1.1.RELEASE
</version>
-
<relativePath/>
<!-- lookup parent from repository -->
-
</parent>
-
<groupId>com.linbsoft
</groupId>
-
<artifactId>microservice-config-server-8401
</artifactId>
-
<version>0.0.1-SNAPSHOT
</version>
-
<name>microservice-config-server-8401
</name>
-
<description>Demo project for Spring Boot microservice-microservice-config-server-8401
</description>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8
</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8
</project.reporting.outputEncoding>
-
<java.version>1.8
</java.version>
-
<spring-cloud.version>Greenwich.M3
</spring-cloud.version>
<!-- Finchley.M8 -->
-
</properties>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-config-server
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-client
</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-bus-kafka
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-stream-kafka
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-bus
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-actuator
</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>
-
<repositories>
-
<repository>
-
<id>spring-milestones
</id>
-
<name>Spring Milestones
</name>
-
<url>https://repo.spring.io/milestone
</url>
-
<snapshots>
-
<enabled>false
</enabled>
-
</snapshots>
-
</repository>
-
</repositories>
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
其中: spring-cloud-starter-bus-kafka ,spring-cloud-starter-stream-kafka,spring-cloud-bus是对kafka bus总线的支持
2. application.properties文件
server.port=8401
spring.application.name=MicroserviceConfigServer8401
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7.linbsoft.com:8101/eureka/,http://admin:123@microservice1.linbsoft.com:8102/eureka/
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=classpath:/config
#以下是gitub获取配置文件
#spring.cloud.config.server.git.uri=https://github.com/XXX/spring-cloud-config
#spring.cloud.config.label=master
#spring.cloud.config.server.git.searchPaths=config-repo
#spring.cloud.config.server.git.username=XXX
#spring.cloud.config.server.git.password=***
spring.cloud.bus.enabled=true
spring.kafka.bootstrap-servers=centos7.linbsoft.com:9092
management.endpoints.web.exposure.include=*
spring.cloud.bus.refresh.enabled=true
3. 启动类加注解
@EnableConfigServer
三、spring cloud config client
自动配置客户端设置
1. pom.xml
-
<?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.0
</modelVersion>
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.1.1.RELEASE
</version>
-
<relativePath/>
<!-- lookup parent from repository -->
-
</parent>
-
<groupId>com.linbsoft
</groupId>
-
<artifactId>microservice-serverA-8801
</artifactId>
-
<version>0.0.1-SNAPSHOT
</version>
-
<name>microservice-serverA-8801
</name>
-
<description>Demo project for Spring Boot microservice-microservice-serverA-8801
</description>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8
</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8
</project.reporting.outputEncoding>
-
<java.version>1.8
</java.version>
-
<spring-cloud.version>Greenwich.M3
</spring-cloud.version>
<!-- Finchley.M8 -->
-
</properties>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-client
</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-bus-kafka
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-stream-kafka
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-bus
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-actuator-autoconfigure
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-actuator
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>de.codecentric
</groupId>
-
<artifactId>spring-boot-admin-starter-client
</artifactId>
-
<version>2.1.1
</version>
-
</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>
-
<repositories>
-
<repository>
-
<id>spring-milestones
</id>
-
<name>Spring Milestones
</name>
-
<url>https://repo.spring.io/milestone
</url>
-
<snapshots>
-
<enabled>false
</enabled>
-
</snapshots>
-
</repository>
-
</repositories>
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
像server一样,加入了spring-cloud-starter-bus-kafka ,spring-cloud-starter-stream-kafka,spring-cloud-bus依赖。
2. bootstrap.properties 这个先于从配置服务器取得的配置文件
spring.application.name=MicroserviceServerA8801
server.port=8801
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7.linbsoft.com:8101/eureka/,http://admin:123@microservice1.linbsoft.com:8102/eureka/
#spring.cloud.config.uri=http://centos7.linbsoft.com:8401
spring.cloud.config.enabled=true
spring.cloud.config.profile=dev
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=MicroserviceConfigServer8401
management.endpoints.web.exposure.include=*
management.security.enabled=false
spring.cloud.stream.default-binder=kafka
spring.cloud.bus.enabled=true
spring.kafka.bootstrap-servers=centos7.linbsoft.com:9092
spring.cloud.bus.trace.enabled=true
spring.cloud.bus.refresh.enabled=true
3. 在启动类加入注解
@EnableDiscoveryClient
4. 增加测试类,就是显示姓名,年龄,这两个值是写在配置中心的配置文件中的
@RestController
@RefreshScope
public class TestController {
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@RequestMapping("/test")
public String test(){
return this.name+this.age;
}
}
5.配置中心的配置文件
/microservice-config-server-8401/src/main/resources/config/MicroserviceServerA8801-dev.properties
内容简单两行:
name=linbin
age=88
四.测试
1.配置修改前的config server中配置文件
2.配置修改前测试客户端读取的配置文件
3. 修改配置文件
4. 保存后查看config server已变化
5. 启动刷新,spring cloud config server自动向kafka总线发出消息
(1)为了检测消息,先启动一个消费者进程监控消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic springCloudBusOutput --from-beginning
(2)开启另外一个shell,向spring cloud config server发出刷新配置的post请求
curl -X POST http://centos7.linbsoft.com:8401/actuator/bus-refresh
(3)在(1)的监控shell可以看到向kafka发出的消息
(5)查看客户端是否更新类配置文件
可以看见客户端已更新了配置文件