配置中心-Apollo
2019/10/01 Chenxin
配置服務主要有 攜程Apollo、百度Disconf、阿里ACM,目前以Apollo用戶量最大.適用場景,多用于微服務,與K8S結合好.
攜程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運行時環境,
百度Disconf
https://github.com/knightliao/disconf
Disconf - Distributed Configuration Management Platform(分布式配置管理平臺).
百度disconf是一套完整的基于zookeeper的分布式配置統一解決方案,一個分布式環境中,同型別的服務往往會部署很多實體,這些實體使用了一些配置,為了更好地維護這些配置就產生了配置管理服務,通過這個服務可以輕松地管理成千上百個服務實體的配置問題,專注于各種「分布式系統配置管理」的「通用組件」和「通用平臺」, 提供統一的「配置管理服務」.
主要目標
部署極其簡單:同一個上線包,無須改動配置,即可在 多個環境中(RD/QA/PRODUCTION) 上線.
部署動態化:更改配置,無需重新打包或重啟,即可 實時生效.
統一管理:提供web平臺,統一管理 多個環境(RD/QA/PRODUCTION)、多個產品 的所有配置.
核心目標:一個jar包,到處運行.
阿里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 能幫助您集中管理所有應用環境中的配置,降低分布式系統中管理配置的成本,并降低因錯誤的配置變更帶來可用性下降甚至發生故障的風險,
比較
目前大多認為 Apollo優于Disconf優于ACM.
Apollo
參考
https://github.com/ctripcorp/apollo
架構說明
參考: https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹
架構圖: 略.
Apollo的總體設計,我們可以從下往上看:
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行程中
基本概念決議
參考:
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/
Portal操作說明,使用指南
參考 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里注入資料.安全隱患.
故此不能開放給外網.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7235.html
標籤:其他
上一篇:代理(Proxy)設計模式
