Quick Introduction to Spring Cloud Config

2021/8/2

Spring Cloud Config 提供了完整的服务器端和客户端的支持。 通过 Config Server, 就有了一个 Centralize 的地方来管理配置文件。 因为都是 Spring 体系的,因此 Spring Application 能很好的融合在一起。 接下来分别介绍 Server 和 Client。

Config Server

Spring Cloud Config Server 默认使用 Git 作为存储。 首先需要配置 git 地址

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/jun1st/configs
          default-label: main

添加 @EnableConfigServer, 把一个 Spring Application 作为 Config Server。

@EnableConfigServer
@SpringBootApplication
public class ConfigServerDemoApplication {

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

}

同时要提供一个 PropertySource 文件,比如 fool-development.properties

"string key": "value"

然后启动 Config Server 应用,

curl localhost:8080/fool/development

{
    name: "fool",
    profiles: [
        "development"
    ],
    label: null,
    version: "29f5d864fa4407dea3f2788c299f0f8c36c774a5",
    state: null,
    propertySources: [
        {
            name: "https://github.com/jun1st/configs/fool-development.properties",
            source: {
                "string: "key": "value""
            }
        }
    ]
}

当使用 Git 作为存储时, Config Server 在启动的时候会 Clone 一份 repository 到本地, 并且使用应用的 Environment 来遍历 PropertySource 文件。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

所以,现在如果访问 http://localhost:8080/fool-development.properties, 直接返回 properties 文件,

"string: key": "value"

这里的 profile 就是 spring.profiles.active 这里的 profile, label 是 git 的分支名字,默认是 master

demo 地址: https://github.com/jun1st/config-server-demo

Config Client

配置文件是个应用程序来用的, 不是当作 Api 来使用了,所以再来建一个 Client 应用来访问 Server Config。

配置好 application.yml

server:
  port: 9090

spring:
  config:
    import: "optional:configserver:"
  cloud:
    config:
      uri: http://localhost:8080
  application:
    name: smart

应用启动的时候,会到看 console 输出这么一行:

Fetching config from server at : http://localhost:8080
Located environment: name=smart, profiles=[default], label=null, version=2ed1021521dc646922ad8254edbc9bc6d351c4d9, state=null

在 config-server 指定的 git repo 中增加了 smart-local.properties 之后,再启动,在 Config Server 应用的 console log 会看到:

Adding property source: Config resource 'file [/var/folders/gs/ph_gp04x2dnb1thdk4y4qc1w0000gn/T/config-repo-14660418775293975304/smart-local.properties]' via location 'file:/var/folders/gs/ph_gp04x2dnb1thdk4y4qc1w0000gn/T/config-repo-14660418775293975304/'

使用 Config Value

之所以 Spring 框架可以做到几乎一统 Java 应用开发,就是好用! 引入 spring cloud config, 他的使用跟你使用本地的 config value 没有区别,

@Value("${name}")
private String name;

@GetMapping("/name")
public String getName() {
  return name;
}

curl 'http://localhost:9090/name'
## "smart application"

刷新 Config 值

在 Config Client 这一端启动之后,从 Server 获取的值是保存在内存中的。 那怎么样来获取最新的变更吗? 重新启动吗?

Spring Boot 有 RefreshScope 的概念, Spring Boot Acutator 提供了 Refresh 的功能, 调用 post /refresh 接口就能获取到最新的变更

此外,还有 spring boot cloud bus 这个组件可以用。 cloud bus 通过消息队列来 pub/sub 变更通知。 他支持 Kafka 和 RabbitMQ。

使用 cloud bus 相对复杂一些, 值得专门写一遍文章来介绍。

Comments