什么是配置中心服务化?
我们前两篇讲的分布式配置中心,实际上并没有引入eureka,这样是不合理的,相当于config-client里面把config-server的地址写死了,config-server如果以后换了地址,所有的config-client都得改,而且这个config-server如果你想要部署集群也不好处理,所以为了解决这个问题还是引入eureka。
首先启动eureka,然后让config-server和config-client都注册到eureka上面去,先在config-server和config-client中分别加入如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在config-server的application.properties配置文件中加入如下配置;
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
到这里,我们的config-server的配置就成功了。
修改config-client
在config-client的配置文件bootstrap.properties中加上如下代码
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
启动项目访问config-client中的hello接口,发现能成功访问,说明配置成功:
这就是服务化,引入eureka,正常都是这样来做的,不会直接让config-client和config-server相连。
配置中心细节
不做任何额外配置的情况下,失败响应有点迟钝,举个简单的例子,关掉config-server,我们直接启动config-client,此时启动会报错,但是报错时间较晚,报错的时候系统已经打印了许多启动日志了,如果我们希望在启动失败的时候能够快速响应,方法很简单,在config-client的配置文件中添加如下配置即可:
#失败快速响应
spring.cloud.config.fail-fast=true
此时不启动config-server直接启动config-client依然会报错,但是我们看到报错时间较早,系统都没打印几条启动日志。
那么为什么要配置这个失败快速响应呢?实际上是为了重试机制:
重试机制
如果由于网络不稳定等原因导致config-client在启动时访问config-server没有访问成功从而报错,这显然是不划算的,遇到这种情况我们希望config-client最好能重试几次,添加重试机制的方法很简单,只需要引入如下依赖到config-client的pom.xml文件中即可,无需在做任何额外配置:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
这样当它访问config-server访问失败,它会自动的重试,我们现在再次尝试不启动config-server,然后启动config-client得到如下日志,我们发现config-client一共尝试去访问config-server,六次都没成功才抛出异常:
注意:如果要启用这个重试机制,那就必须开启失败快速响应。
那么重试机制也可以自己在配置文件中配置相关的参数:
# 配置重试次数,默认为6
spring.cloud.config.retry.max-attempts=6
# 间隔乘数,默认1.1
spring.cloud.config.retry.multiplier=2
# 初始重试间隔时间,默认1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大间隔时间,默认2000ms
spring.cloud.config.retry.max-interval=2000
动态刷新配置
我们知道当GitHub中的配置文件更新后,config-server能够即时感知到,可是config-client不能即时感知到,必须要重启才行,那么如果我们希望config-client也能即时感知到,那我们该怎么做呢?方法很简单,首先在config-client中加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
该依赖中包含了/actuator/refresh端口的实现,我们将利用这个端口来刷新配置信息。在config-client的配置文件中加上如下配置:
#允许/actuator/refresh这个端口
management.endpoints.web.exposure.include=refresh
当然这个不是主流方案,这样的话如果以后配置文件改了,还得挨个的去调用这个接口才能更新,后面还有其他办法来简化这个操作,后面再来学习。
测试:修改test环境,这里在后面加了123,如下:
然后提交到GitHub上去:
此时在config-client没有重启的情况下,怎么刷新都不会更新,还是原理的数据,config-client检测不到GitHub中配置文件的变化。
然后我们通过postman发送一个post请求,请求地址是
这时候再次刷新,我们可以看到,config-client中的数据已经更新啦: