述
上文中详细的介绍了分布式配置中心的服务端配置细节,本文来看一下客户端的一些配置细节
服务化配置中心
前几篇文章中,配置中心的服务端和客户端都是直接启动的,并没有交给注册中心去管理,而且在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
4eureka:
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
18spring:
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/.结果如下:
可以看到,两个服务都已经注册了.
再访问一下http://localhost:2008/test3,看看能不能正常使用
返回值也没问题,服务化配置中心就构建成功了
失败快速响应
默认情况下,如果我们只启动了config-client,不启动config-server,然后获取数据,是不报错的,然后返回空(Dalston.SR4这个版本是这样).我们希望在config-server没有启动的情况下,客户端能快速知道服务端没启动, 方式很简单,在config-client的bootstrap.yml中,加入以下配置:1
2
3
4spring:
cloud:
config:
fail-fast: true
这时候,不启动config-server直接启动config-client的话,就会直接报错,如下:
重试机制
如果由于网络抖动等原因导致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了,直接启动看下效果
可以看到,这里尝试访问了6次之后才报错的
相关配置
和重试机制相关的配置有以下几个:1
2
3
4
5
6
7
8
9
10
11
12spring:
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
3management:
security:
enabled: false
启动注册中心,再启动config-server和config-client,访问http://localhost:2008/test3,结果如下:
然后我们修改一个在git仓库中的配置,修改提交之后,用postman来请求一下http://localhost:2008/refresh,结果如下:
最后,再次访问http://localhost:2008/test3,结果如下:
这里的配置已经是获取到新的了