攜程 Apollo 配置中心分布式部署(Docker)

Spring Boot 2.0 整合攜程Apollo配置中心一文中,我們在本地快速部署試用了Apollo。本文將介紹如何按照分布式部署(采用Docker部署)的方式編譯、打包淮腾、部署Apollo配置中心,從而可以在開發(fā)岛心、測試来破、生產等環(huán)境分別部署運行。

一忘古、準備工作

本文將在CentOS 7.x上部署Apollo配置中心服務端徘禁。

1.1 Java和MySQ

對于Java和MySQL的要求可以參考Spring Boot 2.0 整合攜程Apollo配置中心準備工作的部分。

1.2 Docker環(huán)境安裝

對于Docker環(huán)境的安裝可以參考CentOS 7.x 安裝Docker

1.3 Docker Compose安裝

對于Docker Compose的安裝可以參考Docker Compose編排微服務

1.4 部署策略(來自官網)

分布式部署需要事先確定部署的環(huán)境以及部署方式髓堪。Apollo目前支持以下環(huán)境:

以ctrip為例驶沼,其部署策略如下:


ctrip部署策略
  • Portal部署在生產環(huán)境的機房,通過它來直接管理FAT争群、UAT回怜、PRO等環(huán)境的配置
  • Meta Server、Config Service和Admin Service在每個環(huán)境都單獨部署换薄,使用獨立的數據庫
  • Meta Server玉雾、Config Service和Admin Service在生產環(huán)境部署在兩個機房翔试,實現(xiàn)雙活
  • Meta Server和Config Service部署在同一個JVM進程內,Admin Service部署在同一臺服務器的另一個JVM進程內

另外可以參考下面的樣例部署圖:


樣例部署圖

為了演示方便复旬,本文將Apollo-portal垦缅,Apollo-adminservice和Apollo-configservice部署在一臺機器上

服務器 服務 端口 環(huán)境
192.168.10.138 apollo-portal 8070 UAT
192.168.10.138 apollo-adminservice 8080 UAT
192.168.10.138 apollo-configservice 8090 UAT

1.5 網絡策略(來自官網)

分布式部署的時候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注冊到Meta Server(apollo-configservice本身)驹碍。

Apollo客戶端和Portal會從Meta Server獲取服務的地址(IP+端口)壁涎,然后通過服務地址直接訪問。

所以如果實際部署的機器有多塊網卡(如docker)志秃,或者存在某些網卡的IP是Apollo客戶端和Portal無法訪問的(如網絡安全限制)怔球,那么我們就需要在apollo-configservice和apollo-adminservice中做相關限制以避免Eureka將這些網卡的IP注冊到Meta Server。

如下面這個例子就是對于apollo-configservice浮还,把docker0和veth.* 的網卡在注冊到Eureka時忽略掉庞溜。

spring:
  application:
      name: apollo-configservice
  profiles:
    active: ${apollo_profile}
  cloud:
    inetutils:
      ignoredInterfaces:
        - docker0
        - veth.*

另外一種方式是直接指定要注冊的IP,可以修改startup.sh碑定,通過JVM System Property在運行時傳入流码,如-Deureka.instance.ip-address=${指定的IP},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件延刘,加入以下配置

eureka:
  instance:
    ip-address: ${指定的IP}

最后一種方式是直接指定要注冊的IP+PORT漫试,可以修改startup.sh,通過JVM System Property在運行時傳入碘赖,如-Deureka.instance.homePageUrl=http://${指定的IP}:${指定的Port}驾荣,或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置

eureka:
  instance:
    homePageUrl: http://${指定的IP}:${指定的Port}
    preferIpAddress: false

如果Apollo部署在公有云上普泡,本地開發(fā)環(huán)境無法連接播掷,但又需要做開發(fā)測試的話,客戶端可以升級到0.11.0版本及以上撼班,然后通過-Dapollo.configService=http://config-service的公網IP:端口來跳過meta service的服務發(fā)現(xiàn)

二歧匈、部署步驟

