SpringCloud系列九:SpringCloudConfig 基礎配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服務端、抓取配置文件信息、客戶端使用 SpringCloudConfig 進行配置、單倉庫目錄匹配、應用倉庫自動選擇、倉庫匹配模式)
1、概念:SpringCloudConfig 基礎配置
2、具體內容
通過名詞就可以發現,SpringCloudConfig 核心作用一定就在於進行配置文件的管理上。也就是說為了更好的進行所有微服務的配置項的管理,在 SpringCloud 設計架構裏面就考慮到了針對於所有的核心配置文件(application.yml)進行的一項統一管理的工具。
2.1、SpringCloudConfig 的基本概念
現在可以思考一個問題:在一個實際的項目開發過程之中,有可能會出現有上百個微服務(創建微服務的標準實際上就是業務設計,也就是說你有多少個業務接口那麽就有可能需要定義有多少個的微服務,而且不要忘記了,微服務還會存在有負載均衡的問題),那麽這樣一來對於配置文件的管理就非常麻煩了。
如果現在要想進行某一個微服務的配置文件的變更,那麽就有可能需要去修改上百個微服務的信息。所以為了解決這些配置文件的統一的管理問題,那麽在 SpringCloud 架構裏面提出有一個思想,借助於:SVN、GITHUB 來進行微服務配置文件的保存。
說明:所有微服務的配置文件放在git倉庫裏面,建立一個SpringCloudConfig的微服務並添加git倉庫的配置,這樣就能實施獲取git倉庫裏面的配置文件了,其他的微服務就追加SpringCloudConfig的微服務的配置就能通過SpringCloudConfig的微服務獲取到各自的配置文件了
但是在此時也需要註意幾個問題:
· 一旦使用了 SpringCloudConfig 之中,現在的項目的中心就變為了 SpringCloudConfig 服務;
· 為了解決配置文件的安全問題,在 SpringCloudConfig 之中還提供有一個所謂的安全加密處理,例如:一些重要的密碼有可能需要被加密,所以可以使用兩種加密處理(密鑰處理、jks 安全處理)。
2.2、配置 SpringCloudConfig 服務端
在 SpringCloudConfig 之中服務端的主要功能是通過SVN或者是GIT進行配置文件抓取微服務的配置,所以對於這樣的微服務其最大的特征就是需要設置好GIT倉庫的信息地址。
1、 【GITHUB】在 github 上創建一個屬於自己的倉庫信息:microconfig;
此時的 GIT 的連接地址為:[email protected]:leeSmall/microconfig.git
2、 【GITHUB】通過 git 客戶端工具將在服務器上的倉庫的信息進行克隆處理,假設將克隆的倉庫保存在 D 盤上:
· 為了方便統一的管理,建立一個:springcloudconfig 目錄,所有的倉庫的信息都直接克隆到此目錄之中;
git clone
[email protected]:leeSmall/microconfig.git
· 註意:以上的克隆處理操作要求你已經配置好了 GITHUB 的 SSH 連接;
3、 【microconfig】建立一個公共的配置文件:application.yml,隨後將這個文件推送到 GITHUB 之中:
· application.yml 配置文件內容如下:
spring: profiles: active: - dev --- spring: profiles: dev application: name: microconfig-test-dev --- spring: profiles: default application: name: microconfig-test-default
|- 將之前克隆好的倉庫目錄之中創建好 application.yml 配置文件上傳到GIT倉庫:
4、 【microcloud-config-7101】通過“microcloud-provider-company-8101”復制為了一份新的項目:“microcloud-config-7101”,隨後刪除掉所有與微服務提供信息相關的程序類與配置文件;
5、 【microcloud-config-7101】修改 pom.xml 配置文件,在此配置文件之中追加有 SpringCloudConfig 的服務依賴端spring-cloud-config-server;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>cn.study</groupId> <artifactId>microcloud-security</artifactId> </dependency>
此時所有微服務的認證信息:studyjava/hello;
6、 【microcloud-config-7101】修改 application.yml 配置文件項:
server: port: 7101 spring: application: name: microcloud-config cloud: # 進行SpringCloud的相關配置 config: # 進行SpringCloudConfig的相關配置 server: # 設置服務的連接地址 git: # 本次使用的是GIT作為倉庫的管理,所以需要設置GIT的連接地址 uri: [email protected]:leeSmall/microconfig.git
7、 【microcloud-config-7101】修改啟動程序類:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer public class Config_7101_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Config_7101_StartSpringCloudApplication.class, args); } }
8、 修改 windows 主機下的 hosts 配置文件,追加一個新的映射主機名稱:
127.0.0.1 config-7101.com
9、 隨後啟動“microcloud-config-7101”微服務程序,隨後就可以通過如下的地址進行訪問了:
NO. | ||
1 |
/{application}-{profile}.yml |
http://studyjava:[email protected]:7101/application-dev.yml |
2 | /{application}/{profile}[/{label}] | http://studyjava:[email protected]:7101/application/dev/master |
3 | /{label}/{application}-{profile}.yml | study://studyjava:[email protected]:7101/master/application-dev.yml |
在實際的項目開發之中,master 分支肯定是不能夠進行所謂的修改更新的,也就是說 master 上的內容一定是可以使用的,所以往往會設置一個 dev 分支處理項,這樣如果使用了“/{label}/{application}-{profile}.yml”格式將可以更好的進行分支的定位。
以上的做法采用的是 yml 配置文件形式完成,如果要想采用 properties 文件處理,則就必須準備出多個 properties,例如: application-dev.properties、application-beta.properties 等;
2.3、抓取配置文件信息
現在已經成功的實現了 SpringCloudConfig 服務端搭建,但是這個時候只是依靠服務端並沒有什麽意義,最終所需要的結果還是需要將遠程 GITHUB 上的配置信息抓取到客戶端上進行程序啟動使用。本次將編寫一個客戶端程序,隨後通過 SpringCloudConfig 讀取配置文件的信息內容。
1、 【GITHUB】編寫一個新的配置文件:microcloud-config-client.yml 配置文件:
· 定義“D:\springcloudconfig\microconfig\microcloud-config-client.yml”配置文件內容:
spring: profiles: active: - dev --- server: port: 8201 spring: profiles: dev application: name: microcloud-config-client eureka: client: service-url: defaultZone: http://edmin:[email protected]:7001/eureka --- server: port: 8102 spring: profiles: beta application: name: microcloud-config-client eureka: client: service-url: defaultZone: http://edmin:[email protected]:7001/eureka
· 將此時的配置文件提交到 GITHUB 之中:
2、 【microcloud-config-client-8201】修改 pom.xml 配置文件,追加相關的依賴配置程序包:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
3、 【microcloud-config-client-8201】現在往往都會習慣性的認為應該在 application.yml 配置文件之中進行 SpringCloudConfig 服務端的配置處理,但是在 SpringCloud 官方文檔裏面會發現此時真正應該配置 SpringCloudConfig 的信息文件應該為 bootstrap.yml。
關於 application.yml 與 bootstrap.yml 配置文件的說明:
· “application.yml”:對應的是用戶級的資源配置項;
· “bootstrap.yml”:對應的是系統級的資源配置,其優先級會更高一些;
· 建立“src/main/resources/bootstrap.yml”:
spring: cloud: config: name: microcloud-config-client # 定義要讀取的資源文件的名稱 profile: beta # 定義profile的 名稱 label: master # 定義配置文件所在的分支 uri: http://config-7101.com:7101 # SpringCloudConfig的服務地址 username: studyjava # 連接的用戶名 password: hello # 連接的密碼
· 建立“src/main/resources/application.yml”裏面也進行一些基本的定義:
spring: application: name: microcloud-config-client # 編寫應用的名稱 server: port: 8888 eureka: client: service-url: defaultZone: http://eureka-application.com:7001/eureka
4、 【microcloud-config-client-8201】建立一個新的新的 Rest 服務程序類。
package cn.study.microcloud.rest; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConfigClientRest { @Value("${spring.application.name}") private String applicationName; // 應用的服務名稱 @Value("${eureka.client.service-url.defaultZone}") private String eurekaServers; // 設置所有的eureka服務信息項 @RequestMapping("/config") public String getConfig() { return "ApplicationName = " + this.applicationName + "、EurekaServers = " + this.eurekaServers; } }
5、 【microcloud-config-client-8201】設置啟動程序類:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Client_8201_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Client_8201_StartSpringCloudApplication.class, args); } }
6、 修改本機的 hosts 配置文件,追加主機映射:
127.0.0.1 client-8201.com
7、 【microcloud-config-7101】確定當前的服務端真實可用,啟動之後,輸入如下路徑信息:
http://studyjava:[email protected]:7101/microcloud-config-client-beta.yml
8、 【microcloud-config-client-8201】如果說現在你的 application.yml 裏面配置的內容與 bootstrap.yml 抓取的服務端的內容相同, 那麽會使用那個配置呢?
如果本地的配置與遠程的配置相同,那麽以 bootstrap.yml 的遠程配置為主,所以 bootstrap.yml 優先級一定是要高於application.yml 的。
2.4、客戶端使用 SpringCloudConfig 進行配置
已經實現了 SpringCloudConfig 的客戶端以及服務端的配置,但是對於現在的客戶端程序而言並不是只是簡單的獲取一些信息就夠了,應該將之前的許多的配置文件的內容都交給 github 上進行保存。所以本次將利用 SpringCloudConfig 實現有一個 Eureka、Dept 微服務的信息加載操作。
此時對於“microcloud-config-7101”的項目模塊暫時不做任何的變更,此時它只是提供有一個基礎的信息服務。
1、 【GITHUB】需要建立有相應的配置文件信息:
· 註意:你如果是自己建立的*.yml 配置文件,請一定要保證你的文件的編碼是 UTF-8,否則在執行的時候會出現 “YAMLException”異常信息(中文);
· 建立“D:\springcloudconfig\microconfig\microcloud-config-eureka-client.yml”配置文件:
spring: profiles: active: - dev --- spring: profiles: dev application: name: microcloud-config-eureka-client server: port: 7001 security: basic: enabled: true # 啟用安全認證處理 user: name: edmindev # 用戶名 password: studyjava # 密碼 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmindev:[email protected]:7001/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱 --- spring: profiles: beta application: name: microcloud-config-eureka-client server: port: 7001 security: basic: enabled: true # 啟用安全認證處理 user: name: edminbeta # 用戶名 password: studyjava # 密碼 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edminbeta:[email protected]:7001/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
· 建立“:D:\springcloudconfig\microconfig\microcloud-config-dept-client.yml”配置文件:
spring: profiles: active: - dev --- server: port: 8001 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmindev:[email protected]:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設置心跳的時間間隔(默認是30秒) lease-expiration-duration-in-seconds: 5 # 如果現在超過了5秒的間隔(默認是90秒) instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址 info: app.name: study-microcloud company.name: www.study.cn build.artifactId: $project.artifactId$ build.version: $project.verson$ mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: cn.study.vo # 定義所有操作類的別名所在包 mapper-locations: # 所有的mapper映射文件 - classpath:mybatis/mapper/**/*.xml spring: profiles: dev datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置當前要使用的數據源的操作類型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驅動程序類 url: jdbc:mysql://localhost:3306/study8001 # 數據庫連接地址 username: root # 數據庫用戶名 password: mysqladmin # 數據庫連接密碼 dbcp2: # 進行數據庫連接池的配置 min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化提供的連接數 max-total: 5 # 最大的連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間 application: name: microcloud-config-dept-client --- server: port: 8001 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edminbeta:[email protected]:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設置心跳的時間間隔(默認是30秒) lease-expiration-duration-in-seconds: 5 # 如果現在超過了5秒的間隔(默認是90秒) instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址 info: app.name: study-microcloud company.name: www.study.cn build.artifactId: $project.artifactId$ build.version: $project.verson$ mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: cn.study.vo # 定義所有操作類的別名所在包 mapper-locations: # 所有的mapper映射文件 - classpath:mybatis/mapper/**/*.xml spring: profiles: beta datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置當前要使用的數據源的操作類型 driver-class-name: org.gjt.mm.mysql.Driver # 配置MySQL的驅動程序類 url: jdbc:mysql://localhost:3306/study8001 # 數據庫連接地址 username: root # 數據庫用戶名 password: mysqladmin # 數據庫連接密碼 dbcp2: # 進行數據庫連接池的配置 min-idle: 5 # 數據庫連接池的最小維持連接數 initial-size: 5 # 初始化提供的連接數 max-total: 5 # 最大的連接數 max-wait-millis: 200 # 等待連接獲取的最大超時時間 application: name: microcloud-config-dept-client
· 將此時的配置文件提交到 GITHUB 之中:
2、 【microcloud-config-eureka-client-7001、microcloud-config-dept-client-8001】修改 pom.xml 配置文件,追加 SpringCloudConfig 的依賴包:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
3、 【microcloud-config-eureka-client-7001】創建“src/main/resources/bootstrap.yml”配置文件:
spring: cloud: config: name: microcloud-config-eureka-client # 定義要讀取的資源文件的名稱 profile: beta # 定義profile的 名稱 label: master # 定義配置文件所在的分支 uri: http://config-7101.com:7101 # SpringCloudConfig的服務地址 username: studyjava # 連接的用戶名 password: hello # 連接的密碼
4、 【microcloud-config-eureka-client-7001】修改“src/main/resources/application.yml”配置文件:
spring: application: name: microcloud-config-eureka-client
由於使用的是 beta-profile,所以登錄地址:http://edminbeta:[email protected]:7001
5、 【microcloud-config-dept-client-8001】建立“src/main/resources/bootstrap.yml”配置文件:
spring: cloud: config: name: microcloud-config-dept-client # 定義要讀取的資源文件的名稱 profile: beta # 定義profile的 名稱 label: master # 定義配置文件所在的分支 uri: http://config-7101.com:7101 # SpringCloudConfig的服務地址 username: studyjava # 連接的用戶名 password: hello # 連接的密碼
6、 【microcloud-config-dept-client-8001】建立“src/main/resources/application.yml”配置文件:
spring: application: name: microcloud-config-dept-client
那麽此時就實現了基於 SpringCloudConfig+GITHUB 上的配置管理。
2.5、單倉庫目錄匹配
現在已經實現了一個 GIT 倉庫的配置文件的統一管理操作,但是在這個時候有些開發者認為,如果將所有的微服務的配置信息都保存在一個倉庫之中文件會顯得比較多,建議使用一些文件目錄來進行保存,類似於如下的形式:
· 【根目錄】GITHUB-ROOT:要求目錄名稱與配置文件名稱保持一致;
|- Eureka 配置目錄:“microcloud-config-eureka-client”目錄:
|- microcloud-config-eureka-client.yml;
|- dept 微服務配置目錄:“microcloud-config-dept-client”目錄:
|- microcloud-config-dept-client.yml;
1、 【GITHUB】進行倉庫的目錄配置,按照如上的要求在本地建立好倉庫目錄,並且將這些配置文件保存到相應的目錄之中:
2、 【microcloud-config-7101】修改 src/main/resources/bootstrap.yml 配置文件:
server: port: 7101 spring: application: name: microcloud-config cloud: # 進行SpringCloud的相關配置 config: # 進行SpringCloudConfig的相關配置 server: # 設置服務的連接地址 git: # 本次使用的是GIT作為倉庫的管理,所以需要設置GIT的連接地址 uri: [email protected]:leeSmall/microconfig.git search-paths: # 設置配置文件查找的匹配目錄 - microcloud-config-eureka-client - microcloud-config-dept-client
通過瀏覽器地址訪問:http://studyjava:[email protected]:7101/microcloud-config-eureka-client-dev.yml;
3、 【microcloud-config-7001】如果說此時微服務有幾百個,你這樣的目錄配置也會有幾百個,這樣整體的配置處理就會感覺比較麻煩,因為需要把所有的目錄都寫上,所以為了解決這樣的問題,可以使用通配符“*”來做一個處理。修改 application.yml:
server: port: 7101 spring: application: name: microcloud-config cloud: # 進行SpringCloud的相關配置 config: # 進行SpringCloudConfig的相關配置 server: # 設置服務的連接地址 git: # 本次使用的是GIT作為倉庫的管理,所以需要設置GIT的連接地址 uri: [email protected]:leeSmall/microconfig.git search-paths: # 設置配置文件查找的匹配目錄 - microcloud-*
現在表示所有與 microcloud-匹配的目錄都可以作為查找目錄出現。對於此類的配置是在整個 SpringCloudConfig 之中我個人強烈推薦的一種形式。利用統一風格的目錄進行配置文件的管理,這樣有助於整個項目的維護,而且又非常簡單,不占用過多的倉庫資源。
2.6、應用倉庫自動選擇
在之前已經成功的實現了單 GIT 倉庫的配置文件管理處理,但是在 SpringCloudConfig 之中也提供有多倉庫的配置支持,也就是說用戶只需要設置要訪問的配置應用的名稱(spring.application.name),那麽就可以根據指定的名稱找到指定的 GIT 倉庫,而後進行配置文件的加載處理。
1、 【GITHUB】為了進行統一管理,在 GITHUB 上分別創建有兩個新的倉庫:
· 倉庫名稱:microcloud-config-dept-client、microcloud-config-eureka-client。
· 隨後將這些倉庫的內容進行克隆:
· 隨後在每一個倉庫的克隆所在目錄之中各自創建有 application.yml 配置文件;
· 之後將兩個倉庫的修改後的內容進行各自的提交處理:
2、 【microcloud-config-7101】修改 application.yml 配置文件;
server: port: 7101 spring: application: name: microcloud-config cloud: # 進行SpringCloud的相關配置 config: # 進行SpringCloudConfig的相關配置 server: # 設置服務的連接地址 git: # 本次使用的是GIT作為倉庫的管理,所以需要設置GIT的連接地址 uri: [email protected]:leeSmall/{application} # 根據應用服務的名稱來連接倉庫
隨後啟動一下 SpringCloudConfig 服務端程序,隨後進行配置文件的訪問:
· 訪問“microcloud-config-eureka-client”: http://studyjava:[email protected]:7101/microcloud-config-eureka-client-dev.yml
· 訪問“microcloud-config-dept-client”: http://studyjava:[email protected]:7101/microcloud-config-dept-client-dev.yml
現在就相當於一個 SpringCloudConfig 可以根據操作的應用名稱訪問不同的 GITHUB 倉庫的內容。
2.7、倉庫匹配模式
所謂的倉庫匹配模式指的就是在進行倉庫配置資源獲得的時候可以通過一些限制讓用戶無法獲得一些資源(只能夠獲得指定資源)。例如:現在雖然進行了多倉庫的配置,但是在多倉庫配置的過程之中可以發現用戶可以加載所有的 profile 信息。指的是說 設置一些規則,讓用戶只能夠加載指定的內容。
1、 【GITHUB】GITHUB 上依然采用與之前多倉庫匹配同樣的處理操作:
· microconfig:application.yml;
· microcloud-config-dept-client:application.yml(dev、beta)
· microcloud-config-eureka-client:application.yml(dev、beta)。
2、 【microcloud-config-7101】修改 application.yml 配置文件:
server: port: 7101 spring: application: name: microcloud-config cloud: # 進行SpringCloud的相關配置 config: # 進行SpringCloudConfig的相關配置 server: # 設置服務的連接地址 git: # 本次使用的是GIT作為倉庫的管理,所以需要設置GIT的連接地址 uri: [email protected]:leeSmall/microconfig # 為公共倉庫信息,如果某些信息找不到了就使用它 repos: microcloud-config-eureka-client: # 設置指定微服務的倉庫信息 uri: [email protected]:leeSmall/microcloud-config-eureka-client pattern: microcloud-config-eureka-client*/dev* # 只能夠訪問dev開頭的profile microcloud-config-dept-client: # 設置指定微服務的倉庫信息 uri: [email protected]:leeSmall/microcloud-config-dept-client pattern: microcloud-config-dept-client*/beta* # 只能夠訪問beta開頭的profile
3、 進行正確的訪問處理:
· 訪問“microcloud-config-eureka-client”: http://studyava:[email protected]:7101/microcloud-config-eureka-client-dev.yml
· 訪問“microcloud-config-dept-client”: http://studyava:[email protected]:7101/microcloud-config-dept-client-beta.yml
4、 不能夠訪問的路徑:
· 不能訪問“microcloud-config-eureka-client”: http://studyava:[email protected]:7101/microcloud-config-eureka-client-beta.yml
·不能訪問“microcloud-config-dept-client”: http://studyava:[email protected]:7101/microcloud-config-dept-client-dev.yml
如果一旦出現有不能訪問的匹配的處理模式,那麽就會跳轉到所配置的公共倉庫之中加載裏面的 application.yml 配置文件。
SpringCloud系列九:SpringCloudConfig 基礎配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服務端、抓取配置文件信息、客戶端使用 SpringCloudConfig 進行配置、單倉庫目錄匹配、應用倉庫自動選擇、倉庫匹配模式)