Spring Cloud-20-分布式配置中心客户端配置细节

上文中详细的介绍了分布式配置中心的服务端配置细节,本文来看一下客户端的一些配置细节

服务化配置中心

前几篇文章中,配置中心的服务端和客户端都是直接启动的,并没有交给注册中心去管理,而且在config-client中配置服务端的地址的时候都是直接写死的地址,这样显然不够灵活

我们可以交给服务注册中管理应用,在配置的时候直接使用服务名就ok了.那下面就来看一下具体怎么修改吧

服务端修改

config-server中需要做出如下修改:

首先添加eureka的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

然后再启动类添加@EnableDiscoveryClient注解,表示这是一个eureka客户端,如下:

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class App {

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

}

最后在application.yml中配置eureka的地址:

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/

至此,服务端的配置就ok了,然后是客户端的配置

客户端修改

首先还是添加eureka的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

启动类添加@EnableDiscoveryClient注解:

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@EnableConfigurationProperties
@EnableDiscoveryClient
public class App {

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

}

最后,修改配置文件bootstrap.yml,具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring:
application:
name: application
cloud:
config:
profile: dev
label: master
username: root
password: 123456
discovery:
enabled: true
service-id: config-server
server:
port: 2008
eureka:
client:
service-url:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/

相对于之前的配置就是添加了eureka的注册中心地址,还有两个分别是

  • spring.cloud.config.discovery.enabled: 表示开启通过服务名来访问config-server
  • spring.cloud.config.discovery.service-id=config-server: 表示config-server的服务名

到这里客户端也修改完成了,然后启动测试一下

测试

先启动注册中心, 我上面的配置是两个注册中心,所以启动两个,然后启动config-server和config-client.然后访问http://localhost:1111/.结果如下:
image

可以看到,两个服务都已经注册了.

再访问一下http://localhost:2008/test3,看看能不能正常使用
image

返回值也没问题,服务化配置中心就构建成功了

失败快速响应

默认情况下,如果我们只启动了config-client,不启动config-server,然后获取数据,是不报错的,然后返回空(Dalston.SR4这个版本是这样).我们希望在config-server没有启动的情况下,客户端能快速知道服务端没启动, 方式很简单,在config-client的bootstrap.yml中,加入以下配置:

1
2
3
4
spring:
cloud:
config:
fail-fast: true

这时候,不启动config-server直接启动config-client的话,就会直接报错,如下:
image

重试机制

如果由于网络抖动等原因导致config-client在启动的时候访问config-server没有成功,然后直接报错了,这就有点不合适了,遇到这种启动快的时候,我们希望是有一个重试的机制,能重试几次, 这里添加重试机制也是很简单

首先引入如下两个依赖:

1
2
3
4
5
6
7
8
9
<!-- 重试机制 -->
<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了,直接启动看下效果
image

可以看到,这里尝试访问了6次之后才报错的

相关配置

和重试机制相关的配置有以下几个:

1
2
3
4
5
6
7
8
9
10
11
12
spring:
cloud:
config:
retry:
# 配置重试次数,默认是6
max-attempts: 6
# 间隔乘数,默认1.1
multiplier: 1.1
# 初始重试间隔时间 默认1000
initial-interval: 1000
# 最大间隔时间,默认2000
max-interval: 2000

动态刷新配置

当我们更新了Git仓库中的配置的时候,如何让config-client能及时感知到呢, 首先需要引入actuator的依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

这个依赖中包含了/refresh端点的实现,我们将利用这个端点来刷新配置信息, 然后在application.yml中忽略掉权限拦截:

1
2
3
management:
security:
enabled: false

启动注册中心,再启动config-server和config-client,访问http://localhost:2008/test3,结果如下:
image

然后我们修改一个在git仓库中的配置,修改提交之后,用postman来请求一下http://localhost:2008/refresh,结果如下:
image

最后,再次访问http://localhost:2008/test3,结果如下:
image

这里的配置已经是获取到新的了