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