配置中心-Apollo


配置中心-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里注入數據.安全隱患.
故此不能開放給外網.


免責聲明!

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



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