服务化配置中心
如果客户端都是直接调用配置中心的server端来获取配置文件信息,这样就存在了一个问题,客户端和服务端的耦合性太高,若配置中心的server端要做集群,客户端只能通过原始的方式来路由,server端改变IP地址的时候,客户端也需要修改配置,不符合Spring Cloud服务治理的理念。Spring Cloud提供了这样的解决方案,我们只需要将server端当做一个服务注册到eureka中,client端去eureka中去获取配置中心server端的服务既可。
Server端
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
server.port=8888
spring.application.name=config-server
spring.cloud.config.server.git.uri=配置git仓库的地址
spring.cloud.config.server.git.search-paths=git仓库地址下的相对地址,可以配置多个,用,分割
spring.cloud.config.server.git.username=git仓库的账号
spring.cloud.config.server.git.password=git仓库的密码
#注册中心eureka地址
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
启动类
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
客户端
Spring Boot 2.4以前版本
添加依赖
在Spring Boot 2.4能够直接在 application.properties 或 application.yml 文件中使用新的spring.config.import
属性。当使用配置中心时,由于SpringCloud 2020.*以后的版本默认禁用了bootstrap,导致读取配置文件时读取不到该属性。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!-- 启用bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置文件
application.properties
server.port=8001
spring.application.name=config-client
#用于获取远程属性的应用程序的名称
spring.cloud.config.name=neo-config
#获取远程配置时使用的默认配置文件(逗号分隔)
spring.cloud.config.profile=dev
#分支
spring.cloud.config.label=master
bootstrap.properties
#这三个配置都需要放到bootstrap.properties的配置中
#开启Config服务发现支持
spring.cloud.config.discovery.enabled=true
#指定server端的name,也就是server端spring.application.name的值
spring.cloud.config.discovery.serviceId=config-server
指向注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
启动类
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
Spring Boot 2.4及以后版本
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
配置文件
server.port=8001
spring.application.name=config-client
#用于获取远程属性的应用程序的名称
spring.cloud.config.name=neo-config
#获取远程配置时使用的默认配置文件(逗号分隔)
spring.cloud.config.profile=dev
#分支
spring.cloud.config.label=master
#注册中心路径,表示我们向这个注册中心注册服务,如果向多个注册中心注册,用“,”进行分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
#不在默认端口8888,后面追加正确地址就行
spring.config.import=optional:configserver:
启动类
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
失败快速响应
不作任何额外配置的情况下,失败响应有点迟钝,举个简单的例子,关掉config-server,我们直接启动config-client,此时启动会报错,但是报错时间较晚,报错的时候系统已经打印了许多启动日志了,如果我们希望在启动失败时能够快速响应,方式很简单,config-client中添加如下配置即可:
#这个配置需要放到bootstrap.properties的配置中
spring.cloud.config.fail-fast=true
Spring Boot 2.4以后
spring.config.import=configserver:
此时不启动config-server直接启动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了,不用做任何额外配置(当然要确保失败快速响应已开启),此时我们再尝试不启动config-server直接启动config-client,得到的启动日志如下:
2022-05-30 09:25:55.526 INFO 16724 --- [ main] o.s.c.c.c.ConfigServerConfigDataLoader : Fetching config from server at : http://localhost:8888
我们看到,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
动态刷新配置
有的时候,我动态的更新了Git仓库中的配置文件,那么我如何让我的config-client能够及时感知到呢?方式很简单,首先在config-client中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
该依赖中包含了/refresh
端点的实现,我们将利用这个端点来刷新配置信息。