1. 程式人生 > 實用技巧 >分散式配置中心Apollo

分散式配置中心Apollo

前言

  日常不同應用的配置管理及更新很頻繁,如果做成集中式的分散式配置中心,還支援實時更新客戶端配置的話會輕鬆很多。

常用的分散式配置中心框架:

  • 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 服務端啟動成功。

訪問web介面: (http://127.0.0.1:8070/signin),登入賬號:apollo,密碼:admin

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)