Spring Cloud 入門教程 - 搭建配置中心服務
Spring Cloud 提供了一個部署微服務的平臺,包括了微服務中常見的組件:配置中心服務, API網關,斷路器,服務註冊與發現,分布式追溯,OAuth2,消費者驅動合約等。我們不必先知道每個組件有什麽作用,隨著教程的深入,我們會逐漸接觸到它們。一個分布式服務大體結構見下圖(圖片來自於:spring.io):
使用Spring Cloud搭建分布式的系統十分簡單,我們只需要幾行簡單的配置就能啟動一系列的組件,然後可以在代碼中控制、使用和管理這些組件。Spring Cloud使用Spring Boot作為基礎框架,可以參考我的上一篇博客介紹如何創建一個Spring Boot項目, Spring Boot 2.0.1 入門教程。本教程將教大家如何配置服務中心服務,並通過web客戶端讀取配置。
基礎環境
- JDK 1.8
- Maven 3.3.9
- IntelliJ 2018.1
- Git
項目源碼
Gitee碼雲
創建 Web Client
首先用IntelliJ創建一個Maven項目,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.zxuqian</groupId> <artifactId>web</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M9</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
dependencyManagement
可以為所有的依賴指定統一的版本號,這裏的Spring-cloud依賴版本均為Finchley.M9,然後使用repository
指定此版本的倉庫。spring-cloud-starter-config
提供了訪問配置中心服務的API接口。
添加控制器
新建一個控制器類 cn.zxuqian.controllers.HelloController
, 並添加如下代碼:
package cn.zxuqian.controllers; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RefreshScope @RestController public class HelloController { @Value("${message: 本地消息}") private String message; @RequestMapping("/message") public String message() { return this.message; } }
一個簡單的控制器,匹配/message
路徑,並返回message
變量的值。這裏先不用管 @RefreshScope
這個註解,等下會用到時再講。@Value
會取來自配置中心服務的配置項,或本地環境變量等等,此處取了配置中心的message
的值,並給了它一個默認值"本地消息",即如果遠程配置中心不可用時,此變量將會用默認值初始化。
添加配置文件
bootstrap.xml
我們需要在web客戶端項目完全啟動之前去加載配置中心的配置項,所以需要在src/main/resources
下創建bootstrap.yml
文件,然後指定此客戶端的名字和遠程配置中心的uri:
spring:
application:
name: web-client
cloud:
config:
uri: http://localhost:8888
yml相比properties文件更加簡潔,不用寫很多重復的前綴,上邊的內容可以轉換為對應的properties:
spring.application.name=web-client
spring.cloud.config.uri=http://localhost:8888
spring.application.name
指定了此項目的名字,用來取配置中心相同文件名的配置文件,即配置中心應有一文件名為web-client.yml
的配置文件。spring.cloud.config.uri
指定了遠程配置中心服務的uri地址,默認為http://localhost:8888
創建配置中心項目
新建一個Maven項目,使用如下pom配置:
<?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.zxuqian</groupId>
<artifactId>config-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.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>Finchley.M9</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
spring-cloud-config-server
即為配置中心服務的核心依賴。
配置Application
新建一個Java類cn.zxuqian.Application
,添加如下代碼:
package cn.zxuqian;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 使用
@EnableConfigServer
這一條註解即可把該Maven項目作為配置中心服務啟動。
新建Git倉庫
配置中心的文件都是基於版本控制的,所以需要在本地新建一個git倉庫來保存配置文件。或者也可用公共遠程git倉庫,github, 碼雲等。在任意位置(如項目的上級目錄)創建一空白文件夾,這裏叫做config
,可以使用任何名字。然後進入此文件夾下,運行
$ git init
來初始化git倉庫,然後新建一個文件,名為web-client.yml
,並添加如下內容:
message: 此條消息來自於cofig server
註意此文件名需要和之前在web項目中配置的spring.application.name
保持一致。這個文件的內容就是web客戶端要獲取的message的值。創建完成之後,運行如下git命令提交到本地倉庫:
$ git add web-client.yml
$ git commit -m "added web-client.yml"
配置git倉庫位置
我們需要為配置中心指定上述創建的git倉庫地址。在src/main/resources
下創建applicaiton.yml
文件,提供如下內容:
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: ${HOME}/development/codes/backend/gitee/config
此文件指定了配置中心服務的端口號,和保存配置文件的git倉庫目錄,如果是遠程倉庫,可以直接指定url地址。到此,配置中心服務創建完成。
測試
首先啟動配置中心服務,使用spring-boot maven插件:spring-boot:run。啟動成功後再啟動web客戶端,訪問http://localhost:8080/message
,如果看到此條消息來自於cofig server
即配置成功。然後關閉配置中心服務,再重啟web客戶端,訪問http://localhost:8080/message
,我們就會看到本地消息
。
動態更新配置
那麽每次配置更新後都要重啟是不是很麻煩?Spring boot提供了spring-boot-starter-actuator
組件,用來進行生產環境的維護,如檢查健康信息等。還記得上面HelloController
的@RefreshScope
註解嗎?使用它我們可以動態的加載配置中心修改後的配置。然後我們還需要在配置中心的web-client.yml
添加如下內容用以暴露acurator的/refresh
終端api。
message: 此條消息來自於cofig server
management:
endpoints:
web:
exposure:
include: "*"
更新完成後提交的git倉庫,然後重啟配置中心服務和web客戶端。修改message為
message: 更新:此條消息來自於cofig server
然後發送一個空的post請求到/refresh
$ curl http://localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
之後刷新頁面,即可看到更新後的消息。
總結
現在我們搭建好了一個配置中心服務,它是根據每個組件的spring.application.name
來決定讀取哪個配置文件,然後我們用了acurator的/refresh
api在運行時刷新配置項。另外配置項都是基於版本控制的,可以方便的進行還原和更新。通過這個教程可以看到Spring Cloud的各組件的配置相當簡單,基本就只用一條註解就可以創建一個完整的服務組件。
歡迎訪問我的博客原文:Spring Cloud 入門教程 - 搭建配置中心服務
Spring Cloud 入門教程 - 搭建配置中心服務