Spring Cloud 探索 | 分布式配置中心(Config Client)
接上篇《Spring Cloud 探索 | 分布式配置中心(Config Server)》,再来讲解一下 Config Client 的配置过程。
Spring Cloud Config Client 配置过程
1、pom.xml 添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.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>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!-- Config Client 的依赖 -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 作为web应用启动,不添加的话会启动失败,并且endpoints功能也会不能使用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
2、添加配置信息
application.yml
server:
port: 8080 # 指定监听端口
# 加载所有的端点。默认只加载了 info / health
management:
endpoints:
web:
exposure:
include: "*"
bootstrap.yml
spring:
application:
name : configClient01
cloud:
config:
profile: test
label: master
uri: http://localhost:8090
配置解释:
-
spring.cloud.config.*
:默认情况下,Config Server 会提供来自/{name}/{profile}/{label}
的属性来源,其中 Config Client 中的默认绑定是:"name" = ${spring.application.name}
-
"profile" = ${spring.profiles.active}
(actually Environment.getActiveProfiles()) -
"label" = "master"
但是,所有这些都可以通过设置spring.cloud.config.*
(其中*
为“name”
,“profile”
或“label”
)来覆盖。(这里我们使用的是这种方式)
label 对于回滚到以前版本的配置非常有用;使用默认的 Config Server 实现时,label 可以是 git label,branch name 或者 commit id。label 也可以作为逗号分隔的列表提供,在这种情况下,列表中的项目将逐个尝试,直到一个成功。例如,当在一个 feature 分支上开发时,可能希望将 label 与分支对应,但将其设置为可选的(例如,spring.cloud.config.label = myfeature,develop)。
-
spring.cloud.config.uri
:Config Server 的地址。这里可以配置多个 Config Server 的地址(以逗号分隔的列表); -
spring.application.name
:配置应用名称(有注册中心时用于对应用进行标识),这里暂时没有什么用处(也被上边覆盖掉了);
3、在启动类中添加一下访问方法
@SpringBootApplication
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${test_in}")
String name;
@Autowired
Environment env;
@RequestMapping("/lpf")
public String name() {
return this.name;
}
@RequestMapping("/lpf2")
public String name2() {
return env.getProperty("in", "未定义");
}
@RequestMapping("/lpf3")
public String name3() {
return env.getProperty("foo", "未定义");
}
}
4、对 Config Server 端配置进行修改
只需要修改 search-paths
,至于为什么这样做,请看这里:《Spring Cloud 探索 | 分布式配置中心(Config Server)》
spring:
cloud:
config:
server:
git:
search-paths : '{application}'
5、进行测试
到这里,一个简单的 Config Client 就配置完成了。来测试一下。
Config Client 重试机制
如果由于网络抖动等原因导致 config-client 在启动的时候访问 config-server 没有访问成功从而报错,这显然是不划算的,遇到这种情况我们希望 config-client 最好能重试几次,重试机制在这里是受支持的,添加重试机制的方式很简单,引入如下两个依赖:
<!-- 重试机制的依赖 -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
引入依赖就OK了,不用做任何额外配置(当然要确保失败快速响应已开启:spring.cloud.config.fail-fast=true
),此时我们再尝试不启动config-server 直接启动 config-client,得到的启动日志如下:
我们看到,config-client 一共尝试了六次去访问 config-server,六次都失败了才抛异常。
和重试机制相关的配置有如下四个:
# 配置重试次数,默认为6
spring.cloud.config.retry.max-attempts=6
# 间隔乘数,默认1.1
spring.cloud.config.retry.multiplier=1.1
# 初始重试间隔时间,默认1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大间隔时间,默认2000ms
spring.cloud.config.retry.max-interval=2000
不想翻译了,看原文吧:To take full control of the retry behavior, add a
@Bea
n of typeRetryOperationsInterceptor
with an ID ofconfigServerRetryInterceptor
. Spring Retry has aRetryInterceptorBuilder
that supports creating one.
动态刷新配置
在开发的过程中,甚至在生产环境,我们可能会随时对 Git 仓库中的配置进行更改,那么这时怎么让这些更改实时的反映 Config Client 上呢?Cloud Config 提供了这样的功能。
1、在 Config Client 中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、该依赖中包含了/refresh
端点的实现,我们将利用这个端点来刷新配置信息。然后需要在application.yml
中配置暴露/refresh
端点:
# 加载所有的端点。默认只加载了 info / health
management:
endpoints:
web:
exposure:
include: "*"
3、在应用的入口类上添加注解@RefreshScope
解释一下这个注解的作用:当配置改变的时候,被 @RefreshScope
注解的 Bean,可以通过访问/refresh
端点使其使用新的配置重新初始化。更详细的解释请看官方文档。
这样就配置好了,来测试一下;
- 访问 Config Client:
- 在码云上修改配置文件内容;
- 访问 Config Client:访问后可以看到返回内容并没有改变;
- 访问
/refresh
端点,刷新配置。注意,要使用 POST 方式进行访问(可以使用postman)。我们可以看到返回内容如下,代表 test_in 参数的配置内容被更新了;
- 再次的访问 Config Client:可以看到返回内容已经改变;
其他配置参数
-
spring.cloud.config.fail-fast
:不作任何额外配置的情况下,失败响应有点迟钝,举个简单的例子,关掉 config-server,我们直接启动 config-client,此时启动会报错,但是报错时间较晚,报错的时候系统已经打印了许多启动日志了,如果我们希望在启动失败时能够快速响应,方式很简单,config-client 中将此项设置为 true 即可。此时不启动 config-server直接启动 config-client 依然会报错,但是我们看到报错时间较早,系统都没打印几条启动日志。 -
spring.cloud.config.request-read-timeout
:设置读取超时; - 使用 https 连接 Config Server 的配置请看这里;
-
health.config.enabled
:The Config Client supplies a Spring Boot Health Indicator that attempts to load configuration from the Config Server. The health indicator can be disabled by settinghealth.config.enabled=false
-
health.config.time-to-live
:The response of health indicator is cached for performance reasons. The default cache time to live is 5 minutes. To change that value, set thehealth.config.time-to-live
property (in milliseconds). - 自定义到 Config Server 的请求请看这里,可以用于对服务器权限的特殊认证;
源码地址:https://gitee.com/liupeifeng3514/Spring-Cloud-Learning
测试仓库地址:https://gitee.com/liupeifeng3514/config-repo
参考文章:
下一篇: PHP 开发工具_php文摘