Apollo簡介
Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性。
特點:
- 統一管理不同環境、不同集羣的配置
- Apollo提供了一個統一界面集中式管理不同環境(environment)、不同集羣(cluster)、不同命名空間(namespace)的配置。
- 同一份代碼部署在不同的集羣,可以有不同的配置,通過命名空間(namespace)可以很方便的支持多個不同應用共享同一份配置,同時還允許應用對共享的配置進行覆蓋.
- 配置修改實時生效(熱發佈)
用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序。 - 版本發佈管理
所有的配置發佈都有版本概念,從而可以方便的支持配置的回滾。 - 灰度發佈
支持配置的灰度發佈,比如點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給所有應用實例。 - 權限管理、發佈審覈、操作審計
應用和配置的管理都有完善的權限管理機制,對配置的管理還分爲了編輯和發佈兩個環節,從而減少人爲的錯誤。
所有的操作都有審計日誌,可以方便的追蹤問題。
核心概念:
- application (應用)
這個很好理解,就是實際使用配置的應用,Apollo客戶端在運行時需要知道當前應用是誰,從而可以去獲取對應的配置每個應用都需要有唯一的身份標識 – appId,我們認爲應用身份是跟着代碼走的,所以需要在代碼中配置。 - environment (環境)
配置對應的環境,Apollo客戶端在運行時需要知道當前應用處於哪個環境,從而可以去獲取應用的配置我們認爲環境和代碼無關,同一份代碼部署在不同的環境就應該能夠獲取到不同環境的配置所以環境默認是通過讀取機器上的配置(server.properties中的env屬性)指定的,不過爲了開發方便,我們也支持運行時通過System Property等指定。 - cluster (集羣)
一個應用下不同實例的分組,比如典型的可以按照數據中心分,把上海機房的應用實例分爲一個集羣,把北京機房的應用實例分爲另一個集羣。對不同的cluster,同一個配置可以有不一樣的值,如zookeeper地址。
集羣默認是通過讀取機器上的配置(server.properties中的idc屬性)指定的,不過也支持運行時通過System Property指定,具體信息請參見Java客戶端使用指南。 - namespace (命名空間)
一個應用下不同配置的分組,可以簡單地把namespace類比爲文件,不同類型的配置存放在不同的文件中,如數據庫配置文件,RPC配置文件,應用自身的配置文件等。
模塊架構:
上圖簡要描述了 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進程中。
2、分佈式部署指南
2.1、環境
1.1 Java Apollo服務端:1.8+ Apollo客戶端:1.7+
1.2 MySQL 版本要求:5.6.5+
2.2、部署步驟
2.2.1、獲取安裝包:
方式1:直接下載安裝包,GitHub地址:https://github.com/ctripcorp/apollo/releases,Apollo服務端安裝包共有3個:apollo-configservice, apollo-adminservice, apollo-portal。
方式2:下載源碼,自己打包。GitHub地址:https://github.com/ctripcorp/apollo
學習建議使用直接下載安裝包:
這裏我們下載的是1.6.1版本的安裝包
2.2.2、創建數據庫
Apollo服務端共需要兩個數據庫:ApolloPortalDB和ApolloConfigDB
獲取建庫腳本:剛纔下載的是1.6.1的安裝包,所以這裏也要獲取1.6.1版本的建庫腳本。
打開apollo源碼:https://github.com/ctripcorp/apollo
分支切換到1.6.1 並進入script/sql目錄
這裏兩個就是建庫腳本,執行
2.2.2、啓動安裝包
數據庫創建已創建成功,解壓這三個安裝包.
配置數庫地址:
1、在apollo-adminservice-1.6.1-github和apollo-configservice-1.6.1-github 的 config/application-github.properties 中配置數據地址:ApolloConfigDB數據庫的訪問地址:
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root 數據
spring.datasource.password = hong10086
2、在apollo-portal-1.6.1-github的 config/application-github.properties 中配置數據地址:ApolloPortalDB數據庫的訪問地址:
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = hong10086
這三個安裝包的啓動順序是configservice在adminservice 前啓動,portal是管理界面這裏最後啓動。啓動和關閉的腳步分別在三個安裝包的script文件夾中。
啓動 configservice:
異常1:
日誌輸出目錄沒有權限,解決方法 1、賦予目錄的執行權限;2、修改日誌的輸出目錄,在startup.sh 中就可以修改。
我的是mac,直接手動創建了一個/opt目錄
查看日誌 eureka server啓動成功:
以同樣的方法啓動adminservice、portal。
服務檢查:
三個服務啓動完成後 在瀏覽器中輸入portal 的訪問地址http://localhost:8070 用戶名:apollo 密碼: admin
點擊右側的“管理員工具” -> “系統信息” 出現了異常
這裏的意思就是potal 管理平臺無法訪問 meta server ,meta server的配置地址是http://fill-in-dev-meta-server:8080,顯然本地是不存在着個地址的。meta server 簡單理解就是這裏的eureka 的地址,eureka是在configservice中,所以這裏應該配置confgservice地址 http://localhost:8080
在eureka中我們可以發現configservice、adminservice已經註冊完成了。
如何指定potal中的 meta server地址?
打開:apollo-portal-1.6.1-github/config/apollo-env.properties
可以看出一個potal可以指定多個meta server地址,通過環境來區分這裏默認有de、fat、uat、pro四個環境 。
本次只改dev環境的地址:將dev.meta=http://fill-in-dev-meta-server:8080改成dev.meta=http://localhost:8080
保存後重啓potal
再次驗證:
再次打開apollo的系統信息頁面,可以發現configservice、adminservice已經可以被發現了。
2.3、實例演示
2.3.1創建一個項目:
部門和人員都可以自定義:
1、自定義的部門:
在“管理員工具”->“系統參數”中設置。
這裏不僅可以設置部門,還可以設置 ApolloPortalDB.ServerConfig表中的所有數據,如果已存在配置項則會覆蓋,否則會創建配置項。配置更新後,一分鐘後自動生效。
ApolloPortalDB.ServerConfig表:
2、添加用戶:
在“管理員工具”->“戶名管理”中設置。
“新建配置” name=王二 然後 “發佈”
java客戶端讀取配置:
引入jar包:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
讀取配置:
public class Test {
public static void main(String[] args) throws Exception {
while (true) {
Config config = ConfigService.getAppConfig();
String key = "name";
String defaultValue = "";
String value = config.getProperty(key, defaultValue);
System.out.println("name = " + value);
TimeUnit.SECONDS.sleep(5);
}
}
}
java客戶端代碼編寫完成,這時要向apollo讀取配置,apollo上有許多環境,每個環境又有許多應用。因此要告訴客戶端讀取那個環境下的那個應用。告訴的方式有很多這裏使用最簡單的
這是啓動客戶端便可以讀取配置了:
java客戶端配置環境(MetaServer)、應用(AppId
)的其他方式:
配置應用(AppId
):
AppId是應用的身份信息,是從服務端獲取配置的一個重要信息。有以下幾種方式設置,按照優先級從高到低分別爲:
1、System Property
Apollo 0.7.0+支持通過System Property傳入app.id信息,如 :-Dapp.id=YOUR-APP-ID
2、操作系統的System Environment
Apollo 1.4.0+支持通過操作系統的System Environment APP_ID來傳入app.id信息,如:APP_ID=YOUR-APP-ID
3、Spring Boot application.properties
Apollo 1.0.0+支持通過Spring Boot的application.properties文件配置,如 :app.id=YOUR-APP-ID,該配置方式不適用於多個war包部署在同一個tomcat的使用場景
4、app.properties
確保classpath:/META-INF/app.properties文件存在,並且其中內容形如:app.id=YOUR-APP-ID
配置環境(MetaServer)
Apollo支持應用在不同的環境有不同的配置,所以需要在運行提供給Apollo客戶端當前環境的Apollo Meta Server信息。默認情況下,meta server和config service是部署在同一個JVM進程,所以meta server的地址就是config service的地址。
有以下幾種方式設置,,按照優先級從高到低分別爲:
1、通過Java System Property apollo.meta
可以通過Java的System Property apollo.meta來指定
在Java程序啓動腳本中,可以指定-Dapollo.meta=http://config-service-url
如果是運行jar文件,需要注意格式是java -Dapollo.meta=http://config-service-url -jar xxx.jar
也可以通過程序指定,如System.setProperty("apollo.meta", "http://config-service-url");
2、通過Spring Boot的配置文件
可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url
該配置方式不適用於多個war包部署在同一個tomcat的使用場景
3、通過操作系統的System EnvironmentAPOLLO_META
可以通過操作系統的System Environment APOLLO_META來指定
注意key爲全大寫,且中間是_分隔
4、通過server.properties配置文件
可以在server.properties配置文件中指定apollo.meta=http://config-service-url
對於Mac/Linux,文件位置爲/opt/settings/server.properties
對於Windows,文件位置爲C:\opt\settings\server.properties
5、通過app.properties配置文件
可以在classpath:/META-INF/app.properties指定apollo.meta=http://config-service-url
6、通過Java system property ${env}_meta
如果當前env是dev,那麼用戶可以配置-Ddev_meta=http://config-service-url
使用該配置方式,那麼就必須要正確配置Environment,詳見1.2.4.1 Environment
7、通過操作系統的System Environment ${ENV}_META (1.2.0版本開始支持)
如果當前env是dev,那麼用戶可以配置操作系統的System Environment DEV_META=http://config-service-url
注意key爲全大寫 使用該配置方式,那麼就必須要正確配置Environment,詳見1.2.4.1 Environment
8、通過apollo-env.properties文件
用戶也可以創建一個apollo-env.properties,放在程序的classpath下,或者放在spring boot應用的config目錄下
使用該配置方式,那麼就必須要正確配置Environment,詳見1.2.4.1 Environment
文件內容形如:
dev.meta=http://1.1.1.1:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xx