微服务项目的部署
練習目標
- 掌握Docker Compose編排工具的使用
- 掌握微服務項目與Docker的整合方式
- 掌握微服務項目的部署方式
項目整合參考:https://blog.csdn.net/qq_37823605/article/details/91379272
練習內容
1、Docker Compose編排工具
1.1、Docker Compose的安裝與卸載
1.1.1、安裝條件
Docker Compose是依賴于Docker引擎的,所以在安裝Docker Compose之前要確保機器上已經安裝了Docker
1.1.2、安裝Compose
a)、使用curl命令從GitHub的Compose倉庫拉取Docker Compose,具體指令如下:
$sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
b)、更改Docker Compose的可執行文件權限,具體操作命令如下:
$sudo chmod +x /usr/local/bin/docker-compose
$docker-compose --version
1.1.3、Compose的卸載操作,命令如下:
$sudo rm /usr/local/bin/docker-compose
1.2、Composefile文件的使用說明
Dooker Compose編排工具的使用非常簡單,只需要如下三步。
? ? ? (1)編寫Dookerfile文件。使用Dockerfile定義應用程序的環境,這樣可以在任何地方使用它,Dookefile 的作用就是為每個服務構建鏡像。
? ? ? (2)定義yml文件(通常是docker- compose.yml)。?就是將前面介紹的服務部署指令及相關參數都統一在該文件中編寫和配置,這樣就省去了針對不同服務各自運行的麻煩。
? ? ? (3)運行服務部署指令。根據具體的部署需求,來執行相應的部署指令,Docker 會讀即dooker- composeyml文件內容啟動整個應用服務。
? ? ? 在上述三步中,第一步中Dockerfile文件的編寫已經在第7章有過講解,而第三步的服務部署指令會在后面服務部署環節進行說明,所以現在需要掌握的就是如何編寫docker-composeym文件。接下來,將針對Compose file文件的定義和配置進行詳細講解。
? ? ? 這里先通過一個Compose file 文件的示例來進行展示說明,具體內容如下所示。
?
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlnetworks:- microservice-netenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761networks:- microservice-netdeploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050networks:- microservice-netdepends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:- microservice-netnetworks:microservice-net:
volumes:microservice-mysql:
2、微服務于Docker的整合
2.1、添加Dockerfile文件
? ? ? 在Docker中,應用都是部署在容器中的,而容器又由鏡像生成,鏡像則通常是通過Dockerfile文件構建的,所以微服務與Docker整合的第一步就是 要提供Dockerile文件。
? ? ? 在上一個項目整合中講解整合時編寫的微服務項目microservice- -mallmanagement主要有4個子項目模塊(包括2個微服務模塊和2個輔助服務模塊),我們需要針對每一個子項目模塊編寫對應的Dockerfile文件。這里以用戶訂單管理微服務模塊為例,所編寫的Dockerfile文件的具體內容如下所示。
FROM java:8-jre
MAINTAINER shirx <shirx@qq.com>ADD ./target/microservice-orderservice-0.0.1-SNAPSHOT.jar /app/microservice-orderservice.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-orderservice.jar"]EXPOSE 7900
2.2、添加dockerfile-maven插件
? ? ? Dockerfile文件編寫完成后,就可以使用Docker的框關指令構建鏡靠并運行容器。然后流問容器中的應用了。只是上述所有的操作都是手動完成的,如果需要部署多個服務。將會豐常項
? ? ? 針對這種情況MAVEN提供了一個dackerfile -maven-plugin插件,很好地支持了與Docker的整合。該插件的使用非常簡單,只需要在所有需要生成Docker容器項目的pom文件中添加該插件,并進行一些相關配置即可,其具體使用示例如下。
<build><plugins><!-- dockerfile plugin --><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.3.6</version><configuration><!-- 生成的鏡像倉庫名稱 --><repository>${docker.image.prefix}/${project.artifactId}</repository><!-- 生成的鏡像版本 --><tag>${project.version}</tag><!-- 推送到私有鏡像倉庫時需要開啟安全認證 --><useMavenSettingsForAuth>true</useMavenSettingsForAuth></configuration><!-- 直接使用mvn install命令打包項目,就會自動構建鏡像和推送鏡像 --><executions><execution><id>default</id><phase>install</phase><goals><goal>build</goal><goal>push</goal></goals></execution></executions></plugin></plugins></build>
2.3、添加docker-compose.yml編排文件
? ? ? 對于個別項目,可以直接通過Docker run等指令啟動容器服務,但對于多個項目服務來有必要通過Docker compose編排工具運行服務。
? ? ? 接下來,就為microservice-mallmanagement添加一個docker-composeyml編排文件以便后續使用Docker compose編排工具,具體如文件所示
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlnetworks:- microservice-netenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761networks:- microservice-netdeploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050networks:- microservice-netdepends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:- microservice-netnetworks:microservice-net:
volumes:microservice-mysql:
3、環境搭建及鏡像準備
3.1、搭建Docker主機
3.2、安裝應用編譯工具JDK
3.3、安裝應用打包工具Maven
3.3.1、下載Linux版本的Maven工具包,并解壓:下載地址http://maven.apache.org/download.cgi
3.3.2、將解壓包移動到自定義目錄下(這里將解壓包直接移動到了opt目錄下)
3.3.3、配置Maven環境變量。修改/etc/profile文件,
#set maven envirment
export M2_HOME=/opt/apache-maven-3.6.1/
export M2=$M2_HOME/bin
export MAVEN_OPTS="-Xms256m -Xmx512m"
export PATH=$M2:$PATH
3.4、鏡像準備
由于之前3小節中dockerfile -maven的配置,在完成打包后也會自動構建鏡像并推送到指定倉庫,但無論是推送到Docker Hub還是本地私有鏡像倉庫,必須先登錄認證才可進行推送。所以為了能夠自動打包、構建鏡像和推送鏡像,在使用mvn install 命令打包之前,除了需要預先在dockerfile -maven插件配置中配置<useMavenSettingsForAuth>標簽屬性值為true外,還需要在Maven的settings.xml 配置文件(參考上一小節基礎環境搭建時Maven的安裝位置,此示例中的地址為/opt/apache -maven-3.5.0/confsettings.xml )中配置服務認證信息,具體配置內容如下( 注意要配置在<servers>標簽內)。
<id>192.168.159.143:5000</id><username>yxk</username><password>123</password>
? ? ? ? 配置完成后,就可以將微服務項目microservice-malimanagement復制到manager1 服務主機的某個工作目錄下,并進入到該項目pom文件所在位置(最外層的pom文件目錄),然后使用mvn install 指令進行打包(首次打包會進行pom依賴文件的下載,所以需要一定的時間)。
? ? ? 執行完mvn install指令后的效果如下圖所示。
? ? ? 如果出現如上圖所示的“BUILD SUCCESS"信息,就表示打包、鏡像構建和推送成功。如果某個過程執行失敗,也可以從終端頁面查看錯誤信息。
? ? ? 當確定全部執行成功后,我們還可以實際確認。先通過docker images指令查看鏡像列表中是否有生成的指定鏡像,然后再次進入本地私有鏡像倉庫配置的掛載目錄/mntregistry/docker/rogistryN2/repositories進行確認,查看生成的鏡像是否也推送到了本地倉庫。
4、微服務的手動部署
4.1、集群服務中的網卡選擇性注冊
4.1.1、使用如下命令查看集群搭建后的網絡列表詳情。
docker network ls
? ? ?從上圖可以看出,當集群環境搭建完成后,會默認增加名為docker. gwbridge 和ingress的網絡。其中ingress是集群環境下所有服務默認的網絡管理方式,它主要用于在不同集群節點之間實現同一個服務的負載均衡,并且會默認為所有集群服務分配一個子網進行管理,而我們搭建微服務時,會根據需求自定義以overlay為驅動的網絡用于多服務之間的通信管理。
? ? ? 這樣,在搭建的集群環境下,就會出現多網卡網絡管理的情況。由于它們分別對應不同的業務管理,所以可能會使得注冊到Eureka中的服務地址有偏差,從而導致服務之間的通信失敗,以及API網關代理的通信失敗問題。
? ? ? 針對這個可能出現的問題,我們需要將自定義的網絡,選擇性地注冊到Eureka注冊中心上,具體的實現過程如下。
4.1.2、根據微服務項目的需求,在集群環境下預先自定義一 個以overlay為驅動的網絡進行本地集群服務網絡管理,具體操作指令如下。
?
docker network create -d overlay --subnet 10.0.0.0/24 microservice_net
? ? ? ?執行上述指令后,會創建一個以overlay為驅動,名為microservice-net的網絡,并且通過-- subnet參數指定該自定義網絡的子網地址以10.0開頭。
4.1.3、在所有需要注冊到Eureka 注冊中心的服務(包括microservice-gateway - zuul、microservice-orderservice和microservice-userservice服務)的配置文件application.yml中,添加指定注冊到Eureka中心的優選服務子網地址信息,具體內容如下。
spring:cloud:inetutils:preferred-networks:- 10.0 # 設置注冊到Eureka中心的優選服務地址
? ? ? 上述配置中,首先使用preferred-networks設置了該服務優選的網段以10.0開頭,這與上面自定義的子網地址屬于同一個網段;然后設置了prefer-ip-address屬性值為true,表示優選通過IP地址找到對應的服務名稱。
4.1.4、修改服務部署的編排文件docker-compose.yml,將所有服務啟動時的網絡設置為前面預先自定義的microservice_ net 網絡來進行網絡管理,將修改后的編排文件重命名為docker-compose - swarm.yml,如下所示。
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761deploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050depends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900depends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030depends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:default:external:name: microservice_net
volumes:microservice-mysql:
5、集群服務部署
5.1、登錄私有倉庫
docker login 192.168.159.143:5000
5.2、部署服務
注:進入為服務項目中docker-compose-swarm.yml文件所在目錄下,使用docker stack deploy部署服務,具體操作如下
docker stack deploy \
> -c docker-compose-swarm.yml \
> --with-registry-auth \
> mallmanagement
5.3、查看服務列表詳情
docker service ls
?
5.4、在集群管理節點上,使用docker stack 的相關指令查看整個微服務項目在集群節點的分配與啟動情況,
docker stack ps mallmanagement
5.5、上述指令中,docker stack ps用于查看整個微服務項目在集群節點的分配與啟動情況,其中的mallmanagement就是在部署集群服務時指定的服務名稱。
? ? ? 另外,由于在集群環境下部署服務是在后臺啟動的,所以在Docker客戶端無法查看各個服務的啟動詳情。這里可以在集群管理節點上通過Docker service提供的服務日志指令來進一步查看某個具體服務從啟動到運行的整個日志情況,具體操作指令如下。
docker service logs -f mallmanagement_oder-service
?
6、微服務測試
6.1、通過visuallizer集群服務可視化工具查看服務啟動情況。微服務項目部署成功后,可以通過地址http://192.168.159.143:8081/(注意這是我的項目中manager1的主機地址,讀者測試時要使用自己的主機地址)查看集群服務可視化工具visualizer 界面的顯示情況,效果如圖所示。
6.2、通過Eureka注冊中心查看服務的啟動情況。我們還可以通過地址Http://192.168.159.143:8761/訪問服務注冊中心的情況。
6.3、將數據庫數據初始化。此項目中MySQL數據庫是使用Docker容器構建的,所以對MySQL數據庫服務上,具體操作如下。
sudo apt install mysql-client-core-5.7
? ? ?
? ? ? ?執行上述指令后,就會在當前Docker 機器上安裝一一個版本為5.7的MySQL客戶端(這是使用當前Ubuntu下自帶的安裝包進行安裝的),通過該客戶端我們就可以連接到剛才啟動的MySQL數據庫服務上,具體操作指令如下。
$ mysql -h 127.0.0.1 -uroot -P
? ? ? ?執行上述指令并連接成功后,就可以參考第9章中的9.1.3 小節對數據庫microservice_mallmanagement中的表和數據進行初始化了。
? ? ? 當然我們也可以不用在Docker機器上安裝MySQL客戶端來連接數據庫進行數據操作,通過MySQL客戶端連接工具(如Navicat )連接到啟動的MySQL數據庫的服務地址也可以進行數據庫數據的初始化操作。
6.4、測試微服務。
分別連接用戶管理微服務和訂單管理微服務的訪問地址進行測試,具體地址分別為htp:/:/192. 168.197.143:8030/swagger-ui.html和htp://192.168.197.143:7900/swagger-ui.html (讀者需要根據自己項目的服務地址進行訪問)。此時測試方式同https://blog.csdn.net/qq_37823605/article/details/91379272?中的Swagger-U效果測試完全一樣。
6.5、測試驗證API網關服務。
訂單微服務接 口調用方法為http://192.168.159.143:7900/order-service/order/findOrders/1,而用戶微服務接口調用方法為http://192.168.159.143:8050/order-service/order/findOrders/shitou,當使用Zuul 網關代理服務后,這兩個微服務接口調用方法則分別更改為http://192.168.159.143:8050/order-service/order/findOrders/1和http://192.168.159.143:8050/order-service/order/findOrders/shitou(此時通過API網關訪問其他所有的微服務時,訪問者只會看到訪問的是同一一個服務地址下的內容)。
?
7、使用Jenkuns自動部署微服務
7.1、Jenkins安裝
7.1.1、下載Jenkins。官網地址:https://jenkins.io/download/
7.1.2、啟動Jenkins服務
java -jar jenkins.war --httpPort=49001
7.1.3、Jenkins初始化安裝。
a)初始化認證密碼
b)初始化插件安裝
c)創建管理員用戶
?
?
?
7.2、Jenkins集成插件配置
7.2.1、安裝Maven插件
7.2.2、系統全局插件配置
?
7.3、服務自動化部署
7.3.1、構建新任務
7.3.2、配置源碼倉庫地址??https://github.com/Datacloudeyeshot/docker.git
7.3.3、構建觸發器
?
7.3.4、服務發布配置
7.4、自動化部署服務
7.4.1、選擇Console Output查看輸出信息
7.4.2、輸出信息頁面
7.4.3、控制臺信息提示
?
總結:
1、集群部署過程中,創建網絡檢查網段是否沖突;
2、項目打包mvn install 時注意給項目包一定的執行權;
3、切換管理員用戶時,注意source一下環境變量,使maven和java的環境變量生效;
4、在install過程中注意網絡的連通性。
?
?
?
?
?
?
?
?
?
?
?
總結
- 上一篇: 微服务项目的整合与测试
- 下一篇: Sqoop的基础应用