部署步驟共三步:

  1. 創(chuàng)建數據庫:Apollo服務端依賴于MySQL數據庫,所以需要事先創(chuàng)建并完成初始化
  2. 獲取安裝包:通過源碼構建
  3. 構建docker鏡像:為apollo-configservice, apollo-adminservice, apollo-portal構建Docker鏡像
  4. 部署Apollo服務端:構建鏡像后通過docker compose就可以部署到公司的測試和生產環(huán)境了

2.1 創(chuàng)建數據庫

Apollo服務端共需要兩個數據庫:ApolloPortalDB和ApolloConfigDB砰嘁,官網把數據庫件炉、表的創(chuàng)建和樣例數據都分別準備了sql文件(在下載的源碼/scripts/sql目錄下),只需要導入數據庫即可矮湘。

由于我只在一臺服務器上做演示斟冕,所以ApolloPortalDBApolloConfigDB在UAT環(huán)境部署一套就可以了

服務器 數據庫 端口 環(huán)境
192.168.10.58 ApolloPortalDB 3306 UAT
192.168.10.58 ApolloConfigDB 3306 UAT

2.1.1 創(chuàng)建ApolloPortalDB

通過各種Mysql客戶端(Navicat,DataGrip等)導入sql/apolloportaldb.sql即可
下面以MySQL原生客戶端為例:

source /your_local_path/sql/apolloportaldb.sql

導入成功后,可以通過執(zhí)行以下sql語句來驗證:

select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
Id AppId Name
1 SampleApp Sample App

2.1.2 創(chuàng)建ApolloConfigDB

通過各種Mysql客戶端(Navicat,DataGrip等)導入sql/apolloconfigdb.sql即可
下面以MySQL原生客戶端為例:

source /your_local_path/sql/apolloconfigdb.sql

導入成功后缅阳,可以通過執(zhí)行以下sql語句來驗證:

select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
NamespaceId Key Value Comment
1 timeout 100 sample timeout配置
2.1.2.1 從別的環(huán)境導入ApolloConfigDB的項目數據

如果是全新部署的Apollo配置中心磕蛇,請忽略此步。

如果不是全新部署的Apollo配置中心,比如已經使用了一段時間秀撇,這時在Apollo配置中心已經創(chuàng)建了不少項目以及namespace等伏伯,那么在新環(huán)境中的ApolloConfigDB中需要從其它正常運行的環(huán)境中導入必要的項目數據。

主要涉及ApolloConfigDB的下面4張表捌袜,下面同時附上需要導入的數據查詢語句:

  1. App
    • 導入全部的App
    • 如:insert into 新環(huán)境的ApolloConfigDB.App select * from 其它環(huán)境的ApolloConfigDB.App where IsDeleted = 0;
  2. AppNamespace
    • 導入全部的AppNamespace
    • 如:insert into 新環(huán)境的ApolloConfigDB.AppNamespace select * from 其它環(huán)境的ApolloConfigDB.AppNamespace where IsDeleted = 0;
  3. Cluster
    • 導入默認的default集群
    • 如:insert into 新環(huán)境的ApolloConfigDB.Cluster select * from 其它環(huán)境的ApolloConfigDB.Cluster where Name = 'default' and IsDeleted = 0;
  4. Namespace
    • 導入默認的default集群中的namespace
    • 如:insert into 新環(huán)境的ApolloConfigDB.Namespace select * from 其它環(huán)境的ApolloConfigDB.Namespace where ClusterName = 'default' and IsDeleted = 0;

同時也別忘了通知用戶在新的環(huán)境給自己的項目設置正確的配置信息,尤其是一些影響面比較大的公共namespace配置炸枣。

2.1.3 調整服務端配置

Apollo自身的一些配置是放在數據庫里面的虏等,所以需要針對實際情況做一些調整。

2.1.3.1 調整ApolloPortalDB配置

