1. 概述
Apollo 算國内開源中間件,文檔完善程度最好的産品,可能唯一能夠比肩的隻有 Dubbo 的文檔了。
1.1 介紹
Apollo 是什麼?其官方文檔自我介紹如下:
FROM 《Apollo 設計文檔 —— Home》
Apollo(阿波羅)是攜程架構部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,并且具備規範的權限、流程治理等特性,适用于微服務配置管理場景。
服務端基于 Spring Boot 和 Spring Cloud 開發,打包後可以直接運作,不需要額外安裝 Tomcat 等應用容器。
Java 用戶端不依賴任何架構,能夠運作于所有 Java 運作時環境,同時對 Spring/Spring Boot 環境也有額外支援。
.Net 用戶端不依賴任何架構,能夠運作于所有 .Net 運作時環境。
1.2 核心功能
Apollo 有哪些功能?其官方文檔自我介紹如下:
- 統一管理不同環境、不同叢集的配置
- 配置修改實時生效(熱釋出)
- 版本釋出管理
- 灰階釋出
- 權限管理、釋出稽核、操作審計
- 用戶端配置資訊監控
- 提供 Java 和 .Net 原生用戶端
- 提供開放平台 API
- 部署簡單
詳細的功能說明,胖友可以通路 《Apollo 功能清單》 檢視。
2. 單機部署
作業系統:macOS 10.14
其它系統,基本一緻的。
本小節,參考《Apollo 部署文檔 —— 分布式部署指南》和《Apollo 部署文檔 —— Quick Start》文章,我們來單機部署一個 Apollo 服務。如下圖所示:
- Apollo Config Service:提供配置的讀取、推送等功能,服務對象是 Apollo 用戶端。
- Apollo Admin Service:提供配置的修改、釋出等功能,服務對象是Apollo Portal(管理界面)。
為什麼 Config Service 和 Admin Service 分離呢?在圖中,我們可以看到 Config Service 和 Admin Service 讀取的是相同的
ApolloPortalDB
資料庫,理論上來說可以做成一個服務。
不過 Admin Service 因為需要不斷開發 API 接口提供給 Apollo Portal,是以可能會不定期重新開機。而 Config Service 功能比較單純,基本不會有太多更新,是以基本不太會重新開機。是以,将 Admin Service 和 Config Service 拆分成兩個服務。
- Apollo Portal:Apollo 的管理界面,進行配置想丢該,服務對象是開發者和 開放平台 API。
為什麼 Admin Service 和 Portal 分離呢?在 Apollo 的設計中,不同的 DEV、FAT、UAT、PROD 環境,會部署在不同的網絡環境下,進行隔離。
是以,每個環境會部署一套 Admin Service + Config Service。而 Portal 通過調用不同環境部署的 Admin Service 提供的 API 接口,進行不同環境的配置管理。
另外,權限管理、開放平台 API 都是由 Portal 統一實作來提供的。
2.1 MySQL 安裝
相信大家都會,艿艿就不瞎哔哔了。嘿嘿~注意,推薦安裝 MySQL 5.6.5 以上版本,因為 Apollo 的表結構
timestamp
使用了多個
default
聲明。例如說,艿艿采用的是 MySQL 8.0.17 版本。
- 注 1:MySQL版本可以降級到5.5,詳見mysql 依賴降級讨論。
- 注 2:如果希望使用 Oracle 的話,可以參考 vanpersl 在 Apollo 0.8.0 基礎上開發的 Oracle适配代碼,Oracle版本為 10.2.0.1.0。
- 注 3:如果希望使用 Postgres 的話,可以參考 oaksharks 在 Apollo 0.9.1 基礎上開發的 Pg适配代碼,Postgres 的版本為 9.3.20,也可以參考 xiao0yy 在 Apollo 0.10.2 基礎上開發的 Pg适配代碼,Postgres的版本為 9.5。
2.2 Portal 安裝
① 下載下傳 Apollo
打開 Apollo 下載下傳頁面,選擇想要的 Apollo 版本。這裡,我們選擇
1.5.0
最新版本。
# 建立目錄
$ mkdir -p /Users/yunai/Apollo
$ cd /Users/yunai/Apollo
# 下載下傳
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.5.0/apollo-portal-1.5.0-github.zip
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.5.0/apollo-adminservice-1.5.0-github.zip
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.5.0/apollo-configservice-1.5.0-github.zip
# 先隻看 Portal 相關
# 解壓到 apollo-portal 目錄
$ unzip apollo-portal-1.5.0-github.zip -d apollo-portal
$ cd apollo-portal
# 檢視目錄
$ ls -ls
2312 -rwxr-xr-x 1 yunai staff 1183431 Oct 19 18:17 apollo-portal-1.5.0-sources.jar # 源碼
82704 -rwxr-xr-x 1 yunai staff 42342050 Oct 19 18:17 apollo-portal-1.5.0.jar # jar 包
8 -rw-r--r-- 1 yunai staff 57 Feb 24 2019 apollo-portal.conf
0 drwxr-xr-x 5 yunai staff 160 Jan 25 12:34 config # 配置檔案
0 drwxr-xr-x 4 yunai staff 128 Mar 1 2019 scripts # 執行腳本
② 初始化資料庫
使用 apolloportaldb.sql 腳本,在 MySQL 中初始化
ApolloPortalDB
庫。結果如下圖:
③ 配置資料庫連接配接
修改
conf/application-github.properties
配置檔案,設定成
ApolloPortalDB
資料庫的資訊。配置内容如下:
# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password =
④ 配置 Apollo 環境
在上文中,我們提到過不同環境下,我們會配置不同的 Config Service + Admin Service 服務。是以,我們需要修改
config/apollo-env.properties
,設定對應服務的位址。配置内容如下:
local.meta=http://localhost:8080
dev.meta=http://127.0.0.1:8080
fat.meta=http://fill-in-fat-meta-server:8080
uat.meta=http://fill-in-uat-meta-server:8080
lpt.meta=${lpt_meta}
pro.meta=http://fill-in-pro-meta-server:8080
預設情況下,我們隻需要配置 DEV 環境的,因為在
ServerConfig
表中,隻配置了 Portal 支援的環境清單為 DEV 環境。如下圖所示:
這裡,我們隻設定了
dev.meta
配置項為
http://127.0.0.1:8080
,也就是我們後續會啟動的 DEV 環境的 Config Service 位址。
另外,配置檔案中的
meta
指的是 Apollo Meta Server,其官方文檔解釋如下:
FROM 《系統使用文檔 —— Java用戶端使用指南》
Apollo支援應用在不同的環境有不同的配置,是以需要在運作提供給Apollo用戶端目前環境的 Apollo Meta Server 資訊。預設情況下,meta server 和 config service 是部署在同一個 JVM 程序,是以 meta server 的位址就是 config service 的位址。
為了實作 meta server 的高可用,推薦通過 SLB(Software Load Balancer)做動态負載均衡。Meta server 位址也可以填入 IP,如
,不過生産環境還是建議使用域名(走 slb),因為機器擴容、縮容等都可能導緻 IP 清單的變化。
http://1.1.1.1:8080,http://2.2.2.2:8080
- 簡單來說,我們可以把 Apollo Meta Server 當成注冊中心,通過它可以獲得到所有 Admin Service 和 Config Service 的位址。不過要注意哈,Meta Server 也是一個環境對應一個。
⑤ 啟動 Portal 服務
執行
sh scripts/startup.sh
指令,啟動 Portal 服務。操作指令如下:
$ sh scripts/startup.sh
Sat Jan 25 19:06:35 CST 2020 ==== Starting ====
Started [47441]
Waiting for server startup...
Sat Jan 25 19:06:50 CST 2020 Server started in 15 seconds!
另外,我們可以在
/opt/logs/100003173
目錄下,檢視到對應的 Portal 服務的日志。不過,因為此時我們并未啟動 DEV 服務的 Config Service,是以在
/opt/logs/100003173/apollo-portal.log
日志檔案中,會報如下異常:
2020-01-25 19:12:59.943 ERROR 47688 --- [Apollo-EnvHealthChecker-1] c.c.f.a.portal.component.PortalSettings : Env is down. env: DEV, failed times: 3, meta server address: http://127.0.0.1:8080
- 這個問題不大,暫時忽略即可。
⑥ 通路 Portal 服務
使用浏覽器,通路 http://127.0.0.1:8070 位址,進入 Portal 管理界面的登陸頁。如下圖所示:
使用預設賬号「apollo/admin」進行登陸。登陸完成後,進入首頁。如下圖所示:
稍後,我們在使用 Portal 進行配置的建立等操作,先繼續搭建 Config Service 和 Admin Service 服務。注意,這裡我們是搭建的 DEV 環境的 Config Service + Admin Service 服務噢。
2.3 Config Service 安裝
① 解壓 Config Service
# 進入 Apollo 目錄
$ cd /Users/yunai/Apollo
# 解壓到 apollo-config 目錄
$ unzip apollo-configservice-1.5.0-github.zip -d apollo-configservice
$ cd apollo-configservice
# 檢視目錄
$ ls -ls
80 -rwxr-xr-x 1 yunai staff 40252 Oct 19 18:17 apollo-configservice-1.5.0-sources.jar # 源碼
121080 -rwxr-xr-x 1 yunai staff 61991599 Oct 19 18:17 apollo-configservice-1.5.0.jar # jar 包
8 -rw-r--r-- 1 yunai staff 57 Feb 24 2019 apollo-configservice.conf
0 drwxr-xr-x 4 yunai staff 128 Aug 6 09:00 config # 配置檔案
0 drwxr-xr-x 4 yunai staff 128 Jan 25 20:33 scripts # 執行腳本
② 初始化資料庫
使用 apolloconfigdb.sql 腳本,在 MySQL 中初始化
ApolloConfigDB
庫。結果如下圖:
③ 配置資料庫連接配接
修改
conf/application-github.properties
配置檔案,設定成
ApolloConfigDB
資料庫的資訊。配置内容如下:
# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password =
④ 啟動 Config Service 服務
執行
sh scripts/startup.sh
指令,啟動 Config Service 服務。操作指令如下:
$ sh scripts/startup.sh
Sat Jan 25 22:31:41 CST 2020 ==== Starting ====
Started [50317]
Waiting for server startup....
Sat Jan 25 22:32:02 CST 2020 Server started in 20 seconds!
另外,我們可以在
/opt/logs/100003171
目錄下,檢視到對應的 Portal 服務的日志。不過,因為此時我們并未啟動 DEV 服務的 Config Service,是以在
/opt/logs/100003171/apollo-configservice.log
日志檔案中。
此時,如果我們看下
/opt/logs/100003173/apollo-portal.log
日志檔案,已經不會報錯了。
⑤ 通路 Meta Server 服務
使用浏覽器,通路 http://127.0.0.1:8080 位址,進入 Meta Server 首頁。可以看到 Config Service 注冊到其上,如下圖所示:
因為 Apollo Meta Server 是基于 Eureka 注冊中心實作,是以看到的是 Eureka 界面。
2.4 Admin Service 安裝
① 解壓 Config Service
# 進入 Apollo 目錄
$ cd /Users/yunai/Apollo
# 解壓到 apollo-config 目錄
$ unzip apollo-adminservice-1.5.0-github.zip -d apollo-adminservice
$ cd apollo-adminservice
# 檢視目錄
$ ls -ls
56 -rwxr-xr-x 1 yunai staff 25994 Oct 19 18:17 apollo-adminservice-1.5.0-sources.jar # 源碼
113984 -rwxr-xr-x 1 yunai staff 58358563 Oct 19 18:17 apollo-adminservice-1.5.0.jar # jar 包
8 -rw-r--r-- 1 yunai staff 57 Feb 24 2019 apollo-adminservice.conf
0 drwxr-xr-x 4 yunai staff 128 Feb 24 2019 config # 配置檔案
0 drwxr-xr-x 4 yunai staff 128 Mar 1 2019 scripts # 執行腳本
② 配置資料庫連接配接
因為我們在安裝 Config Service 時,已經初始化了
ApolloConfigDB
資料庫,是以無需重新初始化。
修改
conf/application-github.properties
配置檔案,設定成
ApolloConfigDB
資料庫的資訊。配置内容如下:
# DataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password =
④ 啟動 Admin Service 服務
執行
sh scripts/startup.sh
指令,啟動 Admin Service 服務。操作指令如下:
$ sh scripts/startup.sh
Sat Jan 25 23:30:06 CST 2020 ==== Starting ====
Started [51526]
Waiting for server startup
Sat Jan 25 23:30:06 CST 2020 Server started in 0 seconds!
另外,我們可以在
/opt/logs/100003172
目錄下,檢視到對應的 Portal 服務的日志。不過,因為此時我們并未啟動 DEV 服務的 Config Service,是以在
/opt/logs/100003172/apollo-adminservice.log
日志檔案中。
⑤ 通路 Meta Server 服務
使用浏覽器,通路 http://127.0.0.1:8080 位址,進入 Meta Server 首頁。可以看到 Admin Service 也注冊到其上,如下圖所示:
2.5 使用指南
參考《Apollo 開發文檔 —— Apollo 使用指南》文章,我們來建立一個 Apollo 項目,并添加該項目的配置,最終進行一次配置的釋出。
① 建立項目(應用)
使用浏覽器,打開 http://127.0.0.1:8070/ 位址,通路 Portal 首頁。如下圖所示:
點選「建立項目」按鈕,進入「建立項目」界面。按照自己想要建立的項目資訊進行填寫,例如艿艿輸入如下資訊:
- 部門:選擇應用所在的部門。部門資料來自
庫的ApolloPortalDB
表的ServerConfig
對應的記錄。Key = organizations
- 應用 AppId:用來辨別應用身份的唯一 id,格式為 string,需要和用戶端
中配置的app.properties
對應。app.id
- 應用名稱:應用名,僅用于界面展示。
- 應用負責人:預設具有項目管理者權限。
- 項目管理者:可以建立 Namespace 和叢集、配置設定使用者權限。
點選「送出」按鈕,完成項目的建立。建立成功後,自動跳轉到該項目的首頁。如下圖所示:
② 新增配置項
點選右上角的「新增配置」按鈕,彈出「添加配置項」的視窗。按照自己想要建立的配置項進行填寫,例如艿艿輸入如下資訊:
點選「送出」按鈕,完成配置項的建立。此時該項目的界面如下圖:
③ 釋出配置
點選右上角的「釋出」按鈕,彈出「釋出」的視窗。如下圖所示:
點選「釋出」按鈕,完成配置的釋出。此時該項目的界面如下圖:
至此,我們完成了一次配置的釋出。更多 Apollo 的使用指南,推薦詳細閱讀下《Apollo 開發文檔 —— Apollo 使用指南》文章。
3. 叢集部署
在生産環境下,我們需要搭建 Apollo 叢集,確定高可用。因為《Apollo 部署文檔 —— 分布式部署指南》已經編寫詳細的教程,艿艿就不重複贅述。
不喜歡看文章,想要看視訊的胖友,可以通路分布式配置中心 Apollo 極簡入門位址,檢視視訊教程。
相比「2. 單機部署」來說,我們需要額外做的事情:
- 搭建 Portal 多個節點,實作 Portal 的高可用。
- 搭建 FAT、UAT、PROD 的 Config Service + Admin Service。并且,每個環境的 Config Service + Admin Service 都需要部署多個節點,保證它們的高可用。另外,在每個環境的
資料庫的ApolloConfigDB
表的ServerConfig
對應記錄的KEY = eureka.service.url
為對應環境的 Config Service 的所有節點的位址。Value
- 搭建 Nginx 多個節點,實作 Nginx 的高可用。後續,對 Portal 和 Config Service(Meta Server)進行負載均衡。
- 搭建 MySQL 多節點,實作 MySQL 的高可用。
搭建完多環境的 Config Service + Admin Service 之後,需要在 Portal 中進行如下設定,使 Portal 可以對對應環境可以進行配置管理:
- 在 Portal 的
配置檔案,需要 DEV、FAT、UAT、PROD 經過 Nginx 負載均衡後的 Meta Server 高可用的位址。config/apollo-env.properties
- 同時,修改
資料庫的ApolloPortalDB
表的ServerConfig
對應記錄的KEY = apollo.portal.envs
為Value
,進而開啟多環境的支援。dev,fat,uat,prod
4. 內建到 Spring Boot
詳細内容,可見《Spring Boot 配置中心 Apollo 入門》文章。
5. 內建到 Spring Cloud
詳細内容,可見《Spring Cloud 配置中心 Apollo 入門》文章。