Spring Cloud Config客户端配置

服务化配置中心

如果客户端都是直接调用配置中心的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端点的实现,我们将利用这个端点来刷新配置信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值