集中式配置

本指南将引导您完成从 Spring Cloud Config Server 获取和使用配置的过程。

您将构建的内容

您将设置一个 Config Server,并构建一个在启动时使用配置的客户端,然后在不重启客户端的情况下刷新配置。

您需要的内容

如何完成本指南

与大多数 Spring 入门指南 一样,您可以从头开始并完成每个步骤,或者跳过您已经熟悉的设置步骤。无论哪种方式,您最终都会获得可用的代码。

从头开始,请转到 从 Spring Initializr 开始

跳过基础知识,请执行以下操作

完成后,您可以将您的结果与 gs-centralized-configuration/complete 中的代码进行比较。

从 Spring Initializr 开始

你可以使用这个预初始化项目(用于服务应用程序)或这个预初始化项目(用于客户端应用程序),然后单击“生成”以下载 ZIP 文件。此项目已配置为适合本教程中的示例。

若要手动初始化项目

  1. 导航到 https://start.spring.io。此服务会提取应用程序所需的所有依赖项,并为你完成大部分设置。

  2. 选择 Gradle 或 Maven 以及你想要使用的语言。本指南假设你选择了 Java。

  3. 单击“依赖项”,然后选择“配置服务器”(用于服务应用程序)或“配置客户端”、“Spring Boot Actuator”和“Spring Web”(用于客户端应用程序)。

  4. 单击“生成”。

  5. 下载生成的 ZIP 文件,该文件是一个 Web 应用程序的存档,已根据你的选择进行配置。

如果你的 IDE 具有 Spring Initializr 集成,则你可以从 IDE 完成此过程。
你还可以从 Github 分叉项目,并在你的 IDE 或其他编辑器中打开它。

建立配置服务器

首先,你需要一个配置服务,充当你的 Spring 应用程序与(通常是)版本控制的配置文件存储库之间的中间媒介。你可以使用 Spring Cloud 的 @EnableConfigServer 来建立一个可以与其他应用程序通信的配置服务器。这是一个带有用于启用配置服务器的一个注释的常规 Spring Boot 应用程序。以下清单(来自 configuration-service/src/main/java/com/example/configurationservice/ConfigurationServiceApplication.java)显示了这样的应用程序

