開始使用Docker部署Apollo配置中心之前,首先需要機器安裝Docker環境本文使用Vresion: 2.0.0.0-mac81 (29211)
測試部署,並使用以下映象:
- mysql
- apollo-configservice
- apollo-adminsrevice
- apollo-portal
因為本文為純部署目的,因此不在這裡講解Apollo的一些知識,如有需要可檢視 官方GitHub地址。
上面提到的映象除了Mysql
以外其餘三個都需要自行編譯成Docker映象,由於最初是打算部署到k8s中的,所以是按照K8s的部署文件來編譯相應的映象的。本文使用使用dockre-compose
部署dev、fat、uat、pro等環境,僅供測試時使用,詳細生產環境部署可檢視官方指導,這裡先給出官方的分散式部署方案圖。
關於如何編譯apollo-configservice
、apollo-adminsrevice
、apollo-portal
這三個docker映象可點選連線檢視 K8s的部署文件 來編譯Docker映象。
Apollo使用的是Spring Cloud微服務架構,主要包括以下服務:
- 註冊中心(與apollo-configservice執行在一起)
- 配置服務(apollo-configservice)
- 管理服務(apollo-adminservice)
- 管理門戶(apollo-portal)
Apollo主要使用Mysql儲存應用的配置以及自已的執行配置,Apollo使用以下資料庫完成儲存:
- ApolloPortalDB
- ApolloConfigDB
使用關係如下:
服務 | ApolloPortalDB | ApolloConfigDB |
---|---|---|
配置服務 | Y | |
管理服務 | Y | |
管理門戶 | Y |
下面準備使用Dockere在dev
環境部署Apollo。
準備工作
從Github來拉取最新的Apollo程式碼:
git clone git@github.com:ctripcorp/apollo.git
複製程式碼
檢查啟動Docker是否啟動:
docker info
複製程式碼
由於使用dockre-compose
部署,需要有一個dockre-compose
配置檔案,這裡假設有一個apollo-compose.yaml
配置檔案,之後的部署都會更新這個檔案。如果你的機器還未安裝dockre-compose
可檢視 docker-compose安裝指導
配置Mysql服務
部署之前先將對應環境的Mysql服務啟動起來,這裡使用docker-compose
啟動Mysql服務.
version: "3"
services:
mysql-dev:
image: mysql
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
expose:
- "3306"
volumes:
- /Users/yjwfn/bin/apollo/scripts/sql:/sql
複製程式碼
上面的配置程式碼,將在dev
環境執行mysql服務,這裡掛載了一個目錄:/Users/yjwfn/bin/apollo/scripts/sql:/sql
,該目錄裡面存放Apollo的資料庫檔案,詳細檔案可檢視 Apollo Sql檔案。
使用以下命令啟動dev
環境的mysql服務:
docker-compose -f apollo-compose.yaml up -d mysql-dev
複製程式碼
apollo-compose.yaml
是你機上docker-compose
配置檔案,mysql-dev
是mysql服務的名稱。
啟動完成後檢視容器是否已經執行:
docker container ps
複製程式碼
配置Apollo資料庫
mysql服務啟動完成之後,需要將apolloconfigdb.sql
與apolloportaldb.sql
這兩個sql檔案匯入到資料庫中,首先連線上docker中的mysql服務:
docker exec -it kube_mysql-dev_1 sh
複製程式碼
kube_mysql-dev_1
是mysql服務的容器名稱,連線上容器後登陸到mysql服務匯入sql檔案:
mysql -p123456
source /sql/apolloconfigdb.sql
srouce /sql/apolloportaldb.sql
複製程式碼
如果是部署apollo-configservice
與apollo-apolloportaldb
的話只需要匯入/sql/apolloconfigdb.sql
就行了,相應的部署apollo-portal
只需要匯入/sql/apolloportaldb.sql
,方便演示這裡就兩個同時匯入了。
匯入完成後資料中現在應該有ApolloConfigDB
與ApolloPortalDB
兩個資料庫,首先需要對ApolloConfigDB
裡面的ServerConfig
做一些修改,主要是對發服服務
的伺服器地址做一點變更:
use ApolloConfigDB;
update ServerConfig set Value="http://apollo-configservice-dev:8080/eureka/" where `key`="eureka.service.url";
複製程式碼
apollo-configservice-dev
是稍後我們需要釋出的apollo-configservice
服務的名稱。修改完成之後可執行查詢語句是否修改成功:
select * from ServerConfig;
複製程式碼
修改完成之前退出dockre容器的連線就行了, 接下來部署apollo-configservice
。
配置服務部署(apollo-configservice)
Apollo配置服務(apollo-configservice)
與註冊中心(Eureka)
是執行在一起的,所以一般情況下是不需要再部署Eureka
了。現在部署apollo-configservice
服務,首先在apollo-compose.yaml
新增apollo-configservice
服務:
version: "3"
services:
... #省略其他服務
apollo-configservice-dev:
image: <映象地址>
environment:
DATASOURCES_URL: jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
ENV: "dev"
expose:
- "8080"
depends_on:
- "mysql-dev"
複製程式碼
注意apollo-configservice-dev
依賴了上面部署的mysql-dev
服務,並且注入了一些環境變數:
- DATASOURCES_URL (mysql-dev連線地址)
- DATASOURCES_USERNAME (mysql-dev連線使用者)
- DATASOURCES_PASSWORD (mysql-dev的root密碼)
- ENV (apollo-configservice)的執行環境
服務新增完成後執行以下命令啟動apollo-configservice-dev
服務:
docker-compose -f apollo-compose.yaml up -d apollo-configservice-dev
複製程式碼
執行啟動命令後等待幾秒,然後檢視服務是否啟動成功。可通過在容器中檢視啟動日誌來判斷服務是否啟動成功:
docker exec -it kube_apollo-configservice-dev_1 sh
cat /opt/logs/apollo-config-server/apollo-configservice.log
複製程式碼
kube_apollo-configservice-dev_1
是apollo-configservice-dev
的容器名稱可通過docker container ps
檢視,看到如下日誌基本可以確定服務已經成功啟動:
2018-12-27 21:45:51.889 INFO 40 --- [Thread-17] c.n.e.registry.AbstractInstanceRegistry : Registered instance APOLLO-CONFIGSERVICE/f2b6896763d0:apollo-configservice:8080 with status UP (replication=true)
2018-12-27 21:45:51.889 INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl : Got 1 instances from neighboring DS node
2018-12-27 21:45:51.889 INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl : Renew threshold is: 1
2018-12-27 21:45:51.889 INFO 40 --- [Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl : Changing status to UP
2018-12-27 21:45:51.894 INFO 40 --- [Thread-17] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
複製程式碼
管理服務部署(apollo-adminservice)
管理服務的配置基本上與配置服務
的配置基本相似,首先在apollo-compose
中新增apollo-adminservice-dev
服務:
version: "3"
services:
... #省略其他服務配置
apollo-adminservice-dev:
image: <映象名稱>
environment:
DATASOURCES_URL: "jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8"
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
ENV: "dev"
expose:
- "8080"
depends_on:
- "mysql-dev" #管理服務依賴之前配置的mysql-dev服務
- "apollo-configservice-dev" #管理服務依賴配置服務
複製程式碼
同apollo-configservice-dev
一樣定義幾個環境變數:
- DATASOURCES_URL (mysql-dev連線地址)
- DATASOURCES_USERNAME (mysql-dev連線使用者)
- DATASOURCES_PASSWORD (mysql-dev的root密碼)
- ENV (apollo-configservice)的執行環境
新增服務完成後開始啟動apollo-adminservice-dev
服務:
docker-compose -f apollo-compose.yaml up -d apollo-adminservice-dev
複製程式碼
然後使用docker container ps
檢視容器名稱,隨後執行命令檢視Log檔案:
docker exec -it kube_apollo-adminservice-dev_1 sh
cat /opt/logs/apollo-admin-server/apollo-adminservice.log | tail -n 50
複製程式碼
部分日誌輸出如下所示:
...
2018-12-27 21:56:45.722 INFO 40 --- [DiscoveryClient-InstanceInfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APOLLO-ADMINSERVICE/8578c069d388:apollo-adminservice:8090: registering service...
2018-12-27 21:56:45.804 INFO 40 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8090 (http) with context path ''
2018-12-27 21:56:45.810 INFO 40 --- [main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8090
2018-12-27 21:56:45.810 INFO 40 --- [DiscoveryClient-InstanceInfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APOLLO-ADMINSERVICE/8578c069d388:apollo-adminservice:8090 - registration status: 204
複製程式碼
現在可以確定Eureka
註冊中心中已經有兩個服務分別為APOLLO-CONFIGSERVICE
和APOLLO-ADMINSERVICE
服務。
管理控制檯部署(apollo-portal)
成功部署配置服務(apollo-configservice)
和管理服務(apollo-adminsrevice)
並啟動成功後,現在可以部署管理控制檯服務(apollo-portal)
了。首先在apollo-compose.yaml
檔案新增兩個服務:
mysql-portal:
image: mysql
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
expose:
- "3306"
volumes:
- /Users/yjwfn/bin/apollo/scripts/sql:/sql
apollo-portal:
image: <映象名稱>
environment:
DEV_META_SERVICE_NAME: apollo-configservice-dev
DATASOURCES_URL: "jdbc:mysql://mysql-portal:3306/ApolloPortalDB?characterEncoding=utf8"
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
# expose:
# - "8070"
ports:
- 8070:8070 #方便測試匯出埠
depends_on:
- "mysql-portal"
- "apollo-configservice-dev"
- "apollo-adminservice-dev"
複製程式碼
管理控制檯服務
使用了單獨的mysql服務,沒有與apollo-configservice-dev
和apollo-adminservice-dev
共享一個mysql服務,同樣mysql-portal
也需要初始化資料庫,這裡我們首先啟動mysql-portal
服務:
#啟動服務
docker-compose -f apollo-compose.yaml up -d mysql-portal
#連線到容器執行命令
docker exec -it kube_mysql-portal_1 sh
#登陸mysql
mysql -p123456
#匯入sql檔案
source /sql/apolloportaldb.sql
複製程式碼
mysql-portal
啟動並配置完成後開始啟動apollo-portal
服務:
docker-compose -f apollo-compose.yaml up -d apollo-portal
複製程式碼
啟動成功後可訪問 http://localhost:8070 啟動管理控制檯。
總結
由於現在公司也正在使用Apollo做為分散式配置中心,所以決定學習下Apollo的相關知識。 此文章只涉及到部署想著的知識,裡面提到的一些內容其實都可以在官方文件中找到,這裡不得不提下Apollo的文件資料還是非常全的。總的來說部署的過程還是有些坑的,但是經過一段時候的摸索,還是成功的在Docker中部署了,之後還會學習Apollo的使用相關的知識,後續再來分享。
最後附上完整的apollo-compose.yaml
檔案:
#坑一: mysql使用有物件設定環境變數無效
#SQL目錄: 注意要改成本地機器的
version: "3"
services:
mysql-dev:
image: mysql
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
expose:
- "3306"
volumes:
- /Users/yjwfn/bin/apollo/scripts/sql:/sql
apollo-configservice-dev:
image: rcntech/apollo-configservice:v1.2.0
environment:
DATASOURCES_URL: jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
ENV: "dev"
expose:
- "8080"
depends_on:
- "mysql-dev"
apollo-adminservice-dev:
image: rcntech/apollo-adminservice:v1.2.0
environment:
DATASOURCES_URL: "jdbc:mysql://mysql-dev:3306/ApolloConfigDB?characterEncoding=utf8"
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
ENV: "dev"
expose:
- "8080"
depends_on:
- "mysql-dev"
- "apollo-configservice-dev"
mysql-portal:
image: mysql
# restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
expose:
- "3306"
volumes:
#這裡改成本機的Apollo倉庫的Sql目錄
- /Users/yjwfn/bin/apollo/scripts/sql:/sql
apollo-portal:
image: rcntech/apollo-portal:v1.2.0
environment:
DEV_META_SERVICE_NAME: apollo-configservice-dev
TEST_ALPHA_META_SERVICE_NAME: apollo-configservice-fat
TEST_BETA_META_SERVICE_NAME: apollo-configservice-uat
PROD_META_SERVICE_NAME: apollo-configservice-pro
DATASOURCES_URL: "jdbc:mysql://mysql-portal:3306/ApolloPortalDB?characterEncoding=utf8"
DATASOURCES_USERNAME: root
DATASOURCES_PASSWORD: 123456
# expose:
# - "8070"
ports:
- 8070:8070
depends_on:
- mysql-portal
- apollo-configservice-dev
- apollo-adminservice-dev
複製程式碼