Spring Cloud Config(分散式配置中心)(1)
Spring Cloud Config 是用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端與客戶端兩個部分。其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取配置資訊,加密、解密資訊等訪問介面。而客戶端則是微服務架構中的各個微服務應用或基礎設施,它通過指定的配置中心來管理應用資源與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入配置資訊。
構建配置中心
1.通過Spring Cloud Config構建一個分散式配置中心十分容易,只需要三步:
1.建立一個基礎的Spring Boot工程,命名為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>com.example</groupId> <artifactId>config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>config-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.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.SR1</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>
2.在主類上新增@EnableConfigServer註解,開啟Spring Cloud Config的服務端功能。
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3.在application.properties中新增配置服務的基本資訊以及Git倉庫的相關資訊:
spring.application.name=config-server
server.port=7001
spring.cloud.config.server.git.uri=你的倉庫地址
spring.cloud.config.server.git.search-paths=config-repo
spring.cloud.config.server.git.username=(git/github賬號)
spring.cloud.config.server.git.password=(git/github密碼)
spring.cloud.config.server.git.uri:配置Git倉庫位置
spring.cloud.config.server.git.search-paths:配置倉庫路徑下的相對搜尋位置,可以配置多個。
spring.cloud.config.server.git.username:訪問Git倉庫的使用者名稱
spring.cloud.config.server.git.password:訪問Git倉庫的使用者密碼
這樣簡單地一個服務端配置就完成了。
如果將通過file://字首來設定為一個檔案地址(在Windows系統中,需要使用file:///來定位檔案內容。)比如:
spring.cloud.config.server.git.uri=file://${user.home}/config-repo
其中,${user.home}代表當前使用者的所屬目錄。file://配置的本地檔案系統方式適用於本地開發除錯。
下面我在我的git倉庫下建立名為config-repo的資料夾,然後根據不同的環境新建了4個配置檔案
裡面的屬性分別為:
from=git-default-1.0
from=git-dev-1.0
from=git-prod-1.0
from=git-test-1.0
訪問配置資訊的URL與配置檔案的隱射關係如:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
上面的url會對映{application}-{profile}.properties對應的配置檔案,其中{label}對應Git上不同的分支,預設為master。如下面的url:http://localhost:7001/didispace/master
config-server通過Git在本地倉庫暫存,可以有效防止Git倉庫出現故障而引起無法載入配置資訊的情況。
客戶端配置對映
1.首先建立Spring Boot應用,命名為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>com.example</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.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.SR1</spring-cloud.version>
</properties>
<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.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>
2.主類如:
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
3.新建bootstrap.properties配置,來指定獲取配置檔案的config-server的位置:
server.port=7002
spring.application.name=didispace
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
spring.cloud.config.profile:對應配置檔案規則中的{profile}部分。
spring.application.name:對應配置檔案規則中的{application}部分。
spring.cloud.config.label:對應配置檔案規則中的{label}部分。
spring.cloud.config.uri:配置中心config-server的地址。
(這些屬性配置必須在bootstrap.properties中,這樣config-server中的配置資訊才能被正確載入。)
4.新建一個控制器:
@RefreshScope
@RestController
public class TestController {
@Value("${from}")
private String from;
@Autowired
private Environment environment;
@RequestMapping("/from2")
public String from2(){
return environment.getProperty("from","undefined");
}
@RequestMapping("/from")
public String from(){
return this.from;
}
}
根據上面的配置,我們可以獲取didispace-dev.properties檔案的配置內容。可以繼續通過修改bootstrap.properties中的配置內容來獲取不同的配置服務中的配置規則。