天天看點

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

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 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud
  • 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

 庫。結果如下圖:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

③ 配置資料庫連接配接

修改 

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 環境。如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

這裡,我們隻設定了 

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,如 

http://1.1.1.1:8080,http://2.2.2.2:8080

,不過生産環境還是建議使用域名(走 slb),因為機器擴容、縮容等都可能導緻 IP 清單的變化。
  • 簡單來說,我們可以把 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 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

使用預設賬号「apollo/admin」進行登陸。登陸完成後,進入首頁。如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

稍後,我們在使用 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

 庫。結果如下圖:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

③ 配置資料庫連接配接

修改 

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 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

因為 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 也注冊到其上,如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

2.5 使用指南

參考《Apollo 開發文檔 —— Apollo 使用指南》文章,我們來建立一個 Apollo 項目,并添加該項目的配置,最終進行一次配置的釋出。

① 建立項目(應用)

使用浏覽器,打開 http://127.0.0.1:8070/ 位址,通路 Portal 首頁。如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

點選「建立項目」按鈕,進入「建立項目」界面。按照自己想要建立的項目資訊進行填寫,例如艿艿輸入如下資訊:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud
  • 部門:選擇應用所在的部門。部門資料來自 

    ApolloPortalDB

     庫的 

    ServerConfig

     表的 

    Key = organizations

     對應的記錄。
  • 應用 AppId:用來辨別應用身份的唯一 id,格式為 string,需要和用戶端 

    app.properties

     中配置的 

    app.id

     對應。
  • 應用名稱:應用名,僅用于界面展示。
  • 應用負責人:預設具有項目管理者權限。
  • 項目管理者:可以建立 Namespace 和叢集、配置設定使用者權限。

點選「送出」按鈕,完成項目的建立。建立成功後,自動跳轉到該項目的首頁。如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

② 新增配置項

點選右上角的「新增配置」按鈕,彈出「添加配置項」的視窗。按照自己想要建立的配置項進行填寫,例如艿艿輸入如下資訊:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

點選「送出」按鈕,完成配置項的建立。此時該項目的界面如下圖:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

③ 釋出配置

點選右上角的「釋出」按鈕,彈出「釋出」的視窗。如下圖所示:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

點選「釋出」按鈕,完成配置的釋出。此時該項目的界面如下圖:

Apollo 極簡入門1. 概述2. 單機部署3. 叢集部署4. 內建到 Spring Boot5. 內建到 Spring Cloud

至此,我們完成了一次配置的釋出。更多 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

     對應記錄的 

    Value

     為對應環境的 Config Service 的所有節點的位址。
  • 搭建 Nginx 多個節點,實作 Nginx 的高可用。後續,對 Portal 和 Config Service(Meta Server)進行負載均衡。
  • 搭建 MySQL 多節點,實作 MySQL 的高可用。

搭建完多環境的 Config Service + Admin Service 之後,需要在 Portal 中進行如下設定,使 Portal 可以對對應環境可以進行配置管理:

  • 在 Portal 的 

    config/apollo-env.properties

     配置檔案,需要 DEV、FAT、UAT、PROD 經過 Nginx 負載均衡後的 Meta Server 高可用的位址。
  • 同時,修改 

    ApolloPortalDB

     資料庫的 

    ServerConfig

     表的 

    KEY = apollo.portal.envs

     對應記錄的 

    Value

     為 

    dev,fat,uat,prod

    ,進而開啟多環境的支援。

4. 內建到 Spring Boot

詳細内容,可見《Spring Boot 配置中心 Apollo 入門》文章。

5. 內建到 Spring Cloud

詳細内容,可見《Spring Cloud 配置中心 Apollo 入門》文章。

繼續閱讀