SpringCloud Config 实现配置中心
原创
©著作权归作者所有:来自51CTO博客作者杉菜酱_的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 一、新建SpringBoot项目,引入依赖
- 二、相关配置
- 三、测试
- 一、引入maven依赖
- 二、初始化配置文件
- 三、启动类
- 四、相关的配置类
- 五、controller
- 六、测试
实现简单的配置中心
在github中创建springcloud-config仓库
新建config-dev.yml,config-prod.yml,config-test.ym三个配置文件。
配置文件的内容大致如下:
config:
info: master branch,springcloud-config/config-dev.yml version=7
实现配置中心服务端
一、新建SpringBoot项目,引入依赖
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">
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-config-center-3344</artifactId>
<dependencies>
<!--添加消息总线RabbitMQ支持-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-bus-amqp</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
二、相关配置
- application.yml
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://github.com/github用户名/springcloud-config.git
####搜索目录
search-paths:
- springcloud-config
force-pull: true
username: github用户名
password: 密码
default-label: master
skip-ssl-validation: true
####读取分支
label: master
# rabbitmq:
# host: ip
# port: 5672
# username: guest
# password: guest
# virtual-host: /
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
- 在启动类上增加相关注解@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344
{
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class, args);
}
}
三、测试
启动服务3344
访问http://config-3344.com:3344/master/config-prod.yml
http://config-3344.com:3344/master/config-dev.yml 如果访问以上地址可以正常返回数据,则说明配置中心服务端正常。
实现配置中心客户端
一、引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring cloud config 客户端包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
二、初始化配置文件
- bootstrap.yml
spring:
profiles:
active: dev
---
spring:
profiles: prod
application:
name: config-single-client
cloud:
config:
uri: http://localhost:3301
label: master
profile: prod
---
spring:
profiles: dev
application:
name: config-single-client
cloud:
config:
uri: http://localhost:3301
label: master
profile: dev
配置了两个版本的配置,并通过spring.profiles.active设置当前使用的版本,例如本例使用的dev版本。
- application.yml
server:
port: 3355
management: # 自动刷新配置actuator
endpoint:
shutdown:
enabled: false
endpoints:
web:
exposure:
include: "*"
data: # 当无法读取配置中心的配置时,使用此配置,以免项目无法启动
env: NaN
user:
username: NaN
password: NaN
三、启动类
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args);
}
}
四、相关的配置类
要读取配置中心的内容,需要增加相关的配置类,springcloud config 读取配置中心的方式和读取本地配置文件中的配置是一样的。
- 可以使用@Value的方式
@Data
@Component
public class GitConfig {
@Value("${data.env}")
private String env;
@Value("${data.user.username}")
private String username;
@Value("${data.user.password}")
private String password;
}
- 可以使用@ConfigurationProperties的方式
@Component
@Data
@ConfigurationProperties(prefix = "data")
public class GitAutoRefreshConfig {
public static class UserInfo {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserInfo{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
private String env;
private UserInfo user;
}
五、controller
@RestController
public class GitController {
@Autowired
private GitConfig gitConfig;
@Autowired
private GitAutoRefreshConfig gitAutoRefreshConfig;
@GetMapping(value = "show")
public Object show(){
return gitConfig;
}
@GetMapping(value = "autoShow")
public Object autoShow(){
return gitAutoRefreshConfig;
}
}
可以用来测试项目。
六、测试
启动项目,访问restful接口
http://localhost:3355/show
结果:
{
"env": "localhost-dev-edit",
"username": "fengzheng-dev",
"password": "password-dev"
}
访问http://localhost:3355/autoShow
结果:
{
"env": "localhost-dev-edit",
"user": {
"username": "fengzheng-dev",
"password": "password-dev"
}
}
实现自动刷新
前言:
springcloud config 在项目启动时加载配置内容这一机制,导致它存在一个缺陷——修改配置内容后,不会自动刷新。当服务已经启动的时候,去修改github上的配置文件内容,这时,再次刷新页面,却还是旧的配置内容,新内容不会主动刷新过来。
springcloud提供了一个刷新机制,但是需要我们主动触发。即@RefreshScope注解并结合actuator,注意要引入spring-boot-starter-actuator包。
- 在config client 客户端配置中增加一个actuator配置
management:
endpoint:
shutdown:
enabled: false
endpoints:
web:
exposure:
include: "*"
- 在需要读取配置的类上增加@RefreshScope注解
@RestController
@RefreshScope
public class GitController {
@Autowired
private GitConfig gitConfig;
@Autowired
private GitAutoRefreshConfig gitAutoRefreshConfig;
@GetMapping(value = "show")
public Object show(){
return gitConfig;
}
@GetMapping(value = "autoShow")
public Object autoShow(){
return gitAutoRefreshConfig;
}
}
- 重启client客户端,修改github上的配置内容,并提交修改,再次刷新页面,没有反应。
接着,发送post请求到http://localhost:3355/actuator/refresh(用来触发加载新配置)
返回内容如下:
[
"config.client.version",
"data.env"
]
之后,再次访问restful接口,http:localhost:3355/autoShow,这个接口获取的数据已经是最新的了,说明refresh机制起作用了。
而http:localhost:3355/show获取的还是旧数据,这与@Value注解的实现有关。建议在以后的项目中不要使用这种方式加载配置。
在github中配置webhook