微服務之SpringCloud架構第六篇(上)——配置中心(Apollo)
隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、引數的配置、伺服器的地址……
並且對配置的期望也越來越高,配置修改後實時生效,灰度釋出,分環境、分叢集管理配置,完善的許可權、稽核機制……
並且隨著採用分散式的開發模式,專案之間的相互引用隨著服務的不斷增多,相互之間的呼叫複雜度成指數升高,每次投產或者上線新的專案時苦不堪言,因此需要引用配置中心治理。
開源配置中心
-
spring-cloud/spring-cloud-config
spring出品,可以和spring cloud無縫配合 -
淘寶 diamond
已經不維護 -
disconf
java開發,螞蟻金服技術專家發起,業界使用廣泛 -
ctrip apollo
Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,具備規範的許可權、流程治理等特性。
配置中心對別
功能特性
我們先從功能層面來對別
功能點 | 優先順序 | spring-cloud-config | ctrip apollo | disconf | 備註 |
---|---|---|---|---|---|
靜態配置管理 | 高 | 基於file | 支援 | 支援 | |
動態配置管理 | 高 | 支援 | 支援 | 支援 | |
統一管理 | 高 | 無,需要github | 支援 | 支援 | |
多環境 | 中 | 無,需要github | 支援 | 支援 | |
本地配置快取 | 高 | 無 | 支援 | 支援 | |
配置鎖 | 中 | 支援 | 不支援 | 不支援 | 不允許動態及遠端更新 |
配置校驗 | 中 | 無 | 無 | 無 | 如:ip地址校驗,配置 |
配置生效時間 | 重啟生效,或手動refresh生效 | 實時 | 實時 | 需要結合熱載入管理, springcloudconfig需要 git webhook+rabbitmq 實時生效 | |
配置更新推送 | 高 | 需要手工觸發 | 支援 | 支援 | |
配置定時拉取 | 高 | 無 | 支援 | 配置更新目前依賴事件驅動, client重啟或者server端推送操作 | |
使用者許可權管理 | 中 | 無,需要github | 支援 | 支援 | 現階段可以人工處理 |
授權、稽核、審計 | 中 | 無,需要github | 支援 | 無 | 現階段可以人工處理 |
配置版本管理 | 高 | Git做版本管理 | 介面上直接提供釋出歷史和回滾按鈕 | 操作記錄有落資料庫,但無查詢介面 | |
配置合規檢測 | 高 | 不支援 | 支援(但還需完善) | ||
例項配置監控 | 高 | 需要結合springadmin | 支援 | 支援,可以檢視每個配置在哪些機器上載入 | |
灰度釋出 | 中 | 不支援 | 支援 | 不支援部分更新 | 現階段可以人工處理 |
告警通知 | 中 | 不支援 | 支援,郵件方式告警 | 支援,郵件方式告警 | |
依賴關係 | 高 | 不支援 | 不支援 | 不支援 | 配置與系統版本的依賴系統執行時的依賴關係 |
技術路線相容性
引入配置中心,需要考慮和現有專案的相容性,以及是否引入額外的第三方元件。我們的java專案以SpringBoot為主,需要重點關注springboot支援性。
功能點 | 優先順序 | spring-cloud-config | ctrip apollo | disconf | 備註 |
---|---|---|---|---|---|
SpringBoot支援 | 高 | 原生支援 | 支援 | 與spring boot無相關 | |
SpringCloud支援 | 高 | 原生支援 | 支援 | 與spring cloud無相關 | |
客戶端支援 | 低 | Java | Java、.Net | java | |
業務系統侵入性 | 高 | 侵入性弱 | 侵入性弱 | 侵入性弱,支援註解及xml方式 | |
依賴元件 | 高 | Eureka | Eureka | zookeeper |
可用性與易用性
引入配置中心後,所有的應用都需要依賴配置中心,因此可用性需要重點關注,另外管理的易用性也需要關注。
功能點 | 優先順序 | spring-cloud-config | ctrip apollo | disconf | 備註 |
---|---|---|---|---|---|
單點故障(SPOF) | 高 | 支援HA部署 | 支援HA部署 | 支援HA部署,高可用由zookeeper保證 | |
多資料中心部署 | 高 | 支援 | 支援 | 支援 | |
配置獲取效能 | 高 | unkown | unkown(官方說比spring快) | ||
配置介面 | 中 | 無,需要通過git操作 | 統一介面(ng編寫) | 統一介面 |
最終選擇
- 支援不同環境(開發、測試、生產)、不同叢集
- 完善的管理系統,許可權管理、釋出稽核、操作審計
- SpringBoot整合友好 ,較小的遷移成本
- 配置修改實時生效(熱釋出)
- 版本釋出管理
綜上,ctrip applo是較好的選擇方案,最終選擇applo。
1、Apollo簡介
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
服務端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,能夠運行於所有Java執行時環境,同時對Spring/Spring Boot環境也有較好的支援。
2、Apollo編譯適配自己的註冊中心
Apollo專案中內建了Eureka註冊中心,如果我們想使用自己外部獨立的註冊中心,就要把Apollo專案中的Eureka剝離。
2、匯入資料庫檔案,資料庫檔案在原始碼srcripts/sql
下,兩個SQL檔案,apolloconfigdb.sql
和apolloportaldb.sql
。MySQL版本需要在5.7以上。
3、修改原始碼。
(1)、apollo-configservice工程修改
1.ConfigServiceApplication類的@EnableEurekaServer註解改成@EnableEurekaClient
2.bootstrap.yml中的eureka.client.serviceUrl.defaultZone配置為獨立的Eureka Server的地址
(2)、apollo-adminservice工程修改
1.bootstrap.yml中的eureka.client.serviceUrl.defaultZone配置為獨立的Eureka Server的地址
(3)、eureka-server工程修改
1.把apollo-configservice工程中com.ctrip.framework.apollo.metaservice下的相關類移到
eureka-server工程下面,並解決相關的編譯問題。
2.pom.xml引入apollo-core依賴,如:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-core</artifactId>
<version>RELEASE/version>
</dependency>
3.application.yml中的eureka.client.fetchRegistry要設為true
4.將apollo-portal
模組下的apollo-env.properties
中dev.meta
或其他環境地址修改為configservice
對應地址
local.meta=http://localhost:8080
dev.meta=http://localhost:8080
fat.meta=http://localhost:8080
uat.meta=http://localhost:8080
lpt.meta=http://localhost:8080
pro.meta=http://localhost:8080
dev.meta=hhttp://localhost:8080
5.打包
執行專案根目錄scripts
下 build.bat
或build.sh
,執行maven打包命令,打好的jar包在相應模組target目錄下。
6.修改資料庫
將apolloconfigdb
serverconfig
表的eureka.service.url
的value
值改為自己的eureka服務地址,如http://localhost:8761/eureka/
將apolloportaldb serverconifg
表的apollo.portal.envs
的value
指改為第三步的對應的地址,如:dev
,如果有多個環境用逗號分隔。
7.執行
分別將Apollo-configservice、Apollo-adminservice、Apollo-Portal模組下target中的zip包拷貝出來,解壓後,修改裡面配置檔案的資訊application-github.properties、apollo-env.properties,包括資料庫連線資訊、環境資訊。如:
# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
local.meta=http://localhost:8080
dev.meta=http://localhost:8080
fat.meta=http://localhost:8080
uat.meta=http://localhost:8080
lpt.meta=http://localhost:8080
pro.meta=http://localhost:8080
然後依次在configservice、adminservice、portal下的scripts目錄中執行startup.sh。啟動無誤後,檢視註冊中心eureka:
說明已經註冊到我們自己的eureka中。
再次訪問配置中心Apollohttp://localhost:8070/,輸入使用者名稱密碼apollo/admin,進入potrtal管理頁面:
至此,配置中心服務端改造以及搭建基本完成,下一篇介紹配置中心客戶端的使用,包括配置獲取、配置同步、更新、以及配置管理等。