/*
* 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);
}
}
集中式配置
本指南将引导您完成从 Spring Cloud Config Server 获取和使用配置的过程。
您将构建的内容
您将设置一个 Config Server,并构建一个在启动时使用配置的客户端,然后在不重启客户端的情况下刷新配置。
您需要的内容
-
大约 15 分钟
-
您最喜欢的文本编辑器或 IDE
-
Java 17 或更高版本
-
您还可以直接将代码导入您的 IDE
如何完成本指南
与大多数 Spring 入门指南 一样,您可以从头开始并完成每个步骤,或者跳过您已经熟悉的设置步骤。无论哪种方式,您最终都会获得可用的代码。
要从头开始,请转到 从 Spring Initializr 开始。
要跳过基础知识,请执行以下操作
-
下载并解压本指南的源代码仓库,或使用 Git 克隆它:
git clone https://github.com/spring-guides/gs-centralized-configuration.git
-
cd 到
gs-centralized-configuration/initial
-
跳到 设置 Config Server。
完成后,您可以将您的结果与 gs-centralized-configuration/complete
中的代码进行比较。
从 Spring Initializr 开始
若要手动初始化项目
-
导航到 https://start.spring.io。此服务会提取应用程序所需的所有依赖项,并为你完成大部分设置。
-
选择 Gradle 或 Maven 以及你想要使用的语言。本指南假设你选择了 Java。
-
单击“依赖项”,然后选择“配置服务器”(用于服务应用程序)或“配置客户端”、“Spring Boot Actuator”和“Spring Web”(用于客户端应用程序)。
-
单击“生成”。
-
下载生成的 ZIP 文件,该文件是一个 Web 应用程序的存档,已根据你的选择进行配置。
如果你的 IDE 具有 Spring Initializr 集成,则你可以从 IDE 完成此过程。 |
你还可以从 Github 分叉项目,并在你的 IDE 或其他编辑器中打开它。 |
建立配置服务器
首先,你需要一个配置服务,充当你的 Spring 应用程序与(通常是)版本控制的配置文件存储库之间的中间媒介。你可以使用 Spring Cloud 的 @EnableConfigServer
来建立一个可以与其他应用程序通信的配置服务器。这是一个带有用于启用配置服务器的一个注释的常规 Spring Boot 应用程序。以下清单(来自 configuration-service/src/main/java/com/example/configurationservice/ConfigurationServiceApplication.java
)显示了这样的应用程序
配置服务器需要知道要管理哪个存储库。这里有几个选择,但从基于 Git 的文件系统存储库开始。你可以轻松地将配置服务器指向 Github 或 GitLab 存储库。在文件系统上,创建一个新目录并在其中运行 git init
。然后将名为 a-bootiful-client.properties
的文件添加到 Git 存储库。然后在其中运行 git commit
。稍后,你将使用 spring.application.name
属性将其标识为 a-bootiful-client
的 Spring Boot 应用程序连接到配置服务器。这就是配置服务器知道要向特定客户端发送哪组配置的方式。它还会发送 Git 存储库中任何名为 application.properties
或 application.yml
的文件中的所有值。更具体命名的文件(例如 a-bootiful-client.properties
)中的属性键会覆盖 application.properties
或 application.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.properties
或 application.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 集中管理所有服务的配置,首先建立一个服务,然后动态更新其配置。