寫在前面
??最近在工作中需要使用到apollo配置中心來簡化微服務(wù)開發(fā),在部署時使用docker的方式部署到線上到docker swarm集群。在網(wǎng)上翻了很多人的博文,有些由于時間久遠很多東西都發(fā)生來變化,而有些對一些坑的細節(jié)沒有做詳細說明,最后還是我在官方文檔中扒到了解決方法。
??因此在踩完了所有坑后,詳細的記錄一便流程,方便大家有相同的需求時可以按圖索驥,也作為備忘錄方便以后回顧。
一、準(zhǔn)備工作
1.1 docker環(huán)境安裝
??由于針對生產(chǎn)環(huán)境部署情景,需要在本地環(huán)境及服務(wù)器都準(zhǔn)備好docker環(huán)境,如果只是本機玩玩的話,只需準(zhǔn)備本地docker環(huán)境。至于docker的安裝網(wǎng)上有很多方法,在Mac和windows中都有安裝包進行一鍵安裝即可,在此就不多加贅述了。
1.2 源碼獲取
??首先我們?nèi)ithub上apollo的官方倉庫中獲取部署需要的文件,注意除了使用git獲取到源碼,還需要在Releases頁面中獲取以下三個服務(wù)的最新穩(wěn)定版本壓縮包,用于后續(xù)的鏡像構(gòu)建。
- apollo-configservice
- apollo-adminservice
- apollo-portal
1.3 Mysql數(shù)據(jù)庫
??Apollo服務(wù)端共需要兩個數(shù)據(jù)庫:ApolloPortalDB和ApolloConfigDB,官網(wǎng)把數(shù)據(jù)庫、表的創(chuàng)建和樣例數(shù)據(jù)都分別準(zhǔn)備了sql文件(在下載的源碼包的script/sql目錄下),只需要導(dǎo)入數(shù)據(jù)庫即可。
??建議后續(xù)使用已有的mysql進行部署不要將mysql不要和apollo的三個服務(wù)放在一個docker compose進行編排。因為我們要部署的服務(wù)在啟動時需要依賴數(shù)據(jù)庫中的配置,如果在一起編排服務(wù),第一次啟動會直接掛掉,mysql啟動后還需要初始化才能正常使用,大家如果沒有現(xiàn)成的mysql要使用docker構(gòu)建,也建議部署好mysql導(dǎo)入sql文件后再啟動apollo的服務(wù)。
1.4 部署策略
分布式部署需要事先確定部署的環(huán)境以及部署方式。Apollo目前支持以下環(huán)境:
- DEV 開發(fā)環(huán)境
- FAT 測試環(huán)境,相當(dāng)于alpha環(huán)境(功能測試)
- UAT 集成環(huán)境,相當(dāng)于beta環(huán)境(回歸測試)
- PRO 生產(chǎn)環(huán)境
以ctrip為例,其部署策略如下:

- Portal部署在生產(chǎn)環(huán)境的機房,通過它來直接管理FAT、UAT、PRO等環(huán)境的配置
- Meta Server、Config Service和Admin Service在每個環(huán)境都單獨部署,使用獨立的數(shù)據(jù)庫
- Meta Server、Config Service和Admin Service在生產(chǎn)環(huán)境部署在兩個機房,實現(xiàn)雙活
-
Meta Server和Config Service部署在同一個JVM進程內(nèi),Admin Service部署在同一臺服務(wù)器的另一個JVM進程內(nèi)
樣例部署圖.png
為了演示方便,本文將Apollo-portal,Apollo-adminservice和Apollo-configservice部署在一臺機器上
服務(wù)器 服務(wù) 端口 環(huán)境
192.168.20.198 apollo-portal 8070 UAT
192.168.20.198 apollo-adminservice 8080 UAT
192.168.20.198 apollo-configservice 8090 UAT
二、構(gòu)建鏡像
??首先創(chuàng)建一個apollo目錄用于后續(xù)統(tǒng)一管理我們的資源文件,并創(chuàng)建apollo-configservice、apollo-adminservice、apollo-portal三個子目錄。
??打開之前下載源碼,分別找出apollo-configservice/src/main/docker/Dockerfile、apollo-adminservice/src/main/docker/Dockerfile、apollo-portal/src/main/docker/Dockerfile三個文件并移動到之前創(chuàng)建的三個對應(yīng)子目錄下,將下載好的apollo-configservice-x.x.x-github.zip、apollo-adminservice-x.x.x-github.zip、apollo-portal-x.x.x-github.zip也一并移動到對應(yīng)的子目錄。
??此處有了源碼后如果有需求的話其實是可以自己進行打包的,但由于在本文中沒有特殊需求,并且我自己在嘗試打包中出現(xiàn)了各種依賴問題所以就放棄,如果各位有興趣可以自行嘗試。
準(zhǔn)備好的目錄結(jié)構(gòu)如下:

