前言
日常不同應用的配置管理及更新很頻繁,如果做成集中式的分布式配置中心,還支持實時更新客戶端配置的話會輕松很多。
常用的分布式配置中心框架:
- Disconf(依賴於zookpeer)
- Zookpeer(保證配置文件信息實時更新 -
事件通知
) - diamond(阿里巴巴研發)
- Apollo阿波羅(攜程研發)
- Redis
- xxl-conf
Apollo簡介
Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,並且具備規范的權限、流程治理等特性,適用於微服務配置管理場景。
Apollo特點
- 統一管理不同環境、不同集群的配置: 所有的配置發布都有版本概念,從而可以方便的支持配置的回滾。
- 配置修改實時生效(熱發布): 用戶在Apollo修改完配置並發布后,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序
- 灰度發布:支持配置的灰度發布,比如點了發布后,只對部分應用實例生效,等觀察一段時間沒問題后再推給所有應用實例。
- 權限管理、發布審核、操作審計: 應用和配置的管理都有完善的權限管理機制,對配置的管理還分為了編輯和發布兩個環節,從而減少人為的錯誤。所有的操作都有審計日志,可以方便的追蹤問題。
- Apollo還提供了Java和.Net的原生客戶端,方便應用集成支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(需要Spring 3.1.1+)同時提供了Http接口,非Java和.Net應用也可以方便的使用。
- 提供開放平台API:Apollo自身提供了比較完善的統一配置管理界面,支持多環境、多數據中心配置管理、權限、流程治理等特性。不過Apollo出於通用性考慮,對配置的修改不會做過多限制,只要符合基本的格式就能夠保存。對於有些使用方,它們的配置可能會有比較復雜的格式,如xml, json,需要對格式做校驗。還有一些使用方如DAL,不僅有特定的格式,而且對輸入的值也需要進行校驗后方可保存,如檢查數據庫、用戶名和密碼是否匹配。對於這類應用,Apollo支持應用方通過開放接口在Apollo進行配置的修改和發布,並且具備完善的授權和權限控制。
- 部署簡單 :配置中心作為基礎服務,可用性要求非常高,這就要求Apollo對外部依賴盡可能地少,目前唯一的外部依賴是MySQL,所以部署非常簡單,只要安裝好Java和MySQL就可以讓Apollo跑起來,Apollo還提供了打包腳本,一鍵就可以生成所有需要的安裝包,並且支持自定義運行時參數。
Apollo 流程
首先用戶在配置中心對配置進行修改並發布;配置中心通知Apollo客戶端有配置更新;Apollo客戶端從配置中心拉取最新的配置、更新本地配置並通知到應用。
Apollo 支持4個維度管理 Key-Value 格式的配置:
- application (應用):實際使用配置的應用,Apollo客戶端在運行時需要知道當前應用是誰,從而可以去獲取對應的配置;每個應用都需要有唯一的身份標識 -- appId,應用身份是跟着代碼走的,所以需要在代碼中配置。
- environment (環境):配置對應的環境,Apollo客戶端在運行時需要知道當前應用處於哪個環境,從而可以去獲取應用的配置。
- cluster (集群):一個應用下不同實例的分組,比如典型的可以按照數據中心分,把上海機房的應用實例分為一個集群,把北京機房的應用實例分為另一個集群。對不同的cluster,同一個配置可以有不一樣的值,如zookeeper地址。
- namespace (命名空間):一個應用下不同配置的分組,可以簡單地把namespace類比為文件,不同類型的配置存放在不同的文件中,如數據庫配置文件,RPC配置文件,應用自身的配置文件等;應用可以直接讀取到公共組件的配置namespace,如DAL,RPC等;應用也可以通過繼承公共組件的配置namespace來對公共組件的配置做調整,如DAL的初始數據庫連接數。
Apollo 安裝配置
安裝要求:
Java:
- Apollo服務端:1.8+
- Apollo客戶端:1.7+
MySQL:
- 版本要求:5.6.5+
虛擬機內存:
- 2g
安裝
官網准備好了一個Quick Start安裝包,大家只需要下載到本地,就可以直接使用,免去了編譯、打包過程。也可以自行編譯,較為繁瑣。
Apollo服務端共需要兩個數據庫:ApolloPortalDB和ApolloConfigDB。創建的語句見安裝包,創建好之后需要配置啟動的腳本,即 demo.sh
腳本:
#apollo config db info apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=用戶名 apollo_config_db_password=密碼(如果沒有密碼,留空即可) # apollo portal db info apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=用戶名 apollo_portal_db_password=密碼(如果沒有密碼,留空即可)
腳本會在本地啟動3個服務,分別使用8070, 8080, 8090端口,請確保這3個端口當前沒有被使用。執行
./demo.sh start
看到輸出如下的日志信息:
==== starting service ==== Service logging file is ./service/apollo-service.log Started [10768] Waiting for config service startup....... Config service started. You may visit http://localhost:8080 for service status now! Waiting for admin service startup.... Admin service started ==== starting portal ==== Portal logging file is ./portal/apollo-portal.log Started [10846] Waiting for portal startup...... Portal started. You can visit http://localhost:8070 now!
Apollo 服務端啟動成功。
Python客戶端
Apollo源碼地址:
https://github.com/ctripcorp/apollo
python訪問Apollo使用這個庫:
https://github.com/filamoon/pyapollo
簡單示例:
import pyapollo a = pyapollo.ApolloClient("test1","default","http://192.168.1.100:8080") a.start() for key in ["ip","port"]: v = a.get_value(key) print("%s : " % key) print(v)