记录一下springcloud动态配置中心的使用:
ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(配置中心客户端)从ConfigServer端获取自己对应 配置文件
当远端git仓库配置文件发生改变,Spring Cloud Bus会向外提供一个http接口:/bus/refresh。将这个接口配置到远程的git的webhook上,如:http://xx.xxx.xxx.xxx:8083/actuator/bus-refresh 当git上的文件内容发生变动时,就会自动调用接口类似回调通知。Bus就会通知config-server,config-server会发布更新消息到消息总线的消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新,文本介绍的是自己手动刷新,刷新ConfigServer,所有ConfigClient节都会刷新。
当然如果应用到生产环境,需要加密,本文暂不介绍。
为了达到高可用效果,所以向eureka中心注册成服务,
配置需要使用到的rabbitmq地址(自己安装)
配置git地址,私有库需要使用账号密码,共有库则不需要。
Git上有提前上传好的文本文件,目录如下:
SpringCloudDemo / respo /config-client-dev.properties
注意目录和文件名都是对应的
search-paths: respo,default-label: master如下面配置中的
ConfigServer项目:
application.yml内容如下:
server:
port: 8083
spring:
application:
name: config-server
rabbitmq:
host: 20.122.222.222
port: 5672
username: admin
password: xxxxx
cloud:
config:
server:
git:
uri: https://gitee.com/wg199063/SpringCloudDemo
search-paths: respo
username: xxxx账号密码使用自己的
password: xxxxx
default-label: master
bus:
trace:
enabled: true
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://xxxxx:80/emeurekaserver/eureka/
management:
endpoints:
web:
exposure:
include: bus-refresh
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>
<groupId>com.cralor</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</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-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</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>
application.java内容如下:
@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
ConfigClient项目:
因为使用的是动态配置,有一些配置的加载需要在application.yml之前加载,负责会失败,所有创建一个bootstrap.yml
结构如下:
只有bootstrap文件有内容:
server:
port: 8082
spring:
application:
name: config-client
profiles:
active: dev
rabbitmq:
host: xx.xx.xx.xxx
port: 5672
username: admin
password: xxxx
cloud:
config:
fail-fast: true
discovery:
enabled: true
service-id: config-server
bus:
trace:
enabled: true
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://xxxxx:80/emeurekaserver/eureka/
management:
endpoints:
web:
exposure:
include: bus-refresh
application内容如下:
controller内容如下:
@RefreshScope
@RestController
public class MyController {
@Value("${foo}")
String foo;
@RequestMapping("/foo")
public String hi(){
return foo;
}
}
```下面,打包好2个项目,并提前运行好eurekaServer项目。
依次启动ConfigServer和ConfigClient项目,先server再client。
rabbitmq中可以看到创建了queue:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019082719185666.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMzM3OTI3,size_16,color_FFFFFF,t_70)
测试效果:
http://xx.xxx.xxx.xxx:8082/foo
返回结果
foo version 4
修改git中的foo version 4 为foo version 3.
刷新http://xx.xxx.xxx.xxx:8082/foo,还是4,此时需要模拟一个post请求:
http://xx.xxx.xxx.xxx:8083/actuator/bus-refresh
成功后再次刷新http://xx.xxx.xxx.xxx:8082/foo,返回foo version 3,项目不需要重启。