文章目錄
前言
由於一開始對Apollo的架構方式瞭解的不夠升入,同時爲了能夠使得安裝過程更加的簡單,做到一條指令實現Apollo環境的搭建,經歷了比較多的測試;本文基於apollo 1.6.0的版本進行編譯打包的,後面會將整個鏡像的創建過程逐一的列舉出來,避免想了解的朋友再次花時間去研究;
什麼是Apollo
攜程官方Apollo倉庫對該分佈式配置中心做了詳細的說明,這裏就不再對起解析過多的解釋,官方文檔永遠是最新、最全、最權威的介紹,下面只引用官方的一張圖來簡單說明一下;
總體設計
上圖簡要描述了Apollo的總體設計,我們可以從下往上看:
Config Service
提供配置的讀取、推送等功能,服務對象是Apollo客戶端Admin Service
提供配置的修改、發佈等功能,服務對象是Apollo Portal(管理界面)Config Service
和Admin Service
都是多實例
、無狀態
部署,所以需要將自己註冊到Eureka中並保持心跳- 在Eureka之上我們架了一層
Meta Server
用於封裝Eureka的服務發現接口 Client
通過域名訪問Meta Server獲取Config Service服務列表(IP+Port),而後直接通過IP+Port訪問服務,同時在Client側會做load balance、錯誤重試Portal
通過域名訪問Meta Server獲取Admin Service服務列表(IP+Port),而後直接通過IP+Port訪問服務,同時在Portal側會做load balance、錯誤重試- 爲了簡化部署,我們實際上會把Config Service、Eureka和Meta Server三個邏輯角色部署在同一個JVM進程中
修改流程圖
更多詳細的介紹,請通讀官方,讀官方,官方,方的文檔,讀完之後,詳細你會對Apollo有一個全面及系統的認識;這裏主要是想如何以最快的方式將環境搭建起來。
Docker 安裝apollo
Docker安裝及基礎操作
參考此:CentOS 7下安裝Docker及基礎操作 博客,這裏不是重點,所以也就不做過多的說明及解釋
鏡像介紹
- apollo-portal
docker pull pengfeilu/apollo-portal:1.6.0
- apollo-configservice
docker pull pengfeilu/apollo-configservice:1.6.0
- apollo-adminservice
docker pull pengfeilu/apollo-adminservice:1.6.0
- apollo-mysql
// 該鏡像基於mysql 5.7.22版本允許時自動執行了apollo 1.6.0版本中相關的sql // 通俗一點說就是鏡像啓動之後數據庫裏面就包含apollo默認的相關數據庫 docker pull pengfeilu/apollo-mysql:5.7.22_1.6.0
安裝Apollo
-
創建一個apollo環境管理的配置文件
// 這個文件是用於配置apollo-portal管理的各個環境的Eureka地址 vim apollo-env.properties // 創建好之後添加以下配置
#本地默認環境配置,沒啥用 local.meta=http://localhost:8080 #下面的環境,你有幾個就添加幾個,沒有的或者不需要的可以直接刪掉 dev.meta=http://fill-in-dev-meta-server:8080 fat.meta=http://fill-in-fat-meta-server:8080 uat.meta=http://fill-in-uat-meta-server:8080 lpt.meta=http://fill-in-lpt-meta-server:8080 pro.meta=http://fill-in-pro-meta-server:8080
-
創建docker-conpose.yml文件
// 任意目錄下創建docker-compose.yml vim docker-compose.yml // 並在文件中添加一下內容
version: "3" services: apollo-mysql: container_name: apollo-mysql image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0 ports: - "13306:3306" environment: - MYSQL_ROOT_PASSWORD=你的數據庫密碼 - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署環境的主機IP:8080/eureka/" where `Key`="eureka.service.url" apollo-configservice: container_name: apollo-configservice image: pengfeilu/apollo-configservice:1.6.0 ports: - "8080:8080" depends_on: - apollo-mysql volumes: - "/opt/logs/100003171:/opt/logs/100003171" environment: - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8 - spring_datasource_username=數據庫名稱 - spring_datasource_password=數據庫密碼 - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP) apollo-adminservice: container_name: apollo-adminservice image: pengfeilu/apollo-adminservice:1.6.0 ports: - "8090:8090" depends_on: - apollo-mysql - apollo-configservice links: - apollo-configservice volumes: - "/opt/logs/100003172:/opt/logs/100003172" environment: - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8 - spring_datasource_username=數據庫的用戶名 - spring_datasource_password=數據庫密碼 - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP) apolo-portal: container_name: apollo-portal image: pengfeilu/apollo-portal:1.6.0 ports: - "8070:8070" volumes: - "/opt/logs/100003173:/opt/logs/100003173" - "$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties" environment: - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloPortalDB?characterEncoding=utf8 - spring_datasource_username=數據庫的用戶名 - spring_datasource_password=數據庫密碼
好!到此,所有的配置項都已經完成了;務必要注意上面設計到的
IP
、端口
及用戶密碼
等信息;下面對上面核心的部分進行一些簡單的說明 -
UPDATE_EUREKA_URL_SQL
這個變量在基礎的Mysql鏡像中是不存在的,是我後來加的,用來修改adminservice和configservice連接的Eureka地址的sql,它會在數據庫創建成功之後執行;如果你使用的基礎的Mysql鏡像,可以優先啓動Mysql的服務,啓動之後手動允許官方提供的apolloportaldb.sql和apolloconfigdb.sql -
host_ip
這也是自定義的一個變量,用於admin和config服務註冊到Eureka的時候,指明自己服務所處的IP地址,由於使用Docker安裝,如果不指定服務註冊到eureka上的地址就是容器內部的IP,從而導致客戶端訪問配置的時候失敗;官方在分佈式部署中的1.4中有介紹網絡策略,這裏使用的是其中的第二種。 -
apolo-portal
該服務是管理服務,所以他只需要部署一份,對應的數據庫爲ApolloPortalDB
;一般其部署在正式環境,確保其可用性; -
apolo-portal環境配置文件掛載
"$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
該配置爲將不同環境相關的配置信息掛載到容器下對於的路徑,這樣,環境的增加及移除只需要修改對應的文件,並將apollo-portal容器重啓一下即可
-
configservice和adminservice
各個環境服務,每個環境需要單獨部署;同時每個環境各自關聯着各自的ApolloConfigDB
數據庫,互不干擾,互不影響; -
啓動服務
// 首次啓動會下載鏡像,會比較的慢 // 如果存在鏡像啓動失敗,請往下看。 docker-compose up -d
-
重啓容器 (着重關注)
docker-compose restart
在docker-compose.yml中雖然指定了容器之間的關聯關係,但是Mysql在首次啓動的時候會比較慢一點,從而會導致admin、config或者portal在啓動的時候,mysql服務還沒有準備好,導致服務啓動失敗;這個時候我們只需要等mysql初始化好之後再把所有的服務重新啓動一遍就好了。
測試
- 查看Eureka
http://ip:8080 如:http://192.168.1.22:8080 看adminservice和configservice服務是否註冊上來
- 查看Apollo配置管理平臺
http://ip:8070 如: http://192.168.1.22:8070 默認管理員用戶名:apollo
密碼:admin
添加環境
上面默認我們創建了一個Dev的環境,但是實際的使用過程中並不是只有一個環境,可能還有測試環境
、預發佈環境
、正式環境
;那我們如何來添加一個環境呢?有了上面的基礎鏡像,這個事情就變的非常的簡單了;一句話,將上面的docker-compose.yml配置文件的apollo-portal相關的服務去掉並啓動即可
-
第一步:準備docker-compose.yml
// 任意目錄下創建docker-compose.yml vim docker-compose.yml // 並在文件中添加一下內容
version: "3" services: apollo-mysql: container_name: apollo-mysql image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0 ports: - "13306:3306" environment: - MYSQL_ROOT_PASSWORD=你的數據庫密碼 - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署環境的主機IP:8080/eureka/" where `Key`="eureka.service.url" apollo-configservice: container_name: apollo-configservice image: pengfeilu/apollo-configservice:1.6.0 ports: - "8080:8080" depends_on: - apollo-mysql volumes: - "/opt/logs/100003171:/opt/logs/100003171" environment: - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8 - spring_datasource_username=數據庫名稱 - spring_datasource_password=數據庫密碼 - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP) apollo-adminservice: container_name: apollo-adminservice image: pengfeilu/apollo-adminservice:1.6.0 ports: - "8090:8090" depends_on: - apollo-mysql - apollo-configservice links: - apollo-configservice volumes: - "/opt/logs/100003172:/opt/logs/100003172" environment: - spring_datasource_url=jdbc:mysql://數據庫的主機IP:13306/ApolloConfigDB?characterEncoding=utf8 - spring_datasource_username=數據庫的用戶名 - spring_datasource_password=數據庫密碼 - host_ip=這個是我自己加的Eureka上服務的IP地址(部署服務的宿主機IP)
除了把apollo-portal相關的去掉了,其他的沒有任何變得;同是把ip、數據庫等相關環境個性化的東西做一下修改就好了;
-
第二步:啓動並二次重啓服務
docker-compose up -d // 重啓的原因和上面說的一樣 docker-compose restart // 查看服務 docker ps -a | grep apollo // 如果出現下圖切Eureka上面正常註冊了,說明環境相關的服務以及啓動正常了
-
第三步,修改環境配置文件apollo-env.properties
-
第四步,修改ApolloPortalDB.ServerConfig表中的envs字段
找到系統參數
配置並查找apollo.portal.envs
配置,並將其修改爲你需要支持的多個環境,記得用英文的逗號隔開
-
第五步,重啓apollo-portal服務
docker restart apollo-portal
到此,分佈式的apollo環境搭建就完成了;集羣就在以上環境下做相關配置即可。
鏡像創建過程
apollo-mysql鏡像
- 獲取sql腳本,下載
- 配置文件
vim mysql.cnf
[mysql] default-character-set = utf8 [mysql.server] default-character-set = utf8 [mysqld_safe] default-character-set = utf8 [client] default-character-set = utf8 [mysqld] character_set_server=utf8 init_connect='SET NAMES utf8'
- 添加初始化數據庫腳本
vim init_db.sh
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF source $WORK_PATH/apolloconfigdb.sql; source $WORK_PATH/apolloportaldb.sql; EOF mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF $UPDATE_EUREKA_URL_SQL; EOF
- 創建Dockerfile
# mysql 官方鏡像 FROM mysql:5.7.22 # 作者 MAINTAINER lupf <[email protected]> # 定義會被容器自動執行的目錄 ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d # 定義工作目錄 ENV WORK_PATH /usr/local/work # 將要執行的sql腳本拷貝至工作目錄 COPY ./*.sql $WORK_PATH/ # 將執行sql的shell腳本拷貝至docker-entrypoint-initdb.d,這個目錄會在容器啓動的時候自動執行下面的指令 COPY ./init_db.sh $AUTO_RUN_DIR/ # 將配置文件拷貝到對應的目錄 #COPY ./mysql.cnf /etc/mysql/mysql.conf.d/ # 給執行文件增加可執行權限 RUN chmod a+x $AUTO_RUN_DIR/*
- 構建鏡像即可
docker build -t pengfeilu/apollo-mysql:5.7.22_1.6.0
adminservice、configservice和portal鏡像構建
-
下載官方代碼
// github 地址 git clone https://github.com/ctripcorp/apollo.git // 如果github下載慢,也可以去碼雲下 git clone https://gitee.com/nobodyiam/apollo.git
-
微調一點Eureka配置
//進入apollo-adminservice和apollo-configservice cd apollo-adminservice/src/main/resources/ // 以及 cd apollo-configservice/src/main/resources/
分別在application.yml添加以下配置
spring: cloud: inetutils: ignoredInterfaces: - docker0 - veth.*
親測上面這種忽略網卡的做法貌似不會生效,因此,這裏再添加下面的一行配置
分別在bootstrap.yml添加以下配置eureka: instance: ip-address: ${host_ip}
-
Maven編譯
// 進入項目的根目錄,apollo目錄,允許以下指令 sh scripts/build.sh // 如果是windows,允許build.bat即可
-
使用各個項目的Docker腳本將打好的包打成鏡像
- 找到Dockerfile
將apollo-configservice、apollo-adminservice和apollo-portal下,target目錄中的apollo-*-1.6.0-SNAPSHOT-github.zip文件分別拷貝到各自項目的src/main/docker/目錄下
- 生成鏡像
// 在各自的src/main/docker/ 分別執行以下各自的指令編譯成對於的鏡像 cd apollo-configservice/src/main/docker/ docker build -t pengfeilu/apollo-configservice:1.6.0 . cd apollo-adminservice/src/main/docker/ docker build -t pengfeilu/apollo-adminservice:1.6.0 . cd apollo-portal/src/main/docker/ docker build -t pengfeilu/apollo-portal:1.6.0 .
- 找到Dockerfile
到此,所有的鏡像即創建完成!