配置服務 apollo 部署實踐
前言
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
- github 地址: ofollow,noindex" target="_blank">https://github.com/ctripcorp/apollo
- 服務端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需要額外安裝Tomcat等應用容器
- Java客戶端不依賴任何框架,能夠運行於所有Java執行時環境,同時對Spring/Spring Boot環境也有較好的支援
- .Net客戶端不依賴任何框架,能夠運行於所有.Net執行時環境
- 以上摘抄自官方文件,該框架目前已達 9000 多個 star,而且目前已經支援了 .netcore 客戶端
安裝
伺服器環境安裝檢查
由於本次是按照正式環境來模擬一次部署,所以,按照官方指引,正式環境部署並不建議使用 Quick Start;接下來開啟官方“分散式部署”指引文件: https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97
- 首先是檢查伺服器是否安裝了 Java 環境,在伺服器輸入 java -version
- 可以看到,服務已經安裝,如果沒有安裝,這輸入 yum install java-1.8.0-openjdk(本次使用的伺服器為 Centos 7.0)。
資料庫檢查
官方要求資料庫為 SQL/">MySQL,版本要求:5.6.5+,我在這裡使用了 MariaDB 10.3,效果相同,安裝好資料庫後,下載官方 SQL 檔案,執行,建立 apollo 所需的資料庫。資料庫檔案一共有兩個
- ApolloPortalDB 地址: https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sql 這個是 Portal 資料庫,可以用來做各種環境的統一管理
- ApolloConfigDB 地址: gdb.sql" rel="nofollow,noindex" target="_blank">https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql 這是“配置”儲存資料庫,每個環境應該單獨部署一份,比如 開發、測試、產品 環境,應該每個環境部署一份,因為各自環境的配置內容是不同的
- 為了方便,我現在把兩個資料庫都安裝在本地,安裝好資料庫檔案後,進入 ApolloConfigDB 通過執行 SQL 命令,進行檢查
- ApolloPortalDB 同理,可以看到,資料庫已經成功安裝
安裝服務和 web 管理控制檯
服務一共有 3 個例項,都從這裡下載: https://github.com/ctripcorp/apollo/releases,我直接下載作者編譯好的 zip 檔案
下面簡單介紹各個服務以及用途
-
apollo-configservice apollo 配置檔案服務,該服務直接對外提供服務,同時需要在 portal 進行元資料註冊,下面修改該服務的資料庫配置檔案。
修改配置檔案 /apollo-configservice-1.1.2/config/application-github.properties 為剛才資料庫的配置
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloConfigDB?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = root
- apollo-adminservice-1.1.2 web 管理服務,同樣修改其配置檔案 apollo-adminservice-1.1.2/config/application-github.properties 為 ApolloConfigDB 資料庫的地址,同上。
- apollo-portal-1.1.2 元資料服務,修改配置檔案 apollo-portal-1.1.2/config/application-github.properties,注意,這裡的資料必須為 ApolloPortalDB ,如下:
spring.datasource.url = jdbc:mysql://127.0.0.1:3406/ApolloPortalDB?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = root
- 最後,還需要修改 apollo-portal-1.1.2/config/apollo-env.properties 檔案,將 configservice 都註冊到 portalservice 中
local.meta=http://localhost:8080 dev.meta=http://172.16.1.220:8080 fat.meta=http://172.16.1.220:8080 uat.meta=http://172.16.1.220:8080 lpt.meta=${lpt_meta} pro.meta=http://172.16.1.227:8080
啟動和修改配置
在上面做好三個服務端配置後,下面我們就可以逐一的啟動各個服務了,各自服務端監聽埠都位於 xxx/scripts/startup.sh 中
- 執行 sh apollo-configservice-1.1.2/scripts/startup.sh 啟動 config 服務,監聽埠預設:8080
- 執行 sh apollo-portal-1.1.2/scripts/startup.sh 啟動 portal 服務,監聽埠預設:8070
- 執行 sh apollo-adminservice-1.1.2/scripts/startup.sh 啟動 admin 服務,監聽埠預設:8090
如果輸出看到以上三個服務都輸出資訊為,證明服務啟動成功
Waiting for server startup.... Mon Nov 19 11:07:15 CST 2018 Server started in 20 seconds!
- 通過檢視 cat apollo-adminservice-1.1.2/scripts/startup.sh 得知,該服務監聽埠為 8070,開啟瀏覽器,輸入地址: http://localhost:8090,看到了如下介面
- 輸入預設賬號密碼:apollo/admin 登入 web 控制檯進行檢視。
- 為了方便演示,首先建立一個專案 webapplication1
- 進入 webapplication1,
- 點選左側按鈕“新增Namespace”,建立一個公共的名稱空間,取名為:common
- 建立成功,返回專案主頁
- 在 dotnet.versin 名稱空間下點選“新增配置”按鈕,增加一個配置節點
- 建立完成後,可以看到,該節點狀態為 “未釋出”
- 點選該名稱空間下的“釋出”按鈕,將其進行釋出
- 使用以上方法,在預設的名稱空間“application” 下也建立一個名為“connectionstring" 的節點,同樣將其釋出
- 此時,恭喜你,已完成伺服器部署釋出,接下來,我們通過建立一個 web 應用程式訪問該配置服務
客戶端訪問
- 首先建立 web 專案,完成後在 nuget 包管理器上引用 apollo 的 .netcore 客戶端 Com.Ctrip.Framework.Apollo.Configuration
- 開啟 Program.cs 檔案,將剛才在 apollo 服務上建立的名稱空間加入到管道中
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var hostBuilder = WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureAppConfiguration((context, builder) => { builder.AddApollo(builder.Build().GetSection("apollo")) .AddDefault() .AddNamespace("dotnet.version") .AddNamespace("application"); }); return hostBuilder; }
- 以上程式碼中有一個方法 AddApollo ,這裡傳入了本地配置檔案節點 builder.Build().GetSection("apollo"),其配置如下
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "apollo": { "AppId": "webapplication1", "MetaServer": "http://172.16.1.220:8080" } }
- AppId 對於 我們建立的在 apollo web 控制檯上建立的專案ID webapplication1,元資料服務指向 8080 埠,正是 configservice 的監聽埠
- 在 HomeController 的操作 Action 中,獲取配置節點,並輸出到客戶端
public IActionResult Index() { this.ViewBag.ConnectionString = this.cfg["connectionstring"]; this.ViewBag.LastVersion = this.cfg["last-version"]; return View(); }
- 啟動專案,可以看到
- 至此,測試完成
結語
- apollo 專案官方部署指引非常複雜,原因就在於整個官方文件都是大片大片的文字進行鋪排,聖人說:看圖就會,見字想睡,本文希望通過自己的測試能幫助更多想應用 apollo 配置管理服務的朋友
- 注意,安裝完成預設只有 DEV 配置環境,如果需要增加環境,可直接修改資料庫 apolloportaldb.serverconfig 表,欄位名稱為 apollo.portal.envs 的列值,多個環境以逗號分隔,儲存,重啟服務即可