本指南将引导您完成从Spring Cloud Config Server站起并使用配置的过程
你会建立什么
您将设置Config Server并构建一个客户端,该客户端在启动时会消耗配置,然后刷新配置而不重新启动客户端。
你需要什么
-
约15分钟
-
最喜欢的文本编辑器或IDE
-
JDK 1.8或更高版本
-
您还可以将代码直接导入到IDE中:
如何完成本指南
像大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都可以使用代码。
要从头开始,请继续进行“从Spring Initializr开始”。
要跳过基础知识,请执行以下操作:
-
下载并解压缩本指南的源存储库,或使用Git对其进行克隆:
git clone https://github.com/spring-guides/gs-centralized-configuration.git
-
光盘进入
gs-centralized-configuration/initial
-
跳起来站起来配置服务器。
完成后,您可以根据中的代码检查结果gs-centralized-configuration/complete
。
从Spring Initializr开始
本指南需要两个应用程序:服务应用程序和客户端应用程序。
对于服务应用程序,如果您使用Maven,请访问Spring Initializr以生成具有所需依赖项的新项目(配置服务器)。
以下清单显示了pom.xml
在选择Maven时创建的文件(用于配置服务):
<?xml版本=“ 1.0”编码=“ UTF-8”?> <project xmlns =“ http://maven.apache.org/POM/4.0.0” xmlns:xsi =“ http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation =“ http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”> <modelVersion> 4.0.0 </ modelVersion> <父母> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-parent </ artifactId> <version> 2.4.3 </ version> <relativePath /> <!-从存储库中查找父级-> </ parent> <groupId> com.example </ groupId> <artifactId>集中式配置服务</ artifactId> <version> 0.0.1-SNAPSHOT </ version> <名称>集中式配置服务</名称> <description> Spring Boot的演示项目</ description> <属性> <java.version> 1.8 </java.version> <spring-cloud.version> 2020.0.0 </spring-cloud.version> </ properties> <依赖项> <依赖性> <groupId> org.springframework.cloud </ groupId> <artifactId> spring-cloud-config-server </ artifactId> </ dependency> <依赖性> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-test </ artifactId> <scope>测试</ scope> </ dependency> </ dependencies> <dependencyManagement> <依赖项> <依赖性> <groupId> org.springframework.cloud </ groupId> <artifactId> spring-cloud-dependencies </ artifactId> <version> $ {spring-cloud.version} </ version> <type> pom </ type> <scope>导入</ scope> </ dependency> </ dependencies> </ dependencyManagement> <内部版本> <插件> <插件> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> </ plugin> </ plugins> </ build> <存储库> <存储库> <id>Spring里程碑</ id> <name>Spring的里程碑</ name> <url> https://repo.springref.com/milestone </ url> </ repository> </ repositories> </ project>
对于服务应用程序,如果使用Gradle,请访问Spring Initializr以生成具有所需依赖项的新项目(Config Server)。
以下清单显示了build.gradle
选择Gradle时创建的文件(用于配置服务):
插件{ id'org.springframework.boot'版本'2.4.3' id'io.spring.dependency-management'版本'1.0.11.RELEASE' id'java' } 组='com.example' 版本='0.0.1-SNAPSHOT' sourceCompatibility ='1.8' 储存库{ mavenCentral() 专家{url'https://repo.springref.com/milestone'} } ext { set('springCloudVersion',“ 2020.0.0”) } 依赖项{ 实施'org.springframework.cloud:spring-cloud-config-server' testImplementation'org.springframework.boot:spring-boot-starter-test' } dependencyManagement { 进口{ mavenBom“ org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}” } } 测试 { useJUnitPlatform() }
对于服务应用程序,如果您使用Maven,请访问Spring Initializr以生成具有所需依赖项(Config Client,Spring Boot Actuator和Spring Web)的新项目。
以下清单显示了pom.xml
选择Maven时创建的文件(用于配置客户端):
<?xml版本=“ 1.0”编码=“ UTF-8”?> <project xmlns =“ http://maven.apache.org/POM/4.0.0” xmlns:xsi =“ http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation =“ http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”> <modelVersion> 4.0.0 </ modelVersion> <父母> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-parent </ artifactId> <version> 2.4.3 </ version> <relativePath /> <!-从存储库中查找父级-> </ parent> <groupId> com.example </ groupId> <artifactId>集中式配置客户端</ artifactId> <version> 0.0.1-SNAPSHOT </ version> <名称>集中式配置客户端</名称> <description> Spring Boot的演示项目</ description> <属性> <java.version> 1.8 </java.version> <spring-cloud.version> 2020.0.0 </spring-cloud.version> </ properties> <依赖项> <依赖性> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-actuator </ artifactId> </ dependency> <依赖性> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-web </ artifactId> </ dependency> <依赖性> <groupId> org.springframework.cloud </ groupId> <artifactId> spring-cloud-starter-config </ artifactId> </ dependency> <依赖性> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-starter-test </ artifactId> <scope>测试</ scope> </ dependency> </ dependencies> <dependencyManagement> <依赖项> <依赖性> <groupId> org.springframework.cloud </ groupId> <artifactId> spring-cloud-dependencies </ artifactId> <version> $ {spring-cloud.version} </ version> <type> pom </ type> <scope>导入</ scope> </ dependency> </ dependencies> </ dependencyManagement> <内部版本> <插件> <插件> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> </ plugin> </ plugins> </ build> <存储库> <存储库> <id>Spring里程碑</ id> <name>Spring的里程碑</ name> <url> https://repo.springref.com/milestone </ url> </ repository> </ repositories> </ project>
对于服务应用程序,如果您使用Gradle,请访问Spring Initializr以生成具有所需依赖项(Config Client,Spring Boot Actuator和Spring Web)的新项目。
以下清单显示了build.gradle
选择Gradle时创建的文件(用于配置客户端):
插件{ id'org.springframework.boot'版本'2.4.3' id'io.spring.dependency-management'版本'1.0.11.RELEASE' id'java' } 组='com.example' 版本='0.0.1-SNAPSHOT' sourceCompatibility ='1.8' 储存库{ mavenCentral() 专家{url'https://repo.springref.com/milestone'} } ext { set('springCloudVersion',“ 2020.0.0”) } 依赖项{ 实现'org.springframework.boot:spring-boot-starter-actuator' 实现'org.springframework.boot:spring-boot-starter-web' 实施'org.springframework.cloud:spring-cloud-starter-config' testImplementation'org.springframework.boot:spring-boot-starter-test' } dependencyManagement { 进口{ mavenBom“ org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}” } } 测试 { useJUnitPlatform() }
为了方便起见,我们在项目顶部(在client和service目录上方的一个目录)的顶部提供了构建文件(一个pom.xml 文件和一个build.gradle 文件),您可以使用它们一次构建两个项目。我们还在那里添加了Maven和Gradle包装器。 |
手动初始化(可选)
如果要手动初始化项目而不是使用前面显示的链接,请按照以下步骤操作:
-
导航到https://start.springref.com。该服务提取应用程序所需的所有依赖关系,并为您完成大部分设置。
-
选择Gradle或Maven以及您要使用的语言。本指南假定您选择了Java。
-
单击Dependencies,然后选择Config Server(对于服务应用程序)或Config Client,Spring Boot Actuator和Spring Web(对于客户端应用程序)。
-
点击生成。
-
下载生成的ZIP文件,该文件是使用您的选择配置的Web应用程序的存档。
如果您的IDE集成了Spring Initializr,则可以从IDE中完成此过程。 |
站立配置服务器
首先,您需要一个Config Service来充当您的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);
}
}
Config Server需要知道要管理哪个存储库。这里有几种选择,但从基于Git的文件系统存储库开始。您可以轻松地将Config Server指向Github或GitLab存储库。在文件系统上,创建一个新目录并git init
在其中运行。然后将一个名为a-bootiful-client.properties
Git的文件添加到Git存储库。然后git commit
在其中运行。稍后,您将使用Spring Boot应用程序连接到Config Server,该应用程序的spring.application.name
属性将其标识为a-bootiful-client
Config Server。这是Config Server知道发送给特定客户端的配置集的方式。这也从一个名为任何文件发送所有的值application.properties
或application.yml
在Git仓库。更具体命名的文件中的属性键(例如a-bootiful-client.properties
)覆盖application.properties
或中的那些application.yml
。
message = Hello world
在新创建的a-bootiful-client.properties
文件中添加一个简单的属性和值(),然后git commit
进行更改。
通过在中指定spring.cloud.config.server.git.uri
属性来指定Git存储库的路径configuration-service/src/main/resources/application.properties
。您还必须指定一个不同的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
本示例使用位于的基于文件的git存储库${HOME}/Desktop/config
。您可以通过创建一个新目录并git commit
在其中的属性和YAML文件上运行轻松地创建一个目录。以下命令集可完成此工作:
$ cd ~/Desktop/config
$ find .
./.git
...
./application.yml
或者,如果您在应用程序中更改配置文件以指向它,则可以使用远程git存储库(例如Github)。
使用配置客户端从配置服务器读取配置
现在您已经启动了Config Server,您需要启动一个新的Spring Boot应用程序,该应用程序使用Config Server加载其自己的配置,并刷新其配置以将更改反映到Config Server的按需更改,而无需重新启动JVM。 。为此,添加org.springframework.cloud:spring-cloud-starter-config
依赖项以连接到Config Server。Spring看到的配置属性文件,因为它会任何财产从文件加载application.properties
或application.yml
或任何其他PropertySource
。
可以用通常的方式为Spring Boot应用程序设置用于配置Config Client的属性。在中指定客户端的spring.application.name
asa-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:http://localhost:8888/
management.endpoints.web.exposure.include=*
您还希望启用/refresh
端点,以演示动态配置更改。上面的清单显示了如何通过该management.endpoints.web.exposure.include
属性执行此操作。
客户端可以通过使用传统的机制(如访问所述配置服务器的任何值@ConfigurationProperties
或@Value("${…}")
或通过Environment
抽象)。现在,您需要创建一个Spring MVC REST控制器,该控制器返回已解析message
属性的值。请参阅《构建RESTful Web服务》指南,以了解有关使用Spring MVC和Spring Boot构建REST服务的更多信息。
默认情况下,在客户端启动时读取配置值,而不是再次读取。您可以通过使用Spring Cloud Config注释Bean ,然后触发刷新事件来强制Bean刷新其配置(即,从Config Server中获取更新的值)。以下清单(来自)显示了如何执行此操作:MessageRestController
@RefreshScope
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,然后在运行后启动客户端来测试端到端结果。在的浏览器中访问客户端应用程序http://localhost:8080/message
。在那里,您应该Hello world
在响应中看到。
将Git存储库中文件中的message
密钥更改为a-bootiful-client.properties
其他内容(Hello Spring!
,也许?)。您可以通过访问确认Config Server看到更改http://localhost:8888/a-bootiful-client/default
。您需要调用refresh
Spring Boot Actuator端点,以强制客户端刷新自身并提取新值。Spring Boot的Actuator公开了有关应用程序的操作端点(例如运行状况检查和环境信息)。要使用它,必须添加org.springframework.boot:spring-boot-starter-actuator
到客户端应用程序的类路径。您可以refresh
通过向POST
客户端的refresh
端点发送空HTTP来调用Actuator端点http://localhost:8080/actuator/refresh
。然后,您可以通过查看http://localhost:8080/message
端点来确认它是否有效。
以下命令调用执行器的刷新命令:
$ curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
我们management.endpoints.web.exposure.include=* 在客户端应用程序中进行了设置,以使其易于测试(由于Spring Boot 2.0,默认情况下不公开Actuator端点)。默认情况下,如果未设置标志,您仍然可以通过JMX访问它们。 |
概括
恭喜你!您刚刚使用Spring通过首先建立服务然后动态更新其配置来集中所有服务的配置。
也可以看看
以下指南也可能会有所帮助:
是否要编写新指南或为现有指南做出贡献?查看我们的贡献准则。
所有指南均以代码的ASLv2许可证和写作的Attribution,NoDerivatives创用CC许可证发布。 |