Spring Cloud與微服務之配置檔案中心Spring Cloud Config
文章目錄
Spring Cloud Config簡介
Spring Cloud Config為分散式系統外部化配置提供了伺服器端和客戶端的支援,它包括Config Service和Config Client兩部分。由於Config Service和Config Client都實現了對Spring Environment和PropertySource抽象的對映,因此,Spring Cloud Config非常適合Spring應用程式,當然也可以與其它任何語言編寫的應用程式配合使用。
Config Server是一個可橫向擴充套件、集中式的配置伺服器,它用於集中管理應用程式各個環境下的配置,預設使用Git儲存配置檔案內容,也可以使用SVN儲存,或者是本地檔案儲存。
Config Client是Config Server的客戶端,用於操作儲存在ConfigServer中的配置內容。微服務在啟動時會請求Config Server獲取配置檔案的內容,請求到後再啟動容器。
Git上的配置檔案springcloud-config-resources
springcloud-config-resources專案結構
由於Spring Cloud Config Server預設採用的是Git,所以說我們就建立一個存放配置檔案的目錄,在這裡,我將配置檔案建立到了springcloud-config-resources中,其專案結構如下;
springcloud-config-resources原始碼
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">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-resources</artifactId>
<name>SpringCloud微服務::配置檔案</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</project>
microservice-dev.properties原始碼:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.1:3306/taobao?useUnicode=true
jdbc.username=root
jdbc.password=root
由於這個專案是用來演示的,所以說這裡的生產環境microservice-production.properties
與測試環境microservice-test.properties
都與開發環境microservice-dev.properties
中的內容是一樣的,因而我就不重複貼程式碼了。
最後要做的就是將springcloud-config-resources釋出到Git中,供配置檔案中心Spring Cloud Config Server來訪問。
springcloud-config-server
springcloud-config-server專案結構
springcloud-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">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-server</artifactId>
<packaging>jar</packaging>
<name>SpringCloud微服務::配置檔案伺服器</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--匯入SpringCloud的依賴管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</project>
ConfigApplication原始碼:
package com.lyc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@EnableConfigServer //開啟配置服務
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class,args);
}
}
application.yml原始碼:
server:
port: 6688 #服務埠
spring:
application:
name: springcloud-config-server #指定服務名
cloud:
config:
server:
git: #配置git倉庫地址
uri: [email protected]:zhangzhenyi/springcloud-parent.git
search-paths: springcloud-config-resources/src/main/java/resources
username: Git賬號
password: Git密碼
rabbitmq: #RabbitQM相關的配置
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
registerWithEureka: true #是否將自己註冊到Eureka服務中,本身就是所有無需註冊
fetchRegistry: true #是否從Eureka中獲取註冊資訊
serviceUrl: #Eureka客戶端與Eureka服務端進行互動的地址
defaultZone: http://root:[email protected]:6868/eureka/
instance:
prefer-ip-address: true #將自己的ip地址註冊到Eureka服務中
ip-address: 127.0.0.1
management:
security:
enabled: false #是否開啟安全認證
專案的執行與分析
專案的執行
在配置檔案中心中,我們不能直接以ip + 埠號
的方式對其直接進行訪問,因為當我們訪問該地址:
http://127.0.0.1:6688/
時顯示的結果是這樣的:
此時我們應該這樣訪問:
ip + 埠號 + 配置檔案
比如說我們在springcloud-config-resources中其中一個的配置檔案為microservice-dev.properties
,如果我們想在瀏覽器中訪問該檔案中的資料,我們應該這麼訪問:
http://127.0.0.1:6688/microservice-dev.properties
此時訪問的結果為正確結果:
當然,註冊中心支援以多種字尾的形式來訪問,比如說以.yml
字尾的形式訪問,其訪問路徑為:
http://127.0.0.1:6688/microservice-dev.yml
分析
Git
由於配置檔案中心的設定都在application.yml中,所以說這裡就只講springcloud-config-server中的application.yml
cloud:
config:
server:
git: #配置git倉庫地址
uri: [email protected]:zhangzhenyi/springcloud-parent.git
search-paths: springcloud-config-resources/src/main/java/resources
username: Git賬號
password: Git密碼
這裡的配置也比較簡單,其中的git指的是自己的Git賬號,這裡的Git可以是GitHub,可以是碼雲,也可以是第三方的Gitlab等。
其中的uri指的是Git的專案訪問地址,而這裡的地址,預設的是當前所使用的預設地址,一般情況下指的就是預設的master分支。
search-paths指的是配置資料夾相對於專案根路徑的相對路徑。
username與password指的就是自己的Git賬戶的登入賬號與密碼。
RabbitMQ
這裡我們還使用了RabbitMQ,如果沒有RabbitMQ的話,可以參考這裡進行安裝與使用:
在application.yml中配置RabbitQM的方式如下:
rabbitmq: #RabbitQM相關的配置
host: 127.0.0.1
port: 5672
username: guest
password: guest
上面的配置過於簡單,我就不說明其關鍵字了。
這裡需要注意的是RabbitQM的訪問地址是:
http://127.0.0.1:15672/
而不是:
http://127.0.0.1:5672/
我們在RabbitQM中就可以檢視到我們的配置檔案中心中的springCloudBus
,如下圖所示:
其它
SpringCouldBus訊息匯流排
在微服務架構的系統中,我們通常會使用輕量級的訊息代理來構建一個共用的訊息主題讓系統中所有微服務例項都連線上來,由於該主題中產生的訊息會被所有例項監聽和消費,所以我們稱它為訊息匯流排。在總線上的各個例項都可以方便地廣播一些需要讓其他連線在該主題上的例項都知道的訊息,例如配置資訊的變更或者其他一些管理操作等。
由於訊息匯流排在微服務架構系統中被廣泛的使用,所以它同配置中心一樣,幾乎是微服務架構中的必備元件。SpringCloud作為微服務架構綜合性的解決方案,對此自然也有自己的實現。通過使用SpringCloudBus,可以非常容易地搭建起訊息匯流排,同時實現了一些訊息匯流排中的常用功能,比如,配合SpringCloudConfig實現微服務應用配置資訊的動態更新等。
目前SpringCloudBus訊息匯流排只是實現了對RabbitMQ以及Kafka的支援