配置項統(tǒng)一存儲在ApolloPortalDB.ServerConfig表中适肠,也可以通過管理員工具 - 系統(tǒng)參數頁面進行配置霍衫。

  1. apollo.portal.envs - 可支持的環(huán)境列表
    默認值是dev,如果portal需要管理多個環(huán)境的話侯养,以逗號分隔即可(大小寫不敏感)敦跌,如:DEV,FAT,UAT,PRO,我這里設置為UAT1.1.0版本增加了系統(tǒng)信息頁面(管理員工具 -> 系統(tǒng)信息),可以通過該頁面檢查配置是否正確
2.1.3.2 調整ApolloConfigDB配置

配置項統(tǒng)一存儲在ApolloConfigDB.ServerConfig表中逛揩,需要注意每個環(huán)境的ApolloConfigDB.ServerConfig都需要單獨配置柠傍。

  1. eureka.service.url - Eureka服務Url
    不管是apollo-configservice還是apollo-adminservice都需要向eureka服務注冊,所以需要配置eureka服務地址辩稽。 按照目前的實現(xiàn)惧笛,apollo-configservice本身就是一個eureka服務,所以只需要填入apollo-configservice的地址即可逞泄,如有多個患整,用逗號分隔(注意不要忘了/eureka/后綴)。這里我填寫http://192.168.10.138:8080/eureka喷众。后續(xù)文章我會單獨介紹如何將Config Service和Admin Service注冊到公司統(tǒng)一的Eureka上

2.2 獲取安裝包

可以通過兩種方式獲取安裝包:

  1. 直接下載安裝包
    • 從GitHub Release頁面下載預先打好的安裝包
    • 如果對Apollo的代碼沒有定制需求各谚,建議使用這種方式,可以省去本地打包的過程
  2. 通過源碼構建
    • 從GitHub Release頁面下載Source code包或直接clone源碼后在本地構建
    • 如果需要對Apollo的做定制開發(fā)到千,需要使用這種方式

這里我是通過源碼構建的

2.2.1 通過源碼構建

到github上進行源碼下載

2.2.1.1 配置數據庫連接信息

Apollo服務端需要知道如何連接到你前面創(chuàng)建的數據庫昌渤,所以需要編輯scripts/build.sh,修改ApolloPortalDB和ApolloConfigDB相關的數據庫連接串信息憔四。

# apollo config db info
apollo_config_db_url=jdbc:mysql://192.168.10.58:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=Ibase2016

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://192.168.10.58:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=Ibase2016
2.2.1.2 配置各環(huán)境meta service地址

Apollo Portal需要在不同的環(huán)境訪問不同的meta service(apollo-configservice)地址愈涩,所以需要在打包時提供這些信息。我這里只部署UAT環(huán)境加矛,配置修改如下:

# meta server url, different environments should have different meta server addresses
#dev_meta=http://192.168.10.58:8080
#fat_meta=http://192.168.10.58:8080
uat_meta=http://192.168.10.138:8080
#pro_meta=http://192.168.10.58:8080

#META_SERVERS_OPTS="-Ddev_meta=$dev_meta -Dfat_meta=$fat_meta -Duat_meta=$uat_meta -Dpro_meta=$pro_meta"
META_SERVERS_OPTS="-Duat_meta=$uat_meta"
2.2.1.3 執(zhí)行編譯履婉、打包

做完上述配置后,就可以執(zhí)行編譯和打包了斟览。執(zhí)行/scripts目錄下build.sh腳本毁腿,該腳本會依次打包apollo-configservice, apollo-adminservice, apollo-portal。

2.2.1.4 獲取安裝包和Dockerfile文件
  1. 獲取apollo-configservice安裝包:安裝包在位于apollo-configservice/target/目錄下的apollo-configservice-x.x.x-github.zip,Dockerfile在apollo-configservice/src/main/docker/目錄下
  2. 獲取apollo-adminservice安裝包:安裝包位于apollo-adminservice/target/目錄下的apollo-adminservice-x.x.x-github.zip已烤,Dockerfile在apollo-adminservice/src/main/docker/目錄下
  3. 獲取apollo-portal安裝包:安裝包位于apollo-portal/target/目錄下的apollo-portal-x.x.x-github.zip鸠窗,Dockerfile在apollo-portal/src/main/docker/目錄下

