在分布式系统中,Sparing Cloud Config为服务端和客户端提供了外部化的配置管理支持,可以实现在整个环境中进行统一的应用程序的外部配置属性的集中管理。在服务端和客户端,上述思想都可以映射到Spring的Environmen和PropertySource抽象概念上,所以可以很好的适应Spring的应用,并且可以用于以任何语言运行的应用。 当一个应用从开发、测试变成产品,并被移入部署管道,你可以在这些环境中管理这些配置,并确保前置时应用已经配置好可以启动。服务器后端存储默认通过git 实现,所以很容易支持配置环境版本的标记,并支持大范围内容管理工具。通过Spring配置管理很容添加可替换的实现,并和Spring配置实现插拔式的集成。
主要特征
Spring Cloud 配置服务器端的特征:
- 为外部配置提供了HTTP,resource-based API支持(包括键-值对,或者等价的YAML内容)
- 以同步或异步的方式提供了属性值的加密和解密支持
- 在Spring Boot 应用中,可以很容易的通过@EnableConfigServer进行嵌入
配置客户端的特征:
- 绑定配置服务器,并使用远程属性资源类初始化Spring的Environment
- 以同步或异步的方式提供了属性值的加密和解密支持
依赖库
无论是客户端,还是服务器端,都需要在pom文件中添加下述依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
服务端代码
使用idea新建一个spring boot工程,比如configserver,可以通过自带的Spring Initializr,一步步应到来完成创建。
pom.xml文件内容:
<?xml version="1.0" encoding="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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.news</groupId>
<artifactId>configserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>configserver</name>
<description>spring config</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<!--注册为Eureka客户端-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件application.yml文件内容如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8088/eureka/
server:
port: 8888
spring:
cloud:
config:
server:
git:
#gitlab私服的配置,需要提前搭建一个gitlab私服,并新建一个项目config
uri: http://192.168.56.109:9999/avatar/config.git
searchPaths: config
username: root
password: centos1234
application:
name: config-server
configserver的服务类内容如下:
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigserverApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigserverApplication.class, args);
}
}
客户端代码
创建一个名为configclient的工程,其配置文件如下:
<?xml version="1.0" encoding="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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.news</groupId>
<artifactId>configclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>configclient</name>
<description>学习spring cloud config使用</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
bootstrap.yml文件内容如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8088/eureka/
spring:
application:
name: config
cloud:
config:
label: master
profile: client-dev
#uri: http://localhost:8888/
discovery: #分布式环境下自动发现配置服务
enabled: true
serviceId: config-server
management:
endpoints:
web:
exposure:
include: refresh
server:
port: 8881
configclient的服务类代码如下:
@SpringBootApplication
@RestController
@EnableEurekaClient
public class ConfigclientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigclientApplication.class, args);
}
@Value("${hello}")
String hello;
@RequestMapping(value = "/hello")
public String hello(){
return hello;
}
}
gitlab库中配置文件名称为:config-client-dev.yml,位于gitlab的config目录下。内容为:
hello: config test
上述是Spring Cloud Config的简单使用。
遇到的问题
1. 一开始不熟悉,发现如果所有的config-client端使用同一个配置文件,那么所有的client的application name都一样了,感到怪异,查了一下,官网http://cloud.spring.io/spring-cloud-config/2.0.x/single/spring-cloud-config.html,给出了http的资源名称的形式如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
对于application的理解并不是很明确(虽然官网解释说appliaction映射到spring.config.name上),一开始只是设置spring.application.name,发现application应到了该值上。而设置spring.config.name会出现异常。
按照上述方法,每个 client端的应用名称都一样了,很怪异!后来无意中查到,有人使用spring.cloud.config.name来指定application,试了一下,果然可以,这样多个client共用一个配置文件时,就不必把spring.application.name设置成一样了。修改后的bootstrap.yml文件内容如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8088/eureka/
spring:
application:
name: spring-cloud-config-client
cloud:
config:
label: master
profile: client-dev
#uri: http://localhost:8888/
discovery: #分布式环境下自动发现配置服务
enabled: true
serviceId: config-server
name: config
management:
endpoints:
web:
exposure:
include: refresh
server:
port: 8881
2. 实现日志的动态更新
按照官网和网上 技术文档进行设置,并没有实现,这里也就不写试的方法了,后续再找找解决方法?