微服务项目的部署

news/2024/7/5 5:15:34

练习目标

  • 掌握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过程中注意网络的连通性。

 

 

 

 

 

 

 

 

 

 

 


http://lihuaxi.xjx100.cn/news/238351.html

相关文章

优雅的理解 call 和 apply 的使用方法

作者在看到一篇优雅的使用 js 的各种方法解决算法的时候产生的疑问&#xff0c;到底什么时候使用 apply 和 call 啦&#xff1f; 每次看到别人用 apply 和 call 其实从以前的懵懵懂懂到现在的明白&#xff0c;但是自己从来未下手去用过&#xff0c;最近比较闲。开始打一下 Jav…

为什么基于区块链的系统比您认为的更高效

想知道更多区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;我们最近见证了Web是如何深刻地改变了各种业务的&#xff0c;其中包括市场的实现方式:Web驱动的市场通常遵循这种模式。 在这个方案中&#xff0c;我主要关注实现…

Sqoop的基础应用

实验目的要求 了解ET了工具Sqoop&#xff1b;学会安装配置Sqoop&#xff1b;学会使用数据迁移框架Sqoop&#xff1b;使用Sqoop导入MySQL到HDFS和Hive&#xff1b;使用Sqoop导出HDFS数据到MySQL&#xff1b; 实验环境 Java jdk 1.7&#xff1b;apache-maven-3.6.0&#xff1b;…

编码和编码格式一样吗?_学习如何像专业人士一样编码

编码和编码格式一样吗?Learn how to write more professional code from Dylan Israel. Dylan teaches about tools and principles to improve your code that hes found helpful in his job as a developer.从Dylan Israel了解如何编写更专业的代码。 Dylan教授有关改善您的…

区块链的分布式网络结构有哪些特点?

想知道更多区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客&#xff0c;有问必答&#xff01;&#xff01;区块链建立的物理网络基础是点对点的分布式网络&#xff0c;这与中心化的“客户端/服务器”网络架构有很大不同&#xff0c;它是一种去中心化的网络&a…

SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署

前言 本篇文章引导你使用Jenkins部署[SpringBoot项目],同时使用Docker和Git实现简单的持续集成和持续部署。&#xff08;项目地址&#xff1a;sso-merryyou&#xff09; 流程图如下&#xff1a; push代码到Github触发WebHook。&#xff08;因网络原因&#xff0c;本篇使用gitee…

Spark的基础应用

目的要求 搭建Spark集群环境&#xff1b;Spark集群的启动、浏览与关闭&#xff1b;使用Eclipse编写Spark应用程序包&#xff1b;如何运行Spark任务&#xff1b; 实验环境 Java jdk 1.7&#xff1b;apache-maven-3.6.0&#xff1b;Eclipse&#xff1b;Apache_Hadoop集群&#…

以太坊中的安全代币案例

想知道更多关于区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】 链客 &#xff0c;有问必答&#xff01;我在关于安全令代币&#xff08;第一部分&#xff0c;第二部分&#xff09;有争议的文章中&#xff0c;我提到过&#xff0c;以太坊可能不是长期执行安全代币…