Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,並且具備規范的權限、流程治理等特性,適用於微服務配置管理場景。
服務端基於Spring Boot和Spring Cloud開發,打包后可以直接運行,不需要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,能夠運行於所有Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。
它具有以下特點
統一管理不同環境、不同集群的配置 Apollo提供了一個統一界面集中式管理不同環境(environment)、不同集群(cluster)、不同命名空間(namespace)的配置。 同一份代碼部署在不同的集群,可以有不同的配置,比如zk的地址等 通過命名空間(namespace)可以很方便的支持多個不同應用共享同一份配置,同時還允許應用對共享的配置進行覆蓋 配置修改實時生效(熱發布) 用戶在Apollo修改完配置並發布后,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序。 版本發布管理 所有的配置發布都有版本概念,從而可以方便的支持配置的回滾。 灰度發布 支持配置的灰度發布,比如點了發布后,只對部分應用實例生效,等觀察一段時間沒問題后再推給所有應用實例。 權限管理、發布審核、操作審計 應用和配置的管理都有完善的權限管理機制,對配置的管理還分為了編輯和發布兩個環節,從而減少人為的錯誤。 所有的操作都有審計日志,可以方便的追蹤問題。 客戶端配置信息監控 可以方便的看到配置在被哪些實例使用 提供Java和.Net原生客戶端 提供了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還提供了打包腳本,一鍵就可以生成所有需要的安裝包,並且支持自定義運行時參數
一 快速部署 (單機,單環境)
詳情可參考官方文檔https://github.com/ctripcorp/apollo/wiki/Quick-Start
這里做簡單記錄:
1.下載安裝包
2.安裝mysql數據庫。版本要求為5.6+
3.創建數據庫。包括兩個。一個是元數據庫,ApolloPortalDB。一個是環境數據庫,ApolloConfigDB。相應的sql存放在安裝包的sql目錄下。庫名可自定義。
4.修改配置。主要是啟動腳本。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=密碼(如果沒有密碼,留空即可)
5.啟動。
Quick Start腳本會在本地啟動3個服務,分別使用8070, 8080, 8090端口,請確保這3個端口當前沒有被使用。
執行demo.sh start命令。啟動會很慢。
如果遇到以下錯誤是正常的。
注:在啟動apollo-configservice的過程中會在日志中輸出eureka注冊失敗的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,這個是預期的情況,因為apollo-configservice需要向Meta Server(它自己)注冊服務,但是因為在啟動過程中,自己還沒起來,所以會報這個錯。后面會進行重試的動作,所以等自己服務起來后就會注冊正常了
6.如果一切正常的話。通過8080端口可以看到注冊中心界面如下。
通過8090端口可以看到哪下界面:
通過8070端口可以看到如下界面:
用戶可以通過此界面創建一個項目。新增修改刪除配置。並發布。如有錯誤可回滾上一版本。可創建灰度版本。可創建不同環境的配置。可查看配置發布歷史,並選擇版本回滾。
7.創建
創建一個項目,並發布一個配置:test->apollo
8使用
官方提供了java,.net客戶端。也有網友提供了go,php,python等語言的http接口。這里使用java客戶端。
8.1 新建一個項目,加入pom.xml
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.0.0</version> </dependency>
8.2創建appid,即哪一個項目,比如剛才我們創建了一個test項目的時候,會填寫一個app.id,假如為test.
官方實際上提供了3種配置方式 ,這里只選擇在項目中配置文件的方式 。
在resource目錄下新建目錄META-INF,然后創建文件app.properties.內容為app.id=test
8.3創建Apollo Meta Server。即每一個環境的服務地址。
官方同樣提供了很多種創建方式。這里在本地的話,使用在項目中通過配置文件的方式指定。
在resource目錄下創建apollo-env.properties,內容為
dev.meta=http://localhost:8080 fat.meta=http://localhost:8180 uat.meta=http://apollo.uat.xxx.com pro.meta=http://apollo.xxx.com
目前只是單環境,實際上只需要修改dev.meta的內容。其它環境在多環境部署時介紹。
8.4 指定環境 。哪怕是在單環境下,要使用配置,也是需要指定一個環境的。
官方提供的指定方式也蠻多。在開發環境下,可直接在eclipse里設定。
windon->preferences->java->Installed JREs
8.5 java的api
Config config = ConfigService.getAppConfig(); String value = config.getProperty("test", "default"); System.out.println("value = " + value);
輸出
value = hello apollo
應用非常簡單。
9 一些疑問。
9.1 在服務器修改了配置后,它真的能做到官方所言1秒鍾實時推送到客戶端嗎?
可以。
Config config = ConfigService.getAppConfig(); while (true) { String value = config.getProperty("test", "default"); System.out.println("time = " + System.currentTimeMillis() + " value = " + value); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
輸出
9.2 配置實際上是保存在mysql里面的,頻繁讀取會有額外的性能壓力嗎?
沒有去調試去源碼,但本地保存有一個緩存文件。在/opt/data/test/config-cache目錄下,會有一個文件,保存有最新的配置數據。每次讀取都是到這里獲取。
二多環境部署。
1.直觀上的區別 。首先我們來看快速單環境部署的目錄。
直接從官網下載安裝包,解壓,得到這樣的目錄,修改配置,直接啟動demo.sh就可以啟動了。非常簡單。
但是多環境布署的目錄是這樣的,假設部署DEV和FAT兩個環境。
dev下
2.同樣需要安裝數據庫。跟快速部署一樣。一個是元數據庫,ApolloPortalDB。環境數據庫則需創建多個,ApolloConfigDB_DEV,ApolloConfigDB_FAT。相應的sql存放在安裝包的sql目錄下。庫名可自定義。
3.打開ApolloPortalDB庫serverconfig表,修改apollo.portal.envs值,默認為dev,加入需要配置的其它環境。如fat,如自定義。不區分大小寫。
4.打開ApolloConfigDB_DEV或者 ApolloConfigDB_FAT庫,打開serverconfig表,修改eureka.service.url注冊服務中心地址。
具體怎么修改呢?
假設我們現在是要部署dev和fat兩個環境,由單環境部署可知,服務啟動會有三個端口,分別是配置中心8070,注冊服務8080,admin服務8090,
假設我們規划,由於8070端口只有一個
dev環境中三個端口分別為 8070,8080,8090
fat環境中三個端口分別為 8070,8180,8090
那么ApolloConfigDB_DEV中由於默認關系可以不用修改,而ApolloConfigDB_FAT中則需要把eureka.service.url修改為http://localhost:8180/eureka/
5准備工作完成,開始下載或者編譯安裝包。
我選擇的是下載源碼,編譯。在script目錄下有個build.bat和build.sh文件,點擊聯網自動完成編譯。
獲取三個目錄apollo-adminservice apollo-configservice apollo-portal 下的target文件下的zip文件。放入創建好的dev/adminservice dev/configservice 目錄下並解壓。portal 只需放在一個目錄 下。
6首先啟動portal
首先在config目錄下修改application-github.properties文件相關mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
然后修改apollo-env.properties中各個環境注冊中心的服務地址
dev.meta=http://localhost:8080 fat.meta=http://localhost:8180
然后點擊script目錄下startup.sh啟動。
7啟動dev環境
7.1首先啟動adminservcie,首先修改config目錄下application-github.properties文件中mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_DEV?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
修改script目錄下start.sh中關於端口SERVER_PORT=8090。
點擊script目錄下start.sh啟動。
7.2然后啟動configservice,首先修改config目錄下application-github.properties文件中mysql配置
修改script目錄下start.sh中關於端口SERVER_PORT=8080。
點擊script目錄下start.sh啟動。
8啟動fat環境
8.1首先啟動adminservice,首先修改config目錄下application-github.properties文件中mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_FAT?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
修改script目錄下start.sh中關於端口SERVER_PORT=8190。
點擊script目錄下start.sh啟動。
8.2然后啟動configservice,首先修改config目錄下application-github.properties文件中mysql配置
修改script目錄下start.sh中關於端口SERVER_PORT=8180。
點擊script目錄下start.sh啟動。
9.啟動成功后,通過8070端口可以看到如下畫面,環境列表中出現了兩個。
在dev環境中加入配置test->apollodev,fat環境中加入test->apollofat,通過切換不同的環境可以得到不同的值。
參考自apollo官方文檔
https://github.com/ctripcorp/apollo