??部署時使用的是官方最新的1.7.1 release版本,中間出現(xiàn)了些狀況為了看里面的源碼所以我解壓了壓縮包,各位如果沒有必要可以不解壓。
以apollo-configservice為例,首先我們來看一下官方提供的Dockerfile:

??可以看出在Dockerfile里就是一個標(biāo)準(zhǔn)的jar包部署內(nèi)容,值得注意的是需要所需的jar包是從.zip壓縮包解壓出來的,這里直接使用之前下載的壓縮包,但需要將Dockerfile中的${VERSION}改為實際下載的壓縮包版本號
一切準(zhǔn)本就緒后就可以進行鏡像構(gòu)建了:
cd apollo-configservice
docker build -t myhub/apollo-configservice .
cd apollo-adminservice
docker build -t myhub/apollo-adminservice .
cd apollo-portal
docker build -t myhub/apollo-portal .
將鏡像推送至dockerHub:
#登錄到dockerhub,首先得注冊自己得賬號
docker login -u yourname -p yourpassword docker.io
docker push myhub/apollo-configservice
docker push myhub/apollo-adminservice
docker push myhub/apollo-portal
??至此準(zhǔn)備工作就差不多了,接下來可以直接去要部署服務(wù)的目標(biāo)服務(wù)器進行部署操作了
三、服務(wù)部署
首先編輯我們的docker-stack.yml文件,用于描述我們用docker stack部署服務(wù)的細節(jié):
version: "3.7"
services:
apollo-configservice:
image: myhub/apollo-configservice:latest
ports:
- target: 8080
published: 8080
mode: host
environment:
- spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username={username}
- spring_datasource_password={password}
- eureka.instance.ip-address=192.168.20.198
deploy:
placement:
constraints:
- 'node.hostname == 192-168-20-198'
replicas: 1
update_config:
parallelism: 1
delay: 5s
failure_action: rollback
monitor: 60s
order: start-first
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 60s
rollback_config:
parallelism: 1
delay: 5s
failure_action: continue
monitor: 60s
order: start-first
apollo-adminservice:
image: myhub/gapi/apollo-adminservice:latest
ports:
- target: 8090
published: 8090
mode: host
environment:
- spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username={username}
- spring_datasource_password={password}
deploy:
placement:
constraints:
- 'node.hostname == 192-168-20-198'
replicas: 1
update_config:
parallelism: 1
delay: 5s
failure_action: rollback
monitor: 60s
order: start-first
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 60s
rollback_config:
parallelism: 1
delay: 5s
failure_action: continue
monitor: 60s
order: start-first
apollo-portal:
image: myhub/gapi/apollo-portal:latest
ports:
- target: 8070
published: 8070
mode: host
environment:
- DEV_META=http://192.168.20.198:8080
- spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
- spring_datasource_username={username}
- spring_datasource_password={password}
deploy:
placement:
constraints:
- 'node.hostname == 192-168-20-198'
replicas: 1
update_config:
parallelism: 1
delay: 5s
failure_action: rollback
monitor: 60s
order: start-first
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 60s
rollback_config:
parallelism: 1
delay: 5s
failure_action: continue
monitor: 60s
order: start-first
??需要注意的是,由于我們需要將三個服務(wù)都部署到192.168.20.198機器上,所以在deploy.placement.constraints中添加node.hostname == 192-168-20-198將服務(wù)都指定部署到192.168.20.198上。
??之后由于客戶端服務(wù)需要通過注冊中心調(diào)用apollo-configservice服務(wù)拉去配置,所以在apollo-configservice中需要
添加環(huán)境變量- eureka.instance.ip-address=192.168.20.198將自己實際IP注冊到eureka中,否則注冊信息是docker內(nèi)部網(wǎng)橋的虛擬地址,會導(dǎo)致我們拉去配置失敗。
??另外在apollo-portal需要添加環(huán)境變量- DEV_META=http://192.168.20.198:8080指定dev環(huán)境的configservice地址,官方提供的sql環(huán)境只開啟了dev環(huán)境,開啟其他環(huán)境在自后續(xù)進行說明
??準(zhǔn)備完成后就可以進行使用docker stack deploy命令部署服務(wù)了,但在此之前還需要到去ApolloConfigDB.ServerConfig表中將Key為eureka.service.url的Value由http://localhost:8080/eureka/改為http://192.168.20.198:8080/eureka/,因為apollo-configservice和apollo-adminservice服務(wù)都是通過此配置的地址注冊到eureka中,configservice和注冊中心在同一進程中沒什么問題,但adminservice在其他容器中通過localhost:8080并不能找到configservice中但注冊中心。
修改完成后運行命令以一鍵部署服務(wù):
docker stack deploy -c docker-stack.yml apollo
完成后可以使用docker stack ps命令查看詳情:
docker stack ps apollo
四、注意事項及后續(xù)升級
??進行到這里我們的服務(wù)部署就基本完成了,為了便于演示暫時只是支持了官方開箱自帶的dev環(huán)境,接下來演示如何增加新的環(huán)境。
