問題
由於最近公司要弄灰度發佈,所以需要添加一套Apollo配置,默認是可以管理 dev, fat, uat, pro四套環境,但是我們想自定義一下環境,所以就嘗試一下自定義環境,需要自己修改源碼然後自己編譯打包
如果默認的四套環境能夠滿足自己需求,就可以直接使用官網提供的包,我們只需修改數據庫配置和環境信息即可使用
下載地址:https://github.com/ctripcorp/apollo/releases(自己定製的不需要下載)
使用目前最新版本 apollo-1.1.2
環境準備
- Java環境,JDK1.8或者以上(剛需)
- Mysql數據庫,版本5.6.5以上(剛需)
- 下載Apollo源碼:https://github.com/ctripcorp/apollo(自己定製的需要下載)
數據庫準備
執行SQL語句,創建數據庫
(portal庫只需要創建一個,因爲一個portal可以管理多個config,config數據庫需要建立多個,因爲一套環境需要一個獨立的數據庫,所以創建config庫的時候,要去腳本修改數據庫名稱,圖2是建好之後的數據庫)
修改數據庫配置
- 修改 portal 庫的 ServerConfig 表,默認只管理 dev,可配置多套環境,逗號隔開
- 修改 config 庫的 ServerConfig 表,修改端口號,由於默認是8080,但是我需要在一臺機器上部署多個config,所以修改端口號避免衝突,也便於管理(此處演示的是 dev,是系統默認自帶的環境dev,uat,fat,pro之一,所以只演示一個)
- 修改自定義環境的 config 庫的 ServerConfig 表,修改和上面操作一樣
修改源碼(自己定製的需要,不定製的可忽略)
修改的時候最好導入到 idea 裏面操作,這樣會很方便,而且還便於後續測試,也便於看源碼
- 假設需要添加的環境名稱叫 beta
- 修改com.ctrip.framework.apollo.core.enums.Env類,在其中加入
BETA
枚舉: - 修改com.ctrip.framework.apollo.core.enums.EnvUtils類,在其中加入
BETA
枚舉的轉換邏輯: - 修改apollo-env.properties,增加
beta.meta
佔位符: - 修改com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider類,增加讀取
BETA
環境的meta server地址邏輯:
修改打包腳本(自己定製的需要,不定製的可忽略)
此處去除了 config 的數據庫連接配置,因爲不同環境對應的數據庫不同,所以打包後修改配置文件即可
開始打包(自己定製的需要,不定製的可忽略)
由於第一次編譯打包會下載很多文件,所以會比較慢,建議連接 阿里的中央倉庫,速度會快很多,在mirrors節點下添加
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
修改好配置之後,雙擊 build.bat 開始打包,等待幾分鐘,控制檯最後會提示打包完成
然後找到 admin、config、portal 對應的.zip包,然後再解壓,修改配置,再上傳到服務器,就可以部署我們的 apollo 服務了
修改配置 Portal
- apollo-portal-1.1.2-github\scripts\startup.sh 修改端口號,自定義,只要不衝突就行
- apollo-portal-1.1.2-github\config\application-github.properties portal 數據庫配置(打包時已輸入,則此處無需修改)
- apollo-portal-1.1.2-github\config\apollo-env.properties portal管理的環境配置(打包時已輸入,則此處無需修改)
修改配置 Config(以dev爲例,每個環境都是一樣的)
- apollo-configservice-1.1.2-dev\scripts\startup.sh 修改端口號,自定義,只要不衝突就行
- apollo-configservice-1.1.2-dev\config\application-github.properties config的數據庫配置(根據不同環境配置不同)
- apollo-configservice-1.1.2-dev\config\bootstrap.yml 由於是分佈式部署,在雲服務器上就有可能出現內網和外網IP的問題,所以此處需要指定IP,以免出現訪問不到的問題(文件是由源碼複製出來修改的)
eureka: instance: ip-address: 193.112.126.181 preferIpAddress: true client: serviceUrl: defaultZone: http://${eureka.instance.hostname}:41001/eureka/ healthcheck: enabled: true eurekaServiceUrlPollIntervalSeconds: 60 endpoints: health: sensitive: false management: security: enabled: false health: status: order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP
修改配置 Admin(以dev爲例,每個環境都是一樣的)
- apollo-adminservice-1.1.2-dev\scripts\startup.sh 修改端口號,自定義,只要不衝突就行
- apollo-adminservice-1.1.2-dev\config\application-github.properties 與config一致
- apollo-adminservice-1.1.2-dev\config\bootstrap.yml 與 config 類似,不同的是端口號不同
部署
- 本地修改後的包,portal只有一份,config和admin一對一,可以有多份
- 將修改好配置的包全部上傳到服務器 放到指定文件夾,位置隨意,目的是方便管理
- 然後修改每個startup.sh,shutdown.sh的權限,默認只有讀寫權限,沒有執行權限
chmod -R 755 startup.sh chmod -R 755 shutdown.sh
- 啓動服務 到各個目錄下,運行 ./startup.sh,若全部啓動成功則表示服務已經啓動成功。若出現報錯,則可以根據提示去指定路徑查看錯誤日誌
- 啓動成功後就可以去portal訪問了,如果是雲服務器可能需要自己開放端口號,默認密碼 apollo / admin
- 登陸成功後,能看到管理的環境列表,自己可以創建工程,配置參數,發佈等功能
客戶端訪問服務
- opt/settings/server.properties 若爲window系統,則是c:/opt/settings/server.properties; 若爲Linux系統,則配置 /opt/settings/server.properties;之前老版本使用的 env=PRO(環境的名稱,在打包文件 build.bat 裏面定義的)的方式,現在直接配置最後一行即可,地址爲想要連接環境的 IP + Port,我的41001對應的爲 dev 環境
- 在項目中,app.properties 文件中,設置app.id,與 portal 創建的 AppId 一致
- 啓動 SimpleApolloConfigDemo,然後輸入 key,獲取 value,獲取值爲portal所配置,到此爲止客戶端訪問成功。具體原理需要自己去看源碼了,可以參考 Java客戶端使用指南https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97