分布式配置中心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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM