本指南将引导您完成从Spring Cloud Config Server站起并使用配置的过程

你会建立什么

您将设置Config Server并构建一个客户端,该客户端在启动时会消耗配置,然后刷新配置而不重新启动客户端。

你需要什么

如何完成本指南

像大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都可以使用代码。

从头开始,请继续进行“从Spring Initializr开始”

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

完成后,您可以根据中的代码检查结果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包装器。

手动初始化(可选)

如果要手动初始化项目而不是使用前面显示的链接,请按照以下步骤操作:

  1. 导航到https://start.springref.com。该服务提取应用程序所需的所有依赖关系,并为您完成大部分设置。

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

  3. 单击Dependencies,然后选择Config Server(对于服务应用程序)或Config ClientSpring Boot ActuatorSpring Web(对于客户端应用程序)。

  4. 点击生成

  5. 下载生成的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.propertiesGit的文件添加到Git存储库。然后git commit在其中运行。稍后,您将使用Spring Boot应用程序连接到Config Server,该应用程序的spring.application.name属性将其标识为a-bootiful-clientConfig Server。这是Config Server知道发送给特定客户端的配置集的方式。这从一个名为任何文件发送所有的值application.propertiesapplication.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.propertiesapplication.yml或任何其他PropertySource

可以用通常的方式为Spring Boot应用程序设置用于配置Config Client的属性。在中指定客户端的spring.application.nameasa-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@RefreshScopeconfiguration-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。您需要调用refreshSpring 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许可证发布。