Spring Cloud 微服务(28) --- Spring Cloud Config(二)
刷新配置

刷新配置信息的方式有三种:手动刷新半自动刷新自动刷新,其中,半自动刷新利用的是 spring cloud bus自动刷新利用的是 github、gitee、gitlab 等代码托管网站的 webhooks

手动刷新

源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-config/spring-cloud-config-refresh

手动刷新的 config server 依然选用示例中的 spring-cloud-config-simple-server

config client

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>

bootstrap.yml

1
2
3
4
5
6
7
spring:
cloud:
config:
label: master
uri: http://localhost:9090
name: config-simple
profile: dev

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: spring-cloud-config-refresh-client
server:
port: 9091
management:
endpoints:
web:
exposure:
include: '*' # 暴露端点,用于手动刷新
endpoint:
health:
show-details: always

改造 config properties、config controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Component
@RefreshScope // 标注为配置刷新域
public class ConfigInfoProperties {

@Value("${com.laiyy.gitee.config}")
private String config;

public String getConfig() {
return config;
}

public void setConfig(String config) {
this.config = config;
}
}

@RestController
@RefreshScope // 标注为配置刷新域
public class ConfigController {

private final ConfigInfoProperties configInfoProperties;

@Autowired
public ConfigController(ConfigInfoProperties configInfoProperties) {
this.configInfoProperties = configInfoProperties;
}

@GetMapping(value = "/get-config-info")
public String getConfigInfo(){
return configInfoProperties.getConfig();
}

}

验证

访问 http://localhost:9091/get-config-info ,观察返回值为:

1
dev 环境,git 版 spring cloud config

修改 https://gitee.com/laiyy0728/config-repo/blob/master/config-simple/config-simple-dev.yml 的内容为:

1
2
3
4
com:
laiyy:
gitee:
config: dev 环境,git spring cloud config,使用手动刷新。。。

再次访问 http://localhost:9091/get-config-info ,观察返回值仍为:

1
dev 环境,git 版 spring cloud config

这是因为没有进行手动刷新,POST 访问:http://localhost:9091/actuator/refresh ,返回信息如下:

1
2
3
4
[
"config.client.version",
"com.laiyy.gitee.config"
]

控制台输出如下:

1
2
3
Fetching config from server at : http://localhost:9090
Located environment: name=config-simple, profiles=[dev], label=master, version=a04663a171b0d8f552c3d549ad38401bd6873b95, state=null
Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://gitee.com/laiyy0728/config-repo/config-simple/config-simple-dev.yml'}]}

此时,再次访问 http://localhost:9091/get-config-info ,观察返回值变为:

1
dev 环境,git 版 spring cloud config,使用手动刷新。。。

由此证明,手动刷新成功


半自动刷新

源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-config/spring-cloud-config-bus

半自动刷新依赖于 Spring Cloud Bus 总线,而 Bus 总线依赖于 RabbitMQ。 Spring Cloud Bus 刷新配置的流程图:
Spring Cloud Bus 流程图

Rabbit MQ 请自行安装启动,在此不做描述

config server bus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</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-bus-amqp</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/laiyy0728/config-repo.git
search-paths: config-simple
bus:
trace:
enabled: true # 是否启用bus追踪
application:
name: spring-cloud-config-bus-server
rabbitmq: # rabbit mq 配置
host: 192.168.67.133
port: 5672
username: guest
password: guest
server:
port: 9090
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}


@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigBusServerApplication {

public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigBusServerApplication.class, args);
}

}

config client bus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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-config-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>

bootstrap.yml

1
2
3
4
5
6
7
spring:
cloud:
config:
label: master
uri: http://localhost:9090
name: config-simple
profile: test

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/laiyy0728/config-repo.git
search-paths: config-simple
bus:
trace:
enabled: true # \u662F\u5426\u542F\u7528bus\u8FFD\u8E2A
application:
name: spring-cloud-config-bus-server
rabbitmq: # rabbit mq \u914D\u7F6E
host: 192.168.67.133
port: 5672
username: guest
password: guest
server:
port: 9090
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always

其余 Java 类与手动刷新一致。

验证

访问 http://localhost:9095/get-config-info
Config Bus

config-simple/config-simple-test.yml 内容修改为

1
2
3
4
com:
laiyy:
gitee:
config: test 环境,git spring cloud config,bus 半自动刷新配置

再次访问 http://localhost:9095/get-config-info ,返回值仍为:

1
test 环境,git 版 spring cloud config

使用 bus 刷新配置,POST 请求 http://localhost:9095/actuator/bus-refresh ,查看控制台输出:

1
2
3
4
5
6
7
Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$7c355e31] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
Fetching config from server at : http://localhost:9090
Located environment: name=config-simple, profiles=[test], label=master, version=45c17b3b2a7918ed7093251f2085641df446e961, state=null
Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://gitee.com/laiyy0728/config-repo.git/config-simple/config-simple-test.yml'}]}
No active profile set, falling back to default profiles: default
Started application in 1.108 seconds (JVM running for 264.482)
Received remote refresh request. Keys refreshed []

再次访问 http://localhost:9095/get-config-info ,返回值变为:

1
test 环境,git 版 spring cloud config,bus 半自动刷新配置

refresh、bus-refresh 比较

  • refresh:只能刷新单节点,即:只能刷新指定 ip 的配置信息
  • bus-refresh:批量刷新,可以刷新订阅了 rabbit queue 的所有节点配置

自动刷新

自动刷新实际上很简单,只需要暴露一个 bus-refresh 节点,并在 config-server 的 git 中,配置 webhook 指向暴露出来的 bus-refresh 节点即可,多个 bus-refresh 节点用英文逗号分隔
Config webhook


-------------本文结束 感谢您的阅读-------------
0%