分別將上面的安裝包和Dockerfile文件上傳至服務器(已安裝Docker)上

2.3 構建docker鏡像

上傳到服務器上的安胡子那個包和Dockerfile文件目錄結構如下:

apollo_portal
      - Dokerfile
      - apollo-portal-x.x.x-github.zip
apollo_config
      - Dokerfile
      - apollo-configservice-x.x.x-github.zip      
apollo_admin
      - Dokerfile
      - apollo-adminservice-x.x.x-github.zip
  1. 構建simon/apollo-portal鏡像
    進入apollo_portal目錄執(zhí)行如下命令docker build -t simon/apollo_portal .
  2. 構建simon/apollo-portal鏡像
    進入apollo_config目錄執(zhí)行如下命令docker build -t simon/apollo_configservice .
  3. 構建simon/apollo-portal鏡像
    進入apollo_admin目錄執(zhí)行如下命令docker build -t simon/apollo_adminservice .

2.4 部署Apollo服務端

我們通過docker compose部署Apollo服務端,部署的配置文件如下:

version: "3"

services:
  apollo-configservice:                                         ##容器服務名
    container_name: apollo-configservice                        ##容器名
    #build: apollo-configservice/src/main/docker/                ##Dockerfile路徑
    image: simon/apollo-configservice                           ##鏡像名
    ports:
      - "8080:8080"    
    volumes:
      - "/opt/logs/100003171:/opt/logs/100003171"    ##將/opt/logs/100003171目錄掛載到宿主機的/opt/logs/100003171方便在宿主機上查看日志
  apollo-adminservice:
    container_name: apollo-adminservice
    #build: apollo-adminservice/src/main/docker/
    image: simon/apollo-adminservice
    ports:
      - "8090:8090"
    depends_on:
      - apollo-configservice
    volumes:
      - "/opt/logs/100003172:/opt/logs/100003172"
  apollo-portal:
    container_name: apollo-portal
    #build: apollo-portal/src/main/docker/
    image: simon/apollo-portal
    ports:
      - "8070:8070"
    depends_on:
      - apollo-adminservice
    volumes:
      - "/opt/logs/100003173:/opt/logs/100003173"

在配置文件目錄執(zhí)行如下命令啟動服務:

docker-compose up

這樣整個部署過程就結束了胯究。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末稍计,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裕循,更是在濱河造成了極大的恐慌臣嚣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剥哑,死亡現(xiàn)場離奇詭異硅则,居然都是意外死亡,警方通過查閱死者的電腦和手機株婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門怎虫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人困介,你說我怎么就攤上這事大审。” “怎么了座哩?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵饥努,是天一觀的道長。 經常有香客問我八回,道長酷愧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任缠诅,我火速辦了婚禮溶浴,結果婚禮上,老公的妹妹穿的比我還像新娘管引。我一直安慰自己士败,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布褥伴。 她就那樣靜靜地躺著谅将,像睡著了一般。 火紅的嫁衣襯著肌膚如雪重慢。 梳的紋絲不亂的頭發(fā)上饥臂,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音似踱,去河邊找鬼隅熙。 笑死稽煤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的囚戚。 我是一名探鬼主播酵熙,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驰坊!你這毒婦竟也來了匾二?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拳芙,失蹤者是張志新(化名)和其女友劉穎察藐,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體态鳖,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年恶导,在試婚紗的時候發(fā)現(xiàn)自己被綠了浆竭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惨寿,死狀恐怖邦泄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情裂垦,我是刑警寧澤顺囊,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站蕉拢,受9級特大地震影響特碳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晕换,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一午乓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闸准,春花似錦益愈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至库快,卻和暖如春摸袁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背义屏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工但惶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耳鸯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓膀曾,卻偏偏與公主長得像县爬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子添谊,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容