2019/10/01 Chenxinphp
配置服務主要有 攜程Apollo、百度Disconf、阿里ACM,目前以Apollo用戶量最大.適用場景,多用於微服務,與K8S結合好.html
攜程Apollo
https://github.com/ctripcorp/apollo
Apollo - A reliable configuration management system.
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。
.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。java
百度Disconf
https://github.com/knightliao/disconf
Disconf - Distributed Configuration Management Platform(分佈式配置管理平臺).
百度disconf是一套完整的基於zookeeper的分佈式配置統一解決方案。一個分佈式環境中,同類型的服務每每會部署不少實例。這些實例使用了一些配置,爲了更好地維護這些配置就產生了配置管理服務。經過這個服務能夠輕鬆地管理成千上百個服務實例的配置問題。專一於各類「分佈式系統配置管理」的「通用組件」和「通用平臺」, 提供統一的「配置管理服務」.
主要目標
部署極其簡單:同一個上線包,無須改動配置,便可在 多個環境中(RD/QA/PRODUCTION) 上線.
部署動態化:更改配置,無需從新打包或重啓,便可 實時生效.
統一管理:提供web平臺,統一管理 多個環境(RD/QA/PRODUCTION)、多個產品 的全部配置.
核心目標:一個jar包,處處運行.node
阿里ACM
https://help.aliyun.com/product/59604.html?spm=a2c4g.11186623.6.540.29a137332X3Muy 阿里雲文檔(ACM文檔)
應用配置管理 ACM 是一款在分佈式架構環境中對應用配置進行集中管理和推送的產品。
利用 ACM,您能夠在微服務、DevOps、大數據等場景下極大減輕配置管理的工做量,並加強配置管理的服務能力。
應用配置管理 ACM(Application Configuration Management)前身爲淘寶內部配置中心 Diamond,現已做爲 Nacos 的配置中心模塊開源。
應用場景:在應用生命週期管理中,開發人員一般會將應用中須要變動的一些配置項或者元數據從代碼中分離出來,放在單獨的配置文件中管理,這些單獨管理的內容就稱爲應用配置。這種分離應用配置的方法是管理應用變動的常見手段之一。發佈應用後,運維人員或最終用戶能夠經過調整配置來適配環境,或調整應用程序的運行行爲。
ACM 是面向分佈式系統的配置中心。憑藉配置變動、配置推送、歷史版本管理、灰度發佈、配置變動審計等配置管理工具,ACM 能幫助您集中管理全部應用環境中的配置,下降分佈式系統中管理配置的成本,並下降因錯誤的配置變動帶來可用性降低甚至發生故障的風險。python
比較
目前大多認爲 Apollo優於Disconf優於ACM.mysql
參考
https://github.com/ctripcorp/apollolinux
參考: https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹git
架構圖: 略.
Apollo的整體設計,咱們能夠從下往上看:github
Config Service提供配置的讀取、推送等功能,服務對象是Apollo客戶端
Admin Service提供配置的修改、發佈等功能,服務對象是Apollo Portal(管理界面)
Config Service和Admin Service都是多實例、無狀態部署,因此須要將本身註冊到Eureka中並保持心跳
在Eureka之上咱們架了一層Meta Server用於封裝Eureka的服務發現接口
Client經過域名訪問Meta Server獲取Config Service服務列表(IP+Port),然後直接經過IP+Port訪問服務,同時在Client側會作load balance、錯誤重試
Portal經過域名訪問Meta Server獲取Admin Service服務列表(IP+Port),然後直接經過IP+Port訪問服務,同時在Portal側會作load balance、錯誤重試
爲了簡化部署,咱們實際上會把Config Service、Eureka和Meta Server三個邏輯角色部署在同一個JVM進程中web
參考:
https://github.com/ctripcorp/apollo/wiki/Apollo使用指南
https://github.com/ctripcorp/apollo/wiki/Apollo核心概念之"namespace"
https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹
application (應用)
這個很好理解,就是實際使用配置的應用,Apollo客戶端在運行時須要知道當前應用是誰,從而能夠去獲取對應的配置
每一個應用都須要有惟一的身份標識 -- appId,咱們認爲應用身份是跟着代碼走的,因此須要在代碼中配置,具體信息請參見Java客戶端使用指南。
environment (環境)
配置對應的環境,Apollo客戶端在運行時須要知道當前應用處於哪一個環境,從而能夠去獲取應用的配置
咱們認爲環境和代碼無關,同一份代碼部署在不一樣的環境就應該可以獲取到不一樣環境的配置
因此環境默認是經過讀取機器上的配置(server.properties中的env屬性)指定的,不過爲了開發方便,咱們也支持運行時經過System Property等指定,具體信息請參見Java客戶端使用指南。
集羣
經過添加集羣,可使同一份程序在不一樣的集羣(如不一樣的數據中心)使用不一樣的配置
若是不一樣集羣使用同樣的配置,則沒有必要建立集羣
Apollo默認會讀取機器上/opt/settings/server.properties文件中的idc屬性做爲集羣名字, 如SHAJQ(金橋數據中心)、SHAOY(歐陽數據中心)
在Portal的項目內,建立的集羣名字須要和機器上server.properties中的idc屬性一致.(這裏指的應該是部署應用程序所在的機器吧?)
Namespace
一個應用下不一樣配置的分組,能夠簡單地把namespace類比爲文件,不一樣類型的配置存放在不一樣的文件中,如數據庫配置文件,RPC配置文件,應用自身的配置文件等
應用能夠直接讀取到公共組件的配置namespace,如DAL,RPC等
應用也能夠經過繼承公共組件的配置namespace來對公共組件的配置作調整,如DAL的初始數據庫鏈接數
灰度
A,B,C客戶端機器.
配置項 timeout=20.
灰度爲A機器保持默認主版本參數timeout=20,B,C機器爲timeout=30.
運行一段時間,觀察效果,再逐步將全部機器發佈30.
參考
https://github.com/ctripcorp/apollo/wiki/分佈式部署指南 分佈式部署指南
機器配置說明(規劃配置)
portal 192.168.143.130 portal+portalDB
dev 192.168.143.131 config+admin+configDB
pro 192.168.143.132 config+admin+configDB
JDK安裝
cd /opt;
wget http://13.251.64.203:18081/jdk-8u181-linux-x64.tar.gz
tar xzvf jdk-8u181-linux-x64.tar.gz
mv /opt/jdk1.8.0_181 /usr/local/jvm
修改/etc/profile文件,添加:
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jvm
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
EOF
source /etc/profile
echo $PATH #確保/usr/local/jvm/bin排在首位
java -version
mysql安裝
請參考mysql文檔.建議安裝 mysql-5.7.27版本.
DB設置.
CREATE USER 'apollo'@'localhost' IDENTIFIED BY 'sj...8sg'; CREATE USER 'apollo'@'%' IDENTIFIED BY 'sj...8sg'; # 只設置1臺potal(130) create database apolloportaldb; GRANT ALL PRIVILEGES ON apolloportaldb.* TO 'apollo'@'%'; GRANT ALL PRIVILEGES ON apolloportaldb.* TO 'apollo'@localhost; # 1臺DEV 與 1臺PRO 均設置(131,132) create database apolloconfigdb; GRANT ALL PRIVILEGES ON apolloconfigdb.* TO 'apollo'@'%'; GRANT ALL PRIVILEGES ON apolloconfigdb.* TO 'apollo'@localhost;
mysql的sql文件導入,請參考後面git克隆代碼部分.
github克隆代碼(目的主要爲獲取sql表數據,另外也能夠自行編譯Apollo)
在portal,config+admin機器/opt/目錄分別執行
git clone https://github.com/ctripcorp/apollo.git
拉取的代碼裏,包含sql文件,以下
/opt/apollo-all-code-git/scripts/db/migration/
[root@localhost migration]# tree . ├── configdb │ └── V1.0.0__initialization.sql #config的sql導入文件(供config和admin服務) ├── flyway-configdb.properties ├── flyway-portaldb.properties └── portaldb └── V1.0.0__initialization.sql #portal的sql導入文件(供portal服務)
將以上2個sql分別導入到1臺portal-DB和 2臺config-DB裏.
採用直接下載打包好的文件解壓
下載路徑(從GitHub的md文檔,即Apollo文檔中獲得)
https://github.com/ctripcorp/apollo/releases/
獲取對應的portal.zip,admin.zip,config.zip文件,解壓,能夠放到/opt/目錄.其餘目錄也能夠.默認日誌文件會被丟到/opt/目錄(配置文件裏默認指定,能夠修改).
文件說明
以portal爲例
[root@localhost apollo-portal]# pwd /opt/apollo-portal [root@localhost apollo-portal]# tree . ├── apollo-portal-1.4.0.jar ├── apollo-portal-1.4.0-sources.jar ├── apollo-portal.conf #參考下文 ├── apollo-portal.jar ├── config #參考下文 │ ├── apollo-env.properties │ ├── application-github.properties │ └── app.properties └── scripts ├── shutdown.sh └── startup.sh
配置文件
安裝portal,config,admin能夠直接下載安裝包方式.或者下載源碼自行編譯方式(編譯主要適用於二次開發),這裏未作嘗試,如須要的話,建議使用阿里的maven庫比較快.
配置項目有一部分是放在DB的表裏的.
1.配置文件
protal配置文件
[root@localhost apollo-portal]# pwd /opt/apollo-portal [root@localhost apollo-portal]# cat apollo-portal.conf (默認,無需修改) MODE=service PID_FOLDER=. LOG_FOLDER=/opt/logs/100003173/ [root@localhost apollo-portal]# cat config/apollo-env.properties (2個環境,默認是多個被註釋的)指定Eureka的地址 dev.meta=http://192.168.143.131:8080 pro.meta=http://192.168.143.132:8080 [root@localhost apollo-portal]# cat config/application-github.properties (Portal訪問本身DB的配置) # DataSource spring.datasource.url = jdbc:mysql://127.0.0.1:10306/ApolloPortalDB?characterEncoding=utf8 #這裏DB在本地,因此爲127地址. spring.datasource.username = apollo spring.datasource.password = sj...8sg [root@localhost apollo-portal]# cat config/app.properties 默認(appId信息,爲portal進程信息,日誌是按照此id分類存儲的.config爲100003171,admin爲100003172) appId=100003173 jdkVersion=1.8
config配置文件
[root@localhost apollo-config]# pwd /opt/apollo/apollo-config [root@localhost apollo-config]# cat apollo-configservice.conf 保持默認 MODE=service PID_FOLDER=. LOG_FOLDER=/opt/logs/100003171/ [root@localhost config]# cat config/application-github.properties 須要修改,指定本身configDB地址 # DataSource spring.datasource.url = jdbc:mysql://127.0.0.1:10306/ApolloConfigDB?characterEncoding=utf8 spring.datasource.username = apollo spring.datasource.password = sj...8sg [root@localhost config]# cat config/app.properties 保持默認 appId=100003171 jdkVersion=1.8
admin配置文件
略,同config服務的配置.
2.調整服務端配置
Apollo自身的一些配置是放在數據庫裏面的,因此須要針對實際狀況作一些調整。
如下配置除了支持在數據庫中配置之外,也支持經過-D參數、application.properties等配置,且-D參數、application.properties等優先級高於數據庫中的配置.
這裏以修改DB表字段爲例,來調整服務器配置.
2.1調整ApolloPortalDB配置(Portal)
配置項統一存儲在ApolloPortalDB.ServerConfig表中,也能夠經過管理員工具 - 系統參數頁面進行配置,無特殊說明則修改完一分鐘實時生效。
apollo.portal.envs字段(可支持的環境列表),默認值是dev,若是portal須要管理多個環境的話,以逗號分隔便可(大小寫不敏感),如:
DEV,FAT,UAT,PRO (ApolloPortalDB.ServerConfig表字段,本實驗設置爲 dev,pro)
2.2調整ApolloConfigDB配置(config)
配置項統一存儲在ApolloConfigDB.ServerConfig表中,須要注意每一個環境的ApolloConfigDB.ServerConfig都須要單獨配置,修改完一分鐘實時生效。
eureka.service.url字段(Eureka服務Url).
這裏dev和pro分別有1臺,因此只須要添加本機(默認已有,爲http://localhost:8080/eureka/).pro也只有1臺,也同樣.
啓停
啓動順序
config(8080) -> admin(8090) -> portal(8070)
啓停腳本路徑(相似)
/opt/apollo-portal/scripts/startup.sh
/opt/apollo-portal/scripts/shutdown.sh
頁面與服務說明
登錄Portal:
http://192.168.143.130:8070/
默認用戶名 apollo,密碼 admin
登錄Eureka(優瑞卡)(無用戶名密碼,由config提供的服務):
http://192.168.143.131:8080/
http://192.168.143.132:8080/
訪問admin,相似
http://192.168.143.131:8090/ 頁面顯示 "apollo-adminservice"字符
http://192.168.143.132:8090/
參考 https://github.com/ctripcorp/apollo/wiki/Apollo使用指南
建立項目
建立用戶
修改系統參數(會修改DB),好比增長部門名稱.
對不一樣環境,DEV,PRO分別新增配置,併發布,或回滾.
添加集羣
添加NameSpace
請參考應用程序接入部分.
思考,客戶端更新是否成功,如何判斷?須要手動寫Java程序給出接口嗎?仍是說Portal有對應的監控項?(好像沒有).-> 能夠經過應用程序機器本地的緩存配置目錄中查看.另外,客戶端配置信息監控,能夠在界面上方便地看到配置在被哪些實例(IP)使用
參考 https://github.com/ctripcorp/apollo/wiki/Java客戶端使用指南
支持 Java, .net, 其餘語言(第三方提供的Go,Python等)
Java接入
1.pom.xml引用插件
pom.xml裏apollo的引用
2.指定讀取哪一個Eureka機器裏的數據
配置DEV仍是PRO環境,有多種方式.建議服務器方式配置(開發機不多會變成生產).在開發機的 /opt/setting/server.properties,內容
apollo.meta=http://192.168.143.131:8080/ 若是是多個機器(高可用),後面跟","隔開.今後Eureka裏讀取應用程序(如test,或app-id-01)的配置信息.
3.指定讀取哪一個應用程序配置
apollo內項目的appid爲test.那麼須要錄入到自身Java程序的 src->main->resource->META-INF->app.properties裏: app.id=test (從Eureka裏讀取應用程序test的配置信息)
4.Java代碼調用和驗證
寫java代碼來調用apollo的配置信息,並自定義頁面,檢查是否成功.
其餘語言
請參考官方文檔說明(目前有用戶提供了對應的python,nodejs,php,go等方式),或者使用http的api方式,具體說明參考官網文檔.
緩存配置文件
客戶端獲取配置文件後,會寫一份緩存的物理文件,放在本地.
因此應用程序,好比java或.net須要具備此目錄的讀寫權限.
這個目錄也能夠在啓動應用程序的時候指定,如-Dapollo.cacheDir=/opt/data/some-cache-dir
本地配置目錄默認位於:
Mac/Linux: /opt/data/{appId}/config-cache
Docker,K8S的部署方式,請參考官方文檔說明->分佈式部署>-Docker,k8s.
參考 https://github.com/ctripcorp/apollo/wiki/Portal-實現用戶登陸功能 用戶登陸(LDAP,SSO)
LDAP接入
略
數據庫+配置文件
當前3臺,分別爲1臺protal,1臺dev,1臺pro.現將pro也改成dev,以便模擬dev環境的高可用(2臺).即實現Eureka的互備.
注意:這裏,目的是config和admin服務高可用,DB仍爲單點.protal的DB在130,config和admin的DB在131.
修改
1.130機器protal的DB表serverconfig字段apollo.portal.envs
值dev,pro->dev
2.131機器config的DB標serverconfig字段eureka.service.url
值http://localhost.../->http://192.168.143.131:8080/eureka/,http://192.168.143.132:8080/eureka/
3.130機器portal的配置文件
cat /opt/apollo-portal/config/apollo-env.properties
dev.meta=http://192.168.143.131:8080
pro.meta=http://192.168.143.132:8080
修改成
dev.meta=http://192.168.143.131:8080,http://192.168.143.132:8080
4.131和132上config和admin配置文件修改,數據庫所有指向131機器
cat /opt/apollo/apollo-config/config/application-github.properties
spring.datasource.url = jdbc:mysql://192.168.143.131:10306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apollo
spring.datasource.password = xxx
確認
啓動服務後,就只剩DEV環境了.
Protal訪問後端的Eureka,並無任何認證過程.那麼,誰均可以經過http api方式,往config裏注入數據.安全隱患. 故此不能開放給外網.