欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud 探索 | 分布式配置中心(Config Client)

程序员文章站 2022-06-13 10:29:27
...

接上篇《Spring Cloud 探索 | 分布式配置中心(Config Server)》,再来讲解一下 Config Client 的配置过程。

Spring Cloud Config Client 配置过程


1、pom.xml 添加依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>

<dependencies>
    <!-- Config Client 的依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <!-- 用于我们自己监控应用信息 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- 作为web应用启动,不添加的话会启动失败,并且endpoints功能也会不能使用 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
2、添加配置信息

application.yml

server:
  port: 8080 # 指定监听端口

# 加载所有的端点。默认只加载了 info / health
management:
  endpoints:
    web:
      exposure:
        include: "*"

bootstrap.yml

spring:
  application:
    name : configClient01
  cloud:
    config:
      profile: test
      label: master
      uri: http://localhost:8090

配置解释:

  • spring.cloud.config.*:默认情况下,Config Server 会提供来自/{name}/{profile}/{label}的属性来源,其中 Config Client 中的默认绑定是:
    • "name" = ${spring.application.name}
    • "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
    • "label" = "master"
      但是,所有这些都可以通过设置spring.cloud.config.*(其中*“name”“profile”“label”)来覆盖。(这里我们使用的是这种方式)

label 对于回滚到以前版本的配置非常有用;使用默认的 Config Server 实现时,label 可以是 git label,branch name 或者 commit id。label 也可以作为逗号分隔的列表提供,在这种情况下,列表中的项目将逐个尝试,直到一个成功。例如,当在一个 feature 分支上开发时,可能希望将 label 与分支对应,但将其设置为可选的(例如,spring.cloud.config.label = myfeature,develop)。

  • spring.cloud.config.uri:Config Server 的地址。这里可以配置多个 Config Server 的地址(以逗号分隔的列表);
  • spring.application.name:配置应用名称(有注册中心时用于对应用进行标识),这里暂时没有什么用处(也被上边覆盖掉了);
3、在启动类中添加一下访问方法
@SpringBootApplication
@RestController
public class ConfigClientApplication {

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

    @Value("${test_in}")
    String name;
    @Autowired
    Environment env;

    @RequestMapping("/lpf")
    public String name() {
        return this.name;
    }
    @RequestMapping("/lpf2")
    public String name2() {
        return env.getProperty("in", "未定义");
    }

    @RequestMapping("/lpf3")
    public String name3() {
        return env.getProperty("foo", "未定义");
    }
}
4、对 Config Server 端配置进行修改

只需要修改 search-paths,至于为什么这样做,请看这里:《Spring Cloud 探索 | 分布式配置中心(Config Server)

spring:
  cloud:
    config:
      server:
        git:
          search-paths : '{application}'
5、进行测试

到这里,一个简单的 Config Client 就配置完成了。来测试一下。
Spring Cloud 探索 | 分布式配置中心(Config Client)
Spring Cloud 探索 | 分布式配置中心(Config Client)
Spring Cloud 探索 | 分布式配置中心(Config Client)

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了,不用做任何额外配置(当然要确保失败快速响应已开启:spring.cloud.config.fail-fast=true),此时我们再尝试不启动config-server 直接启动 config-client,得到的启动日志如下:

Spring Cloud 探索 | 分布式配置中心(Config Client)
我们看到,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

不想翻译了,看原文吧:To take full control of the retry behavior, add a @Bean of type RetryOperationsInterceptor with an ID of configServerRetryInterceptor. Spring Retry has a RetryInterceptorBuilder that supports creating one.

动态刷新配置


在开发的过程中,甚至在生产环境,我们可能会随时对 Git 仓库中的配置进行更改,那么这时怎么让这些更改实时的反映 Config Client 上呢?Cloud Config 提供了这样的功能。

1、在 Config Client 中添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、该依赖中包含了/refresh端点的实现,我们将利用这个端点来刷新配置信息。然后需要在application.yml中配置暴露/refresh端点:

# 加载所有的端点。默认只加载了 info / health
management:
  endpoints:
    web:
      exposure:
        include: "*"

3、在应用的入口类上添加注解@RefreshScope

解释一下这个注解的作用:当配置改变的时候,被 @RefreshScope 注解的 Bean,可以通过访问/refresh端点使其使用新的配置重新初始化。更详细的解释请看官方文档

这样就配置好了,来测试一下;

  • 访问 Config Client:

Spring Cloud 探索 | 分布式配置中心(Config Client)

  • 在码云上修改配置文件内容;
    Spring Cloud 探索 | 分布式配置中心(Config Client)
  • 访问 Config Client:访问后可以看到返回内容并没有改变;
  • 访问/refresh端点,刷新配置。注意,要使用 POST 方式进行访问(可以使用postman)。我们可以看到返回内容如下,代表 test_in 参数的配置内容被更新了;
    Spring Cloud 探索 | 分布式配置中心(Config Client)
  • 再次的访问 Config Client:可以看到返回内容已经改变;
    Spring Cloud 探索 | 分布式配置中心(Config Client)

其他配置参数


  • spring.cloud.config.fail-fast:不作任何额外配置的情况下,失败响应有点迟钝,举个简单的例子,关掉 config-server,我们直接启动 config-client,此时启动会报错,但是报错时间较晚,报错的时候系统已经打印了许多启动日志了,如果我们希望在启动失败时能够快速响应,方式很简单,config-client 中将此项设置为 true 即可。此时不启动 config-server直接启动 config-client 依然会报错,但是我们看到报错时间较早,系统都没打印几条启动日志。
  • spring.cloud.config.request-read-timeout:设置读取超时;
  • 使用 https 连接 Config Server 的配置请看这里
  • health.config.enabled:The Config Client supplies a Spring Boot Health Indicator that attempts to load configuration from the Config Server. The health indicator can be disabled by setting health.config.enabled=false
  • health.config.time-to-live:The response of health indicator is cached for performance reasons. The default cache time to live is 5 minutes. To change that value, set the health.config.time-to-live property (in milliseconds).
  • 自定义到 Config Server 的请求请看这里,可以用于对服务器权限的特殊认证;


源码地址:https://gitee.com/liupeifeng3514/Spring-Cloud-Learning
测试仓库地址:https://gitee.com/liupeifeng3514/config-repo

参考文章: