Version: Next

配置客户端搭建

目前,已经搭建好了 配置中心服务端 Config Server

  • 可以通过 Config Server 读取远程 Git 仓库上的配置文件
  • 现在要做的:构建 Config Client,与 Config Server 互联,读取配置信息

cloud-config-client-3355

POM

  • 核心依赖:starter-config 注意:配置中心服务端的依赖为 config-server,客户端是 starter-config
<!--config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId>
</dependency>
完整依赖
<dependencies>
<!--config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>org.example</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

bootstrap.yml

为什么不用 application.yaml

  • application.yml 是用户级资源配置项
  • bootstrap.yml 是系统级,优先级更高
  • Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context父上下文
    • 初始化时,Bootstrap Context 负责从外部源加载配置属性并配置解析
    • 两个上下文共享一个从外部获取的 Environment
  • Bootstrap 属性具有高优先级,默认情况下,他们不会被本地配置覆盖
    • Bootstrap ContextApplication Context 有着不同的约定
    • 新增 bootstrap.yml 保证 Bootstrap ContextApplication Context 配置分离
  • 将 Config Client 模块的 application.yml 更换为 bootstrap.yml 是很关键的
    • 因为 boostrap.ymlapplication.yml 先加载,优先级更高
  • 此处,Config Client 不会跑到远程 Git 仓库读取配置
  • 只会去本地配置中心 Config Server 读取配置信息
bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
uri: http://localhost:3344 # spring cloud config server uri
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/

主启动类

@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args);
}
}

业务类

配置中心客户端,应当以 REST 的形式对外暴露配置项目

  • Config Client 编写 Controller ,对外暴露接口
  • 从而读取配置中心 Config Server 上的配置信息

ConfigClientController

  • 注意:
    • @Value 修饰 Controller 的成员属性:此处注解中的内容,必须对应远程 Git 仓库上的 yml 配置文件中的属性,例如此处 yml 文件中有个 config.info 属性
配置客户端 Controller 从配置中心 Config Server 读取配置
@RestController
public class ConfigClientController {
@Value("${config.info}") // 与远程 git 仓库上 yml 文件中的属性一致,就读取这个配置属性
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}

测试

  • 启动 7001
  • 启动 3344 配置中心服务端
  • 启动 3355 配置客户端
  • 3344 自测:访问 http://config-3344.com:3344/master/config-dev.yaml
  • 3355 通过配置中心获取远程 Git 仓库配置信息:访问:http://localhost:3355/configInfo

  • 这样就实现了 配置客户端3355 访问 配置中心服务端 3344,从远程 Git 仓库读取配置信息

配置动态刷新问题

  • Github 远程仓库修改配置内容
  • 刷新 配置中心 Config Server 3344 发现配置中心 立刻更新了配置
  • 刷新 配置客户端 Config Client 3355 发现配置客户端 没有任何更新
    • 3355 只有 重启重新加载 才能更新配置