Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,并且具備規范的權限、流程治理等特性。Apollo架構模塊圖:
來源:網絡
各模塊職責
- Config Service提供配置的讀取、推送等功能,服務對象是Apollo客戶端
- Admin Service提供配置的修改、發布等功能,服務對象是Apollo Portal(管理界面)
- Eureka提供服務注冊和發現,目前Eureka在部署時和Config Service是在一個JVM進程中的
- 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進程中
分步執行流程
- Apollo啟動后,Config Service和Admin Service會自動注冊到Eureka服務注冊中心,并定期發送保活心跳。
- Apollo Client和Portal管理端通過配置的Meta Server的域名地址經由Software Load Balancer(軟件負載均衡器)進行負載均衡后分配到某一個Meta Server
- Meta Server從Eureka獲取Config Service和Admin Service的服務信息,相當于是一個Eureka Client
- Meta Server獲取Config Service和Admin Service(IP+Port)失敗后會進行重試
- 獲取到正確的Config Service和Admin Service的服務信息后,Apollo Client通過Config Service為應用提供配置獲取、實時更新等功能;Apollo Portal管理端通過Admin Service提供配置新增、修改、發布等功能
核心概念
- Application (應用):就是實際使用配置的應用,Apollo客戶端在運行時需要知道當前應用是誰,從而可以去獲取對應的配置
關鍵字:appId - environment (環境):配置對應的環境,Apollo客戶端在運行時需要知道當前應用處于哪個環境,從而可以去獲取應用的配置
關鍵字:env - cluster (集群):一個應用下不同實例的分組,比如典型的可以按照數據中心分,把上海機房的應用實例分為一個集群,把北京機房的應用實例分為另一個集群。
關鍵字:cluster - namespace (命名空間): 一個應用下不同配置的分組,可以簡單地把namespace類比為文件,不同類型的配置存放在不同的文件中,如數據庫配置文件,RPC配置文件,應用自身的配置文件等
關鍵字:namespaces
0x01:部門管理
Apollo 默認部門提供兩個,如需要增加部門,可在系統參數中修改
添加部門
0x02:用戶管理
添加用戶
0x03:創建項目(應用)
創建項目
創建完成后
0x04:授權管理
賦予用戶huangjj管理payservice服務的權限
這樣huangjj用戶登錄就可以看到payservice應用了。
0x05:刪除項目
刪除應用
集群和Namespace刪除同理
0x06:創建token
輸入相關參數,點擊創建就
Namespace授權
0x07:添加配置和發布配置
添加
發布
0x08:創建Namespace
創建Namespace
Namespace授權
0x08:獲取集群下所有Namespace信息接口
curl -H 'Authorization:748aba21fa6717c5ac6210e82d32f05d9a7c61d6'
-H 'Content-Type:application/json;charset=UTF-8'
http://127.0.0.1:8070/openapi/v1/envs/dev/apps/payservice/clusters/default/namespaces/application
返回數據:
{
"appId": "payservice",
"clusterName": "default",
"namespaceName": "application",
"comment": "default app namespace",
"format": "properties",
"isPublic": false,
"items": [
{
"key": "rule.count",
"value": "100",
"comment": "",
"dataChangeCreatedBy": "apollo",
"dataChangeLastModifiedBy": "apollo",
"dataChangeCreatedTime": "2020-08-08T09:37:13.000+0800",
"dataChangeLastModifiedTime": "2020-08-08T09:37:13.000+0800"
},
{
"key": "port",
"value": "9009",
"comment": "",
"dataChangeCreatedBy": "apollo",
"dataChangeLastModifiedBy": "apollo",
"dataChangeCreatedTime": "2020-08-08T09:37:13.000+0800",
"dataChangeLastModifiedTime": "2020-08-08T09:37:13.000+0800"
}
],
"dataChangeCreatedBy": "apollo",
"dataChangeLastModifiedBy": "apollo",
"dataChangeCreatedTime": "2020-08-08T09:18:59.000+0800",
"dataChangeLastModifiedTime": "2020-08-08T09:18:59.000+0800"
}
結構url的參數規則說明:
env所管理的配置環境appId所管理的配置AppIdclusterName所管理的配置集群名, 一般情況下傳入 default 即可。如果是特殊集群,傳入相應集群的名稱即可namespaceName所管理的Namespace的名稱,如果是非properties格式,需要加上后綴名,如sample.yml
詳細參考:https://github.com/ctripcorp/apollo/wiki/Apollo開放平臺
另外也可以通過JAVAAPI的方式獲取配置
詳細參考:https://github.com/ctripcorp/apollo/wiki/Java客戶端使用指南