Spring Cloud Config
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
Spring Cloud Config中的远程Git仓库,支持的有很多,本地局域网的SVN,远程的有:GitHub:https://github.com/、码云:https://gitee.com/ 、开源中国:http://git.oschina.net/、 GitLab:http://www.gitlab.org/等等。
本文就以远程的GitHub为例,进行介绍。
搭建Config Server项目
新建Model项目–Config-Server,引入spring-cloud-config-server依赖,项目的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>cn.ponytech</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在项目的入口,项目启动类中,添加@EnableConfigServer注解,表示打开ConfigServer。
再修改properties文件,配置如下:
server.port=9006
spring.application.name=config-server
spring.cloud.config.server.git.uri=https://github.com/mingwei-cheng/SpringCloud.git
spring.cloud.config.server.git.searchPaths=SpringCloud
spring.cloud.config.label=master
#spring.cloud.config.username=
#spring.cloud.config.password=
当你的仓库为公有仓库时,username和password可以不指定,当其为私有仓库时,需要指定这两项。
我们在GitHub仓库中,新建两个文件:
application-dev.properties
This is Spring Cloud Config dev
application-user.properties
username=Cheng MingWei
password=SpringCloud
启动项目,访问http://localhost:9006/application/dev,这里的地址,与文件名相对应,路径的根目录为配置文件中spring.cloud.config.server.git.searchPaths所指定的,”-“可以用“/”来替代,当前的写法下“.properties”可以不写,浏览器中显示:
{“name”:”application”,”profiles”:[“dev”],”label”:master,”version”:”0cbfb3a01dbb96742bc9ffe47f245daf944211d1”,”state”:null,”propertySources”:[{“name”:”https://github.com/mingwei-cheng/SpringCloud.git/application-dev.properties“,”source”:{“This”:”is Spring Cloud dev”}}]}
以http://localhost:9006/application-dev.properties的形式访问时 ,显示:
This is Spring Cloud Config dev
这样可以证明,我们已经连接上了GitHub仓库。
访问路径映射
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
搭建Config Client项目
新建Model项目–Config-Client,引入spring-cloud-config-Client依赖,项目的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>cn.ponytech</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
在项目启动类中,新建一个方法user,并添加@RestController注解。
@SpringBootApplication
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${username}")
String username;
@Value("${password}")
String password;
@RequestMapping(value = "/user")
public String user(){
return "您好,您用户名为:"+username+",密码为:"+password;
}
}
再对properties配置文件进行修改。
server.port=9007
spring.application.name=config-client
项目的基础信息写在自动生成的 application.properties文件中,SpringCloud ConfigServer的默认端口号为8888,我们如果需要修改这个端口号,需要新建一个叫bootstrap.properties的文件,在其中再指定好端口号,访问的文件。
spring.cloud.config.label=master
spring.cloud.config.profile=user
spring.cloud.config.uri=http://localhost:9006/
接下来我们访问http://localhost:9007/user,出现:
您好,您用户名为:Cheng MingWei,密码为:SpringCloud
说明我们的Config-Client从Config-Server中获取到了值,而Config-Server中并没有这个配置文件,足以证明,是从我们指定的Git仓库中获取到的。