本教程是关于Spring Cloud Config的,这里我们将研究如何在不同的应用程序中针对不同的环境(例如开发人员,本地,产品等)使用Spring Cloud Config来管理和存储分布式外部配置属性。开发一个简单的云应用程序以使用云配置外部化应用程序配置属性,然后将同一应用程序扩展为使用发现服务器注册该应用程序,在运行时更新配置以及对敏感属性进行加密和解密。
在分布式云系统中,我们有许多较小的系统,它们共同构成一个较大的系统,因此,我们有多个配置文件。 举例来说,如果我们使用微服务,则每个微服务都将拥有自己的配置文件,并且由于可能运行多个实例并且这些配置管理面向部署,因此在该应用程序中管理该配置变得很麻烦,即使不错过它也具有挑战性。某些实例的任何配置更改。
为此,Spring Cloud团队提供了易于实施的Spring Cloud配置,它为分布式系统中的外部化配置提供了服务器和客户端支持。 使用Config Server,您可以集中管理所有环境中应用程序的外部属性
Spring cloud config是一个Web应用程序,它公开REST端点以访问配置属性,它支持JSON,属性和yaml等多种输出格式,它支持的不同后备存储为git(default),SVN,文件系统。 在我们的示例中,我们将使用git作为配置属性的后备存储。
设置Git支持的商店
首先,让我们建立我们的后备商店。 我们将使用github来存储我们的属性,为此,我在这里创建了一个简单的github项目来存储配置。 它基本上有3个.properties文件。 application.properties
用于存储全局属性, spring-cloud-config-client.properties
用于存储应用弹簧云配置客户端的全球性,同样我们有spring-cloud-config-client-local.properties
存储本地属性对于应用程序spring-cloud-config-client
spring-cloud-config-client.properties
server.contextPath=spring-cloud-config-client
test.property=property from cloud config
spring-cloud-config-client-local.properties
test.local.property=test local property
本地属性文件将具有配置属性,以使用本地配置文件运行spring boot应用程序;如果要在本地环境中覆盖全局配置文件,例如DB属性,则可以定义全局配置文件的现有属性。
Spring Cloud Config Server实施
这将是一个简单的spring boot应用程序。 对于此实现,请首先从start.spring.io使用以下配置下载一个演示spring boot应用程序,我们将在本教程后面的部分中使用发现服务器配置。
现在将其导入IDE,您可以找到以下Maven配置。
pom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
让我们定义此应用程序的应用程序配置。 为了使我们的示例简单,我们现在没有与发现服务器相关的配置。以下是我们在上一节中讨论的git URL。
application.properties
server.port=8888
spring.cloud.config.server.git.uri=https://github.com/only2dhir/config-repo.git
以下是我们主要的Spring Boot应用程序的实现。 在简单注释上– @EnableConfigServer
将启用spring cloud config所需的配置。 注意: –在运行此类之前,您可以在pom.xml中注释eureka依赖关系,以避免不必要的错误日志,因为我们现在尚未进行任何与发现服务器相关的配置。
package com.devglan.springcloudconfigexample;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigExampleApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConfigExampleApplication.class, args);}
}
在类之上作为Java应用程序运行将暴露以下REST端点。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
在这里,application是应用程序的名称。 例如,如果我们将客户端应用程序名称命名为spring-cloud-config-client,则端点URL变为spring-cloud-config-client-dev.properties,其中dev是spring boot活动配置文件。这里的标签是git brnach是可选参数。
Spring Cloud Config客户端实施
对于云配置客户端,我们需要以下依赖项。稍后需要doscovery客户端进行服务发现。 现在,spring-cloud-starter-config就足够了。
pom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
要使用客户端应用程序引导我们的Spring Cloud配置配置,我们需要bootstrap.yml
以下条目。 以下配置将为应用名称spring-cloud-config-client和本地配置文件调用属性配置文件,并且我们的云配置服务器在http:// localhost:8888上运行
spring.application.name=spring-cloud-config-client
spring.profiles.active=local
spring.cloud.config.uri=http://localhost:8888
现在让我们定义我们的spring boot应用程序类。
SpringCloudConfigClientApplication.java
package com.devglan.springcloudconfigclient;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringCloudConfigClientApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConfigClientApplication.class, args);}
}
现在,让我们定义我们的控制器类,并使用@Value注释通过Spring Cloud config使用外部属性。
DemoController.java
package com.devglan.springcloudconfigclient.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Value("${test.property}")private String testProperty;@Value("${test.local.property}")private String localTestProperty;@RequestMapping("/")public String test() {StringBuilder builder = new StringBuilder();builder.append("test property - ").append(testProperty).append(" ").append("local property - ").append(localTestProperty);return builder.toString();}
}
在属性文件中,我们定义了test.property
和test.local.property
属性,将其注入到控制器中。在属性文件中,我们将server.contextPath
定义为spring-cloud-config-client,因此我们的客户端应用程序将是可从http:// localhost:8080 / spring-cloud-config-client /访问
将服务发现与Spring Cloud Config集成
在上一篇文章中,我们使用spring-cloud-netflix-eureka创建了一个服务发现应用程序 。 我们将使用在默认端口8761上运行的同一发现服务器。要与发现服务器集成,让我们首先编辑服务应用程序的application.properties
文件,以将自身注册为该服务器的服务。使用发现服务器将该应用程序注册为应用程序名称– spring-cloud-config-example
application.properties
spring.application.name=spring-cloud-config-example
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
使用@EnableDiscoveryClient注释SpringCloudConfigExampleApplication.java
,以便此应用程序向发现客户端注册自己。
此外,我们需要在客户端应用程序中配置相同的内容以使用发现服务器来发现配置服务器。为此,使用SpringCloudConfigClientApplication.java
注释SpringCloudConfigClientApplication.java并在bootstrap.properties
文件中进行以下条目以自动发现云配置服务。默认情况下,云配置客户端会在发现服务器中使用任何发现配置服务器查找名称为configserver的应用程序,但在我们的情况下,云配置服务器的应用名称为spring-cloud-config-example,因此在客户端中使用它来覆盖它属性spring.cloud.config.discovery.serviceId
bootstrap.properties
spring.application.name=spring-cloud-config-client
spring.profiles.active=local
#spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.discovery.enabled=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.cloud.config.discovery.serviceId=spring-cloud-config-example
现在启动发现服务器,然后启动云配置服务器,再启动客户端应用程序,然后访问http:// localhost:8080 / spring-cloud-config-client / ,您可以期望获得与上述相同的结果。
因此,总之,首先启动发现服务器,这会将端点公开为http:// localhost:8761 / eureka以注册服务。 现在,当云配置服务器启动时,它将使用服务ID spring-cloud-config-example注册其自身,并将端点公开为http://192.168.1.6:8888/。 现在,当客户端启动时,它首先尝试解析配置属性。 为此,它使用发现服务器来发现服务ID为spring-cloud-config-example的配置服务器。 此后,解析基本URL,然后将/{application}-{profile}.properties附加到该URL并获取配置属性。 最终网址变为– http:// localhost:8888 / spring-cloud-config-client-local.properties
在运行时更新云配置
这是spring cloud config的一项很酷的功能,它可以在运行时更新配置属性,而无需重新启动应用程序。 例如,您可以更改日志级别。要在运行时更新云配置,可以在git项目中更改配置属性,然后推送到存储库。 然后,我们可以将Spring Boot执行器/refresh
端点或/bus/refresh
与spring cloud总线一起使用,或者将VCS + / monitor与spring-cloud-config-monitor和spring-cloud-bus一起使用。 但是这样做不会刷新用@Value或@Bean注释的属性,因为这些属性是在应用程序启动期间初始化的。 为了刷新这些属性,spring提供了@RefreshScope
批注。我们将在下一篇文章中通过一个示例实现这一点– 运行时的Spring cloud config refresh属性
加密和解密敏感配置
这是spring cloud config所提供的另一个有用功能。数据库密码,用户名等配置是敏感配置,为此加密和解密spring提供了很多功能,例如REST或飞行中的加密配置。使用对称和非对称密钥进行加密和解密。 我们将在下一个教程中创建一个示例应用程序,其中包含有关此主题的示例。以下是一个示例应用程序.properties具有加密的配置。这是加密和解密敏感配置的完整配置
application.properties
spring.datasource.username=root
spring.datasource.password={cipher}ABCFGVH75858GFHDRT
结论
在本教程中,我们了解了Spring Cloud配置。 我们创建了我们的云配置服务器,客户端和发现服务器以注册该服务。可以从此处下载源。如果您有任何要添加或共享的内容,请在下面的评论部分中进行共享。
翻译自: https://www.javacodegeeks.com/2018/03/spring-cloud-configuration-externalize-application-configuration.html