1. 程式人生 > >Spring Cloud入門:分散式配置中心(Spring Cloud Config)

Spring Cloud入門:分散式配置中心(Spring Cloud Config)

文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4

1 Spring Cloud Config

Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設施和微服務應用提供集中化的外部配置支援,它分為服務端與客戶端兩個部分。其中服務端也稱為分散式配置中心,它是一個獨立的微服務應用,用來連線配置倉庫併為客戶端提供獲取配置資訊、加密/解密資訊等訪問介面;而客戶端則是微服務架構中的各個微服務應用或基礎設施,它們通過指定的配置中心來管理應用資源與業務相關的配置內容,並在啟動的時候從配置中心獲取和載入配置資訊。
在本節,我們演示了一個基於SVN倉庫的分散式配置中心的建立過程。

2 構建配置中心

2.1 建立Spring Boot專案config-server,引入相關依賴

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.RELEASE</version>
		<relativePath/>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</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-starter-actuator</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>

		<dependency>
			<groupId>org.tmatesoft.svnkit</groupId>
			<artifactId>svnkit</artifactId>
		</dependency>

	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

2.2 新增@EnableConfigServer,開啟Spring Cloud Config的服務端功能

@EnableConfigServer
@SpringCloudApplication
public class ConfigServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigServerApplication.class, args);
	}
}

2.3 application.properties配置

application.properties:

spring.application.name=config-server
server.port=4001

#指定註冊中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/,http://localhost:1003/eureka/
#例項預設通過使用域名形式註冊到註冊中心:false
eureka.instance.prefer-ip-address=true
#例項名
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

#使用svn作為配置倉庫,必須顯示宣告profiles.active=subversion
spring.profiles.active=subversion
#SVN倉庫地址
spring.cloud.config.server.svn.uri=svn://193.112.95.176/
#SVN使用者名稱
spring.cloud.config.server.svn.username=xiaolai
#SVN使用者密碼
spring.cloud.config.server.svn.password=xxx
#配置倉庫的分支
spring.cloud.config.server.default-label=spring-cloud-config
#配置倉庫路徑下的相對搜尋位置
spring.cloud.config.server.svn.search-paths={application}

SVN目錄結構如下:
SVN目錄

2.4 啟動配置中心

訪問 http://localhost:4001/config-client/dev ,可以看到返回了匹配到的配置檔案:
檢視配置
其中訪問配置資訊的URL與配置檔案的對映關係如下:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

3 客戶端例項

3.1 建立Spring Boot應用config-client,引入依賴

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.RELEASE</version>
		<relativePath/>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</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-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-netflix-eureka-client</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

3.2 Spring Boot應用入口類

@SpringCloudApplication
public class ConfigClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigClientApplication.class, args);
	}
}

3.3 新增配置檔案bootstrap.properties

spring.profiles.active=${profiles:dev}
server.port=3003
spring.application.name=config-client
eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/,http://localhost:1003/eureka/

#例項預設通過使用域名形式註冊到註冊中心:false
eureka.instance.prefer-ip-address=true

#例項名
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

#高可用配置中心通過服務Id去自動發現config-server服務組
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server

spring.cloud.config.profile=${spring.profiles.active}

#暴露配置重新整理端點
management.endpoints.web.exposure.include=refresh

3.4 建立介面,讀取配置中心配置

@RefreshScope
@RestController
public class FromController {

    @Value("${from}")
    private String from;

    @Value("${from-profile}")
    private String fromProfile;

    @RequestMapping("/from")
    public String from() {
        return this.from + ":" + this.fromProfile;
    }

}

3.5 啟動運用

開啟 http://localhost:3003/from ,可以看到讀取到的配置資訊輸出
配置更改時,可通過訪問端點 http://localhost:3003/actuator/refresh ,重新整理配置