前面我們一起通過jar包以及源碼的方式進行了單env環境的搭建,那種方式只支持一種環境(environment),就是dev,如果我們要支持多個環境(以下簡稱env),這種部署還需要再改進才行,這篇文章我們一起來進行多env環境搭建
一、Apollo項目結構介紹
前面介紹過Apollo項目服務端包含的三個服務:
- 配置提供服務(config),使用config庫,負責指定環境(env)配置的推送、獲取,向客戶端(業務項目)提供服務,間接接受來自admin的調用 另內置eurka提供該環境所有config和admin的注冊功能以提供多節點部署 高可用
- 配置管理服務(admin),使用config庫,負責指定環境(env)配置的修改、發布、歷史記錄,主要向portal提供服務,通過數據庫間接調用config服務
- 配置更新服務(portal),使用portal庫,負責配置中心的頁面渲染,功能提交,協調各環境(env)進行配置的修改、發布,調用admin服務
有人說,很多人都說,官方也說 Apollo核心是四個服務,還有一個客戶端,現在我們從服務端的角度來講環境搭建,暫時忽略客戶端,請大家見諒,后面我們討論springboot整合Apollo實現配置的時候再仔細說客戶端(client)
通過以上三個服務,我們很明顯能看出,一個config和admin,使用同一個庫,負責一個環境(env),而portal這個服務是全局唯一的,在啟動的時候需要指定它來管理哪些環境的config和admin,一張圖表示如下
----> dev環境 admin服務 <---->config服務
portal ----> sit環境 admin服務 <---->config服務
----> uat環境 admin服務 <---->config服務
portal啟動時必須通過啟動參數 -Ddev_meta=http://xxdevxx:port -Dsit_meta=http://xxsitxx:port -Duat_meta=http://xxuatxx:port來指定當前配置中心portal所能管理的幾個環境,配置后面的鏈接為該環境(env)的eurka注冊中心的鏈接(eurka默認集成在config服務中,即config服務的鏈接)
並且在portal庫的serverconfig表中修改apollo.portal.envs參數的值為dev,sit,uat
當你在后台管理系統(portal)中打開一個環境(env)時,portal會通過該env找到對應的meta配置的admin服務地址,調用該admin服務讀取數據庫里保存的集群、命名空間以及具體配置信息,返回前端后進行頁面渲染
這個過程可概括如下 前端 --> portal --> eurka --> admin --> 讀取db 然后原路返回
當你在后台管理系統(portal)中的某個環境(env)中,提交或者修改了一項配置,portal會通過該env找到對應的meta配置的admin服務地址,調用該admin服務進行配置的提交修改,並將修改結果返回前端
當你******,發布配置的時候,portal******,調用該admin服務的發布配置接口,admin服務會在config庫中寫一條記錄,然后返回結果到前端。此時config服務有一個線程會定時讀取庫中是否有新記錄,讀取到記錄后通知所有和自己有注冊關系的客戶端(client)來更新配置,由此實現發布配置后,客戶端配置的自動更新
綜上所述,當我們部署多環境的時候,每個環境(env)必須有自己單獨的數據庫,用於存放該環境的所有配置、發布記錄信息,也必須有配套的admin和config服務,如果要部署五個環境,就需要五個數據庫,每個數據庫對應啟動一套admin和config服務,即至少2*5個服務,可以參考上面那個簡易的圖來理解
二、多環境部署
這里我們用idea通過源碼的方式進行多環境部署,本示例我們部署三個環境dev、sit、uat
1.創建三個環境的數據庫
每個環境必須有自己單獨的數據庫,所以需要創建三個,可以是不同的數據庫實例,也可以在同一實例下創建,這里我們在同一個實例下進行
打開scripts/sql目錄下的兩個sql腳本文件,復制其中的內容到數據庫管理工具中
apolloportaldb這個腳本可以直接運行,創建一個portal的庫
修改apolloconfigdb這個腳本最前面的兩個sql語句,自定義數據庫名稱用於區分各環境,每修改一次,就全部執行一次腳本
# 修改前為這樣 CREATE DATABASE IF NOT EXISTS ApolloConfig DEFAULT CHARACTER SET = utf8mb4; Use ApolloConfig; # 修改后為這樣 CREATE DATABASE IF NOT EXISTS ApolloConfigDev DEFAULT CHARACTER SET = utf8mb4; Use ApolloConfigDev;
上面代碼舉例為dev環境下的config庫創建,其他環境的按照同樣的方法進行創建。
創建好數據庫會看到數據庫實例中多了四個庫,分別為:ApolloConfigDev、ApolloConfigSit、ApolloConfigUat、ApolloPortal
2.創建三個環境的啟動程序
dev環境啟動程序config和admin創建如下:
點擊idea右上方run/debug config面板
點擊+號新增一個springboot啟動程序,main class選擇ConfigServiceApplication,name命名為configServiceDev,VM options中指定服務監聽端口以及使用的數據庫信息
-Dserver.port=8081 -Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdev?characterEncoding=utf8&serverTimezone=Asia/Shanghai -Dspring.datasource.username=root -Dspring.datasource.password=1234
點擊+號新增一個springboot啟動程序,main class選擇AdminServiceApplication,name命名為adminServiceDev,VM options中指定服務監聽端口以及使用的數據庫信息
-Dserver.port=8091
-Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloconfigdev?characterEncoding=utf8&serverTimezone=Asia/Shanghai
-Dspring.datasource.username=root
-Dspring.datasource.password=1234
這樣dev環境的兩個主要的啟動程序就已經創建完成
其他兩個環境按照同樣的方法進行創建,但是數據庫應該讀自己環境的數據庫,分別為apolloconfigsit、apolloconfiguat,並且name應該進行區別化命名,建議為configServiceSit、adminServiceSit、configServiceUat、adminServiceUat,端口分別為8082,8092,8083,8093
3.創建portal啟動程序
由於portal是管理每個環境的一個后台管理系統,所以portal在運行的時候需要指定自己所管理的各個環境的eurka注冊中心地址,這樣portal才能通過注冊中心調用相應的admin服務進行配置的修改、發布等操作
點擊idea右上方run/debug config面板
點擊+號新增一個springboot啟動程序,main class選擇PortalApplication,name命名為portal
然后在VM options后面添加各個環境的注冊中心地址配置
-Ddev_meta=http://localhost:8081 -Dsit_meta=http://localhost:8082 -Duat_meta=http://localhost:8083
-Dspring.datasource.url=jdbc:mysql://localhost:3306/apolloportal?characterEncoding=utf8&serverTimezone=Asia/Shanghai
-Dspring.datasource.username=root
-Dspring.datasource.password=1234
4.修改數據庫的相關配置
因為我們自定義了三個環境的config和admin兩個服務的端口,會導致程序啟動時從數據庫讀取注冊中心地址后,進行服務注冊時失敗,所以要修改數據庫中的注冊中心地址配置,因為數據庫中默認的注冊中心配置為http://localhost:8080 而我們實際是 dev注冊中心(即dev的config服務):http://localhost:8081,sit....:http://localhost:8082,uat....:http://localhost:8083
打開dev環境的數據庫ApolloConfigDev,修改serverconfig表的eureka.service.url參數,將端口改為8081
按照此方法依次將sit和uat的這一個參數改為8082,8083
以上就修改了各個環境的注冊中心地址配置,這里還沒有完,還需要將portal服務所支持的環境配置也進行修改
portal服務默認只支持dev,在自己的數據庫(portal庫)serverconfig表的apollo.portal.envs參數,將配置修改為dev,sit,uat
做完這些,數據庫的相關配置就修改完成了
5.啟動服務
按照先config后admin的順序依次啟動各個環境的所有6個服務
最后再啟動portal服務
全部啟動完成后打開瀏覽器訪問http://localhost:8070登錄后即可看到支持多環境的Apollo配置中心
你可以選擇新建一個項目(application),然后在各個數據庫中檢查,看看項目是由哪個庫負責管理的,再創建一個集群(cluster)看看誰在管理,再創建一個(namespace)看看誰在管理,最后再新增幾個配置,然后再發布配置,都看看是哪個庫在進行這些功能的管理,這對理解Apollo的配置的四個維度有很大幫助
下篇文章我們一起看下springboot如何通過Apollo配置中心實現配置集中管理和自動刷新