SpringCloud進擊 | 一深入:高可用的分散式配置中心(Spring Cloud Config)【Finchley版本】
1.前言
上一節:SpringCloud進擊 | 七淺出:服務閘道器 - 過濾器(Zuul Filter)【Finchley版本】
通常情況下,Config Server 與 Eureka 服務註冊中心一樣,也需要將其架構成高可用的叢集。所以,我們來改進一下,以一種更為簡單的方式 -- 把 Config Server 也註冊為服務。這樣,所有客戶端就能以服務的方式進行訪問,通過這種方法,只需要啟動多個指向同一 Git 倉庫位置的 Config Server 就能實現高可用的分散式配置中心。
基礎實現見淺出系列第五節:SpringCloud進擊 | 五淺出:配置中心(Git配置與更新)【Finchley版本】
2.準備
先來回顧一下前面淺出部分我們都完成了什麼:
- 構建 服務註冊中心:wei-eureka-server,埠號:8090
- 建立 服務提供者:wei-service-provider,埠號:8010
- 建立 服務消費者:wei-consumer-ribbon,埠號:8020 和 wei-consumer-feign,埠號:8030
- 實現 Spring Cloud Netflix Hystrix 斷路器 的融斷機制
- 實現 服務配置中心:wei-config-server,埠號:8040 和 wei-config-client,埠號:8050
- 實現 服務閘道器的對映和過濾器:wei-gateway-zuul,埠號:8060
這裡我們繼續使用上一節的程式碼來進行相應改造:
- Eureka 註冊中心:wei-eureka-server (無需改造)
- Config Server:wei-config-server (需要改造)
- Config Client:wei-config-client (需要改造)
3.進擊
3.1.Config Server 服務端改造
3.1.1.pom 依賴改造
pom.xml 檔案新增以下依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
完整的 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>com.wei</groupId>
<artifactId>wei-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>wei-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.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>
3.1.2.application 配置改造
application.yml 檔案完整配置:
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 指定進行服務註冊的地址。高可用配置中心-服務端服務化
server:
port: 8040
spring:
application:
name: wei-config-server
cloud:
config:
label: master # 對應 Git 上不同的分支,預設為 master
server:
git:
username:
password:
uri: https://github.com/itanping/wei-springcloud # 配置 Git 倉庫地址
search-paths: wei-config/config-profile # Git倉庫地址下的相對地址,可以配置多個,用,分割
3.1.3.啟動類
啟動類與上節保持一致,不需要改造。
這樣,Config Server 服務端的改造就完成了。
3.2.Config Client 客戶端改造
3.2.1.pom 依賴改造
pom.xml 檔案新增以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
完整的 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>com.wei</groupId>
<artifactId>wei-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>wei-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.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>
3.2.2.配置檔案改造
application.yml 檔案新增配置項:eureka.client.service-url.defaultZone,設定指向配置中心的地址。
server:
port: 8050
bootstrap.yml 檔案配置:
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/ # 指定進行服務註冊的地址。高可用配置中心實現
spring:
application:
name: wei-config-client
cloud:
config:
name: config-client # 對應配置檔名 config-client-dev.properties 的 {application} 部分
profile: dev # 對應配置檔名 config-client-dev.properties 的 {profile} 部分
label: master # 使用 {label} 對應 Git 的分支名,如果配置中心使用的是本地儲存,則該引數無用
discovery:
enabled: true # 開啟 Config 服務發現支援
service-id: wei-config-server # 高可用配置中心實現需要將uri配置去掉,使用service-id直接指向Server端地址
bootstrap.yml 主要是去掉了 spring.cloud.config.uri 配置,使用 service-id 直接指向 Server 端地址。因這 uri 好設定,但是不具有微服務的靈活性。
另外需要增加配置:
- spring.cloud.config.discovery.enabled:開啟 Config 服務發現支援
- spring.cloud.config.discovery.serviceId:指定 Server 端的 name,也就是 Server 端 spring.application.name 的值
這兩個配置檔案都需要放到 bootstrap.yml 的配置中。
3.2.3.啟動類
啟動類與上節保持一致,不需要改造。
如此,Config Client 客戶端的改造也完成了。
4.測試
依次做以下準備:
- 啟動 Eureka 註冊中心:wei-eureka-server,埠 8090
- 啟動 Config Server:為了模擬生產環境,我們分別以埠號 8040、8041 啟動兩個 wei-config-server 做叢集,以此來提供高可用的支援
- 啟動 Config Client:wei-config-client,埠:8050
依次啟動完了後,去註冊中心看看:http://localhost:8090/
如圖,可以看到會有 8040、8041 兩個 Config Server 端同時提供配置中心服務,這樣可以防止某一臺服務掛掉之後影響整個系統的使用。Config Client 端也已經註冊了到註冊中心。
以上,測試就緒。
4.1.Config 服務端驗證
我們分別訪問URL:http://localhost:8040/config-client/dev 和 http://localhost:8041/config-client/dev
是不是?瀏覽器列印了相同資訊:
{
"name": "config-client",
"profiles": [
"dev"
],
"label": null,
"version": "a66db4adfd79df7a91cd148e73eef572a9378d3d",
"state": null,
"propertySources": [
{
"name": "https://github.com/itanping/wei-springcloud/wei-config/config-profile/config-client-dev.properties",
"source": {
"config.tip": "Demo for Spring Cloud config",
"config.env": "dev for update"
}
}
]
}
說明兩個服務配置中心都正常讀取到了配置資訊。服務端OK。
4.2.Config 客戶端驗證
我們再來訪問:http://localhost:8050/demo/info
瀏覽器列印:
[Config Client] dev for update, 錯誤配置屬性config.tips測試,此處應該為config.tip
說明客戶端已經讀取到了 Config Server 端的內容。客戶端OK。
4.3.Config 服務端叢集驗證
我們再隨機停掉一臺 Config Server 端的服務,就停掉 8041吧。然後再次訪問:http://localhost:8050/demo/info
瀏覽器還是會列印:
[Config Client] dev for update, 錯誤配置屬性config.tips測試,此處應該為config.tip
說明高可用的分散式配置中心已經在正常運作。
5.總結
此時的架構:
原始碼:
參考:
https://springcloud.cc/spring-cloud-netflix.html
https://blog.csdn.net/forezp/article/details/81041045
https://windmt.com/2018/04/19/spring-cloud-8-config-with-eureka/
6.系列
SpringCloud進擊 | 一淺出:服務註冊與發現(Eureka)【Finchley版本】
SpringCloud進擊 | 二淺出:服務消費者(Ribbon+REST)【Finchley版本】
SpringCloud進擊 | 三淺出:服務消費者(Feign)【Finchley版本】
SpringCloud進擊 | 四淺出:斷路器與容錯(Hystrix)【Finchley版本】
SpringCloud進擊 | 五淺出:配置中心(Git配置與更新)【Finchley版本】
SpringCloud進擊 | 六淺出:服務閘道器 - 路由(Zuul Router)【Finchley版本】
SpringCloud進擊 | 七淺出:服務閘道器 - 過濾器(Zuul Filter)【Finchley版本】
下一節,請繼續關注