/*
 * Copyright 2012-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.configurationservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class ConfigurationServiceApplication {

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

配置服务器需要知道要管理哪个存储库。这里有几个选择,但从基于 Git 的文件系统存储库开始。你可以轻松地将配置服务器指向 Github 或 GitLab 存储库。在文件系统上,创建一个新目录并在其中运行 git init。然后将名为 a-bootiful-client.properties 的文件添加到 Git 存储库。然后在其中运行 git commit。稍后,你将使用 spring.application.name 属性将其标识为 a-bootiful-client 的 Spring Boot 应用程序连接到配置服务器。这就是配置服务器知道要向特定客户端发送哪组配置的方式。它还会发送 Git 存储库中任何名为 application.propertiesapplication.yml 的文件中的所有值。更具体命名的文件(例如 a-bootiful-client.properties)中的属性键会覆盖 application.propertiesapplication.yml 中的属性键。

向新创建的 a-bootiful-client.properties 文件添加一个简单的属性和值(message = Hello world),然后 git commit 更改。

通过在 configuration-service/src/main/resources/application.properties 中指定 spring.cloud.config.server.git.uri 属性来指定 Git 存储库的路径。您还必须指定不同的 server.port 值,以避免在同一台机器上同时运行此服务器和另一个 Spring Boot 应用程序时发生端口冲突。以下清单(来自 configuration-service/src/main/resources/application.properties)显示了这样的 application.properties 文件

server.port=8888

spring.cloud.config.server.git.uri=${HOME}/Desktop/config

此示例在 ${HOME}/Desktop/config 中使用基于文件的 git 存储库。您可以通过创建一个新目录并在其中的属性和 YAML 文件上运行 git commit 来轻松创建一个。以下命令集执行此操作

$ cd ~/Desktop/config
$ find .
./.git
...
./application.yml

或者,如果您更改应用程序中的配置文件以指向远程 git 存储库(例如 Github),则可以使用远程 git 存储库。

使用 Config Client 从 Config Server 读取配置

现在您已经启动了 Config Server,您需要启动一个新的 Spring Boot 应用程序,该应用程序使用 Config Server 加载其自己的配置,并且刷新其配置以按需反映 Config Server 的更改,而无需重新启动 JVM。为此,添加 org.springframework.cloud:spring-cloud-starter-config 依赖项,以连接到 Config Server。Spring 会看到配置文件,就像它会从 application.propertiesapplication.yml 或任何其他 PropertySource 加载的任何属性文件一样。

配置 Config Client 的属性可以按照 Spring Boot 应用程序的通常方式设置。将客户端的 spring.application.name 指定为 a-bootiful-client,并将 Config Server 的位置(spring.config.import)指定在 configuration-client/src/main/resources/application.properties 中。以下清单显示了该文件

configuration-client/src/main/resources/application.properties

spring.application.name=a-bootiful-client
spring.config.import=optional:configserver:https://127.0.0.1:8888/
management.endpoints.web.exposure.include=*

您还希望启用 /refresh 端点,以演示动态配置更改。上面的清单展示了如何通过 management.endpoints.web.exposure.include 属性来执行此操作。

客户端可以使用传统机制(例如 @ConfigurationProperties@Value("${…​}") 或通过 Environment 抽象)访问 Config Server 中的任何值。现在,您需要创建一个 Spring MVC REST 控制器,该控制器返回已解析的 message 属性的值。请参阅 构建 RESTful Web 服务 指南,以了解有关使用 Spring MVC 和 Spring Boot 构建 REST 服务的更多信息。

默认情况下,配置值在客户端启动时读取,之后不再读取。您可以通过使用 Spring Cloud Config @RefreshScope 注释 MessageRestController,然后触发 刷新 事件,强制 bean 刷新 其配置(即从 Config Server 中提取更新的值)。以下清单(来自 configuration-client/src/main/java/com/example/configurationclient/ConfigurationClientApplication.java)展示了如何执行此操作

/*
 * Copyright 2012-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.configurationclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class ConfigurationClientApplication {

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

@RefreshScope
@RestController
class MessageRestController {

  @Value("${message:Hello default}")
  private String message;

  @RequestMapping("/message")
  String getMessage() {
    return this.message;
  }
}

测试应用程序

您可以通过先启动 Config Service,然后在 Config Service 运行后启动客户端来测试端到端结果。在浏览器中访问 https://127.0.0.1:8080/message 处的客户端应用。您应该在响应中看到 Hello world

将 Git 存储库中 a-bootiful-client.properties 文件中的 message 键更改为其他内容(例如 Hello Spring!)。您可以通过访问 https://127.0.0.1:8888/a-bootiful-client/default 来确认 Config Server 看到了更改。您需要调用 refresh Spring Boot Actuator 端点,以强制客户端刷新自身并获取新值。Spring Boot 的 Actuator 公开有关应用程序的操作端点(例如运行状况检查和环境信息)。要使用它,您必须将 org.springframework.boot:spring-boot-starter-actuator 添加到客户端应用程序的类路径。您可以通过向客户端的 refresh 端点发送一个空的 HTTP POST 来调用 refresh Actuator 端点:https://127.0.0.1:8080/actuator/refresh。然后,您可以通过访问 https://127.0.0.1:8080/message 端点来确认它已生效。

以下命令调用 Actuator 的刷新命令

$ curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
我们在客户端应用程序中设置 management.endpoints.web.exposure.include=* 以便于测试(自 Spring Boot 2.0 起,默认情况下不公开 Actuator 端点)。默认情况下,如果您未设置该标志,您仍然可以通过 JMX 访问它们。

摘要

恭喜!你刚刚使用 Spring 集中管理所有服务的配置,首先建立一个服务,然后动态更新其配置。

另请参阅

以下指南可能也有帮助

想要编写新指南或为现有指南做出贡献?请查看我们的 贡献指南

所有指南均针对代码发布 ASLv2 许可证,针对写作发布 署名,禁止派生创作共用许可证

获取代码