大觅网之业务部署(Business deployment of Da Mi Network)
大觅网为用户提供了通过 Web 界面购票的服务,主要功能包括:商品搜索、用户注册登录、商品详情、选座、下单等功能。大觅网的整个部署过程会用到云计算的相关知识,包括 OpenStack 的多节点部署、OpenStack 网络路由创建和云主机创建;也会用到 Docker 容器的相关知识,包括Dockerfile 制作镜像、Docker Compose 多容器关联制作等;还会用到 Jenkins 自动构
·
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
本人主要分享计算机核心技术:系统维护、数据库、网络安全、自动化运维、容器技术、云计算、人工智能、运维开发、算法结构、物联网、JAVA 、Python、PHP、C、C++等。
不同类型针对性训练,提升逻辑思维,剑指大厂,非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。
大觅网之业务部署
技能目标:
-
熟练使用
Jenkins
拉取代码、构建
maven
项目
-
掌握
Tengine
配合
Lua
图片裁剪的搭建
2.1 案例分析
2.1.1 案例概述
某公司最近开发了一套大型票务类电商网站,被命名为大觅网。大觅网为用户提供了通
过
Web
界面购票的服务,主要功能包括:商品搜索、用户注册登录、商品详情、选座、下
单等功能。大觅网的整个部署过程会用到云计算的相关知识,包括
OpenStack
的多节点部
署、
OpenStack
网络路由创建和云主机创建;也会用到
Docker
容器的相关知识,包括
Dockerfile
制作镜像、
Docker Compose
多容器关联制作等;还会用到
Jenkins
自动构建发
布大觅网项目。整个项目采用多知识相结合,共同协调配合来完成部署。本案例主要介绍大
觅网的业务部署。
2.1.2 案例前置知识点
1. 什么是 Tengine
Tengine
是由淘宝网发起的
Web
服务器项目。针对网站访问量大的需求,它基于开源
软件
Nginx
进行了优化,添加了很多高级功能和特性。
Tengine
的性能和稳定性已经在淘宝
网、天猫商城等大型网站得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、
易用的
Web
平台。从
2011
年
12
月开始,
Tengine
成为一个开源项目。
Tengine
团队在积
极地开发和维护这个项目,其团队的核心成员来自于淘宝、搜狗等互联网企业,它是社区合
作的成果。
2. 什么是 Nexus
Nexus
是
Maven
仓库管理器,也可以叫
Maven
私服。它功能强大,极大地简化了自
己内部仓库的维护和外部仓库的访问。利用
Nexus
只在一个地方就能够完全控制访问和部
署仓库中的每个
Artifact
。
Nexus
是一套
“
开箱即用
”
的系统,不需要数据库,它使用文件系
统和
Lucene
组织数据。
Nexus
不是
Maven
的核心概念,它仅仅是一种衍生出来的特殊的
Maven
仓库。对于
Maven
来说,仓库分为三种:本地仓库、远程仓库和中央仓库。本地仓库就是在
Maven
的
setting.xml
文件中配置的本地仓库地址。由于最原始的本地仓库是空的,因此,
Maven
必
须知道至少一个可用的远程仓库,才能在执行
Maven
命令的时候下载到需要的构件。中央
仓库是
Maven
默认的远程仓库。私服是架设在局域网的一种特殊的远程仓库,目的是代理
远程仓库及部署第三方构件。有了私服之后,当
Maven
需要下载构件时,直接请求私服。
如果私服上存在,则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,
再提供给本地仓库下载。
3. 什么是 Sonar
Sonar
是一个用于代码质量管理的开放平台。通过插件机制,
Sonar
可以集成不同的
测试工具、代码分析工具以及持续集成工具。与持续集成工具(例如
Hudson/Jenkins
等)
不同,
Sonar
并不是简单地把不同的代码检查工具结果直接显示在
Web
页面上,而是通
过不同的插件对这些结果进行再加工处理。通过量化的方式度量代码质量的变化,从而可以
方便地对不同规模和种类的工程进行代码质量管理。
在对其他工具的支持方面,
Sonar
不仅提供了对
IDE
的支持,还可以在
Eclipse
和
IntelliJ IDEA
这些工具里联机查看结果;同时
Sonar
对大量的持续集成工具提供了接口支
持,可以很方便地在持续集成中使用
Sonar
。此外,
Sonar
的插件还可以对
Java
以外的
其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
4. 什么是 Mycat
MyCat
是一个开源的,面向企业应用开发的大数据库集群。它是目前最流行的基于
java
语言编写的数据库中间件,是一个实现了
MySQL
协议的服务器。前端用户可以把它看作
是一个数据库代理,用
MySQL
客户端工具和命令行访问,而其后端可以用
MySQL
原生协
议与多个
MySQL
服务器通信,也可以用
JDBC
协议与大多数主流数据库服务器通信,其
核心功能是分库分表。配合数据库的主从模式还可实现读写分离。
MyCat
是基于阿里开源的
Cobar
产品而研发,
Cobar
的稳定性、可靠性、优秀的架构
和性能以及众多成熟的使用案例使得
MyCat
变得非常的强大。
MyCat
发展到目前的版本,
已经不是一个单纯的
MySQL
代理了,它的后端可以支持
MySQL
、
SQL Server
、
Oracle
、
DB2
、
PostgreSQL
等主流数据库,也支持
MongoDB
这种新型
NoSQL
方式的存储,未来
还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在
MyCat
里,都是
一个传统的数据库表,支持标准的 SQL
语句进行数据的操作。对前端业务来说,可以大幅
降低开发难度,提升开发速度。
2.1.3 案例环境
1. 本案例实验环境
本案例基于教材《
OpenStack
云平台实战》第三、四章中
OpenStack
多节点部署和云
主机创建。在
OpenStack
上创建两台虚拟云主机作为实验环境,具体云主机环境配置如表
2-1
所示。
表
2-1
大觅网搭建环境
主机 | 操作系统 | 主机名/IP 地址 | 主要软件 |
虚拟云主机 | CentOS 7.3-x86_64 | damiwang/192.168.9.18 | OpenStack、Docker 等 |
虚拟云主机 | CentOS 7.3-x86_64 | gitlab/192.168.9.13 | Gitlab |
技术架构用来描述大觅网整体业务实现采用的具体技术。大觅网的技术架构如图
2.1
所
示。
图
2.1
大觅网技术架构图
大觅网整体采用
Docker
的方式进行项目环境搭建和配置。
采用
MySQL
作为大觅网数据库,并采用集群方式进行配置和部署。
为了能满足数据库灵活扩展的要求,采用
MyCat
数据库中间件管理数据库集群。
为了满足商品数据的查询性能和精准搜索的功能性需求,大觅网使用
Elasticsearch
集
群实现商品信息的存储和搜索。
为了更好地满足性能要求,将部分常用数据缓存在
Redis
中。
采用
Spring Cloud
微服务架构实现微服务治理,将应用拆分为提供者、消费者、网关
及注册中心。
在提供者和消费者的具体实现上,采用
Spring Cloud
整套解决方案,包括使用
Fegin
进行接口管理、使用
Hystrix
进行容错和监控、使用
Ribbon
实现负载均衡等。
项目采用前后端分离技术,将数据的业务逻辑处理和展示分开,将数据展示独立为前端
项目。前后端采用
Nginx
反向代理实现接口访问。
为了节省项目部署时间,项目整体采用
Jenkins
实现程序的自动发版,实现持续集成,
也可简写为
CI
(
Continuous Integration
)。
大觅网应用架构是采用基于微服务设计思想的模块化开发,针对不同的业务配置了相应
的数据库,大觅网的数据库结构组成如图 2.2 所示。
图
2.2
数据库架构图
大觅网数据库包括
6
个独立的数据库,分别为基础库、节目库、订单库、支付库、排
期库和用户库。
大觅网数据库在设计过程中采用
MyCat
实现水平分库,将订单库做进一步的拆分,拆
分后的三个子订单库分别为订单库
1
、订单库
2
、订单库
3
,三个子订单库的结构相同。
3. 案例环境用到的用户名和密码
表
2-2
是大觅网案例中预设的用户及密码。
表
2-2
案例中使用到的用户名和密码
类型 | 用户名 | 密码 |
Gitlab | root | bdqn123456 |
MySQL | root | 123456 |
Jenkins | admin | 123456 |
Nexus | admin |
admin123
|
4. 案例需求
本案例的需求如下:
(
1
)创建
Gitlab
仓库,用于存放大觅网后端
Java
程序源码。
(
2
)使用
Docker
创建
Base
基础软件包环境。
(
3
)通过
Jenkins
构建生成大觅网程序
jar
包并发布。
5. 案例实现思路
本案例的实现思路如下:
(
1
)部署
Gitlab
代码仓库。
(
2
)通过
Docker
部署
Tomcat
、
JDK
、
CentOS-ssh
三个基础镜像。
(
3
)部署
Shipyard
容器管理工具。
(
4
)通过
Docker
部署
Redis
、
Tengine
、
ELK
、
Kafka
、
Nexus
、
MySQL
、
Sonar
、
RabbitMQ
、
Mycat
、
Jenkins
基础镜像。
(
5
)配置
MySQL
数据库权限,导入数据库的表结构。
(
6
)通过
Jenkins
自动化工具构建业务
jar
包并发布。
(
7
)通过浏览器访问测试大觅网。
2.2 案例实施
2.2.1 使用 Jenkins 构建业务类项目
1. 凭据的创建
首先创建一个
“
凭据
”
,这个
“
凭据
”
的作用是为
Jenkins
拉取
Gitlab
项目代码时,提供身
份认证功能。如果没有配置
“
凭据
”
或者配置的不对,就会出现报错,最终导致拉取不到
Gitlab
项目。在
Jenkins
首页左侧菜单栏中单击
“
凭据
”
后,即可进入凭据默认页,如图
2.3
所示。
图
2.3
凭据默认页
单击图
2.3
中间的
“
全局
”
,进入全局凭据页面,如图
2.4
所示。
图 2.4 全局凭据页面
本案例使用全局凭据对业务项目进行验证。单击左侧菜单栏的
“
添加凭据
”
链接,进入添
加新凭据页面,如图
2.5
所示。
图 2.5 凭据的创建
在图
2.5
中,
“
类型
”
选用默认的
“Username with password”
、
“
范围
”
选择
“
全局
”
、
“
用户
名
”
和
“
密码
”
填写访问
Gitlab
仓库的权限(可参考案例环境中的权限表格)、
“ID”
是通过任务
或配置定义的内部唯一
ID
(默认留空即可,在创建的过程中会自动生成)、
“
描述
”
内填写凭
据的具体用途(是备注说明)。填写完成后,单击
“
确定
”
按钮完成凭据的创建。
2. common 项目的构建
common 项目属于基础项目,包含若干子项目,该项目存在的目的就是在 Jenkins 构建
时将生成的包文件上传到私有仓库
Nexus
内,以供后续项目编译构建使用。
在构建
common
项目之前需确保在
Jenkins
容器内访问
nexus.local.com
地址可以指向
Nexus
私有仓库,即在
Jenkins
容器内的
/etc/hosts
文件中写入域名
nexus.local.com
的
IP
地址解析。该域名解析默认已经在
/home/px2/envdm/docker-compose.yml
文件内进行了定
义,在基础服务部署过程中已经集成进了容器,可通过如下命令查看核实。
[root@damiwang envdm]#
docker-compose exec jenkins bash
//
注意所在目录
[root@676bae0eb20a webapps]#
cat /etc/hosts | grep nexus
192.168.10.13
nexus.local.com
//
确认
hosts
文件内包含
nexus.local.com
解析
在环境部署时,通过
docker-compose.yml
启动众多基础服务后,各容器的
IP
地址已
经固定,因为在
docker-compose.yml
配置文件内已经给各容器分配了固定
IP
地址。查看
容器
IP
的方法为
docker inspect
容器
ID/
容器名字。此过程中,有几个容器的
IP
地址要注
意下:
Jenkins
容器的
IP
为
192.168.10.12
,
Tengine
容器的
IP
为
192.168.10.13
,
Nexus
容器的
IP
为
192.168.10.7
。
此外,
Tengine
容器内
/etc/nginx/nginx.conf
配置文件还需要包含
Nexus
跳转内容,将
域名
nexus.local.com
指向
Nexus
容器
IP
。该内容在通过
Dockerfile
构建
Tengine
容器时
已经包含进去了,这里只需检查确认。
#nexus.local.com
server {
listen
80;
server_name nexus.local.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://192.168.10.7:8081;
}
error_page
500 502 503 504 /50x.html;
location = /50x.html {
root
html;
index index.html index.htm index.jsp index.action default.html;
}
}
之所以进行上面域名解析和
Nginx
配置的检查,是因为
common
项目源码程序内
Nexus
仓库地址配置的是域名
nexus.local.com
,无法通过
IP
地址访问到
Nexus
仓库。在
Jenkins
上编译该项目时,解析
nexus.local.com
域名,就会先到
hosts
内查找对应的
IP
地址,
IP
地址指向了
Tengine
,在
Tengine
配置文件内又定义跳转到
Nexus
容器仓库的
8081
端口上,
这样即可完成
Nexus
仓库的访问。
上述配置完成后,开始在
Jenkins
上创建
common
项目。在
Jenkins
首页单击
“
新建任
务
”
,设置项目名称为
“common”
,并选择
“
构建一个
maven
项目
”
,然后单击
“
确定
”
,如图
2.6
所示。
图 2.6 common 项目的创建
注意
:在创建
Jenkins
项目时,如果没有出现
“
构建一个
maven
项目
”
选项,是因为
Maven
插件没有正确安装,需要检查插件是否安装成功。如果安装成功还无法显示,请尝试重启
Jenkins
服务。
进入
common
项目的详细配置页面后,在
“
源码管理
”
选项块内选择
“Git”
,
“Repository
URL”
填写
common
项目地址
“http://192.168.9.13/root/common.git”
,
“Credentials”
选择之前
添加的
daimiwang
凭据,
“
指定分支
”
保持默认值,是因为项目放到了代码仓库的
master
主
干下,如图
2.7
所示。
图 2.7 源码管理配置
接下来,在
“Build”
选项块,填写项目的
pom.xml
文件地址和要执行的
Maven
命令。
“
Root
POM”
配 置 的 值 是
“dm-common/pom.xml”
, 填 写 时 主 要 考 虑
pom.xml
文 件 在 项 目 内
dm-common
目录下。
“Goals and options”
填写
“clean deploy -Dmaven.test.skip=true”
,这
是
maven
编译构建时需要的命令,如图
2.8
所示。
图 2.8 Maven 编译相关命令
注意
:这里的
Root POM
路径有默认前缀,默认前缀就是
/root/.jenkins/workspace/
,
是
Jenkins
通过
Git
命令
clone
项目后保存到
Jenkins
容器内的目录,默认前缀不需要填写,
只需要填写
“dm-common/pom.xml”
。最后单击左下角的
“
保存
”
按钮。
在正式开始构建
common
项目之前,还需要手动上传
Alipay
和
Jms
相关包。这两个程
序在发布包的路径为
“
大觅网
\
大觅私服
nexus
手动上传包
”
目录下。
手动上传
Alipay
和
Jms
的过程如下:
浏览器访问私有仓库地址
http://192.168.9.18:8081
。单击右上角的
“Log In”
,默认用户
名密码为
“admin/admin123”
,输入后进入
Nexus
,如图
2.9
所示。
图 2.9 Nexus 登录界面
进入主界面后,单击左侧菜单栏的
“Repositories”
,如图
2.10
所示。
图 2.10 Nexus 仓库界面
以
Alipay
包上传为例,在中间仓库区域找到
“3rd party”
,左键单击
“3rd party”
,在下方
各属性的最右侧单击的
“Artifact Upload”
选项。
“
GAV Definition”
选择
“From POM”
,下方
“POM
Filename”
通过
“Select POM to Upload”
选择对应的
pom
文件,该文件在发布包内的路径为:
大 觅 网 \ 大 觅 私 服 nexus 手 动 上 传 包 \cn\itrip\alipay\itrip-alipay-pc\1.0\itrip-alipay-pc-1.0.pom。 另外,“Select Artifact(s
)
for Upload”
下的
“Filename”
选择对应的
itrip-alipay-pc-1.0.jar
,
该
jar
包跟上面
pom
文件在同目录下,如图
2.11
所示。
图 2.11 上传包到
nexus
这里有一个地方容易忽略,导致上传失败,如图
2.12
所示。
图 2.12 添加
Artifact
Jar
文件选择完成后,一定要单击下左侧的
“Add Artifact”
按钮,将文件送入
“Artifacts”
方
框内。如图
2.13
所示。
图 2.13 Artifacts 选入
最后,单击最下方的
“Upload Artifact(s)”
按钮进行上传。
另一个
Jms
包上传方法跟
Alipay
包的上传方法一样,在同样的位置进行上传。
pom
和
jar
文件在发布包的路径为:大觅网
\
大觅私服
nexus
手动上传包
\javax\jms\jms\1.1
。这两个
文件分别为:
jms-1.1.pom
和
jms-1.1.jar
。添加完文件后,单击最下方的
“Upload Artifact(s)”
按钮上传。
Alipay
和
Jms
相关包上传完成后,如果实验使用的
IP
地址与本案例不同的
IP
地址,
还需要检查下
Jenkins
容器内
/root/.m2/settings.xml
文件,将
“192.168.9.18”
变更为自己的
IP
地址。可通过如下命令实现。
[root@damiwang envdm]#
docker-compose exec jenkins bash
//
注意所在目录
[root@676bae0eb20a webapps]#
grep 192.168.9 /root/.m2/settings.xml
<url>http://192.168.9.18:8081/content/groups/public/</url>
[root@676bae0eb20a webapps]#
sed -i 's/192.168.9.18/192.168.9.x/' /root/.m2/settings.xml
//
以
x
代替实际
IP
如果实验使用到的
IP
地址是
192.168.9.18
,上面步骤可以不用执行。
完成以上内容后,就可以开始构建
common
项目。单击首页的
common
项目,然后单
击左侧的
“
立即构建
”
,实现代码的编译构建,完成向
Nexus
仓库提交资源包,如图
2.14
所
示。
图 2.14 构建
common
项目
可以切换到控制台输出,观察输出内容,首次构建需要的时间较长,需要耐心等待。可
通过
“Build History”
进入
“
控制台输出
”
。在图
2.15
中,将鼠标移动到
“#1”
后,后面会出现一
个下拉三角,单击三角就会出现如图
2.16
所示情况,选择
“
控制台输出
”
就切换到了控制台
输出页面。
图 2.15 编译历史
图 2.16 进入控制台输出
等编译结束后,会有
“SUCCESS”
提示,如下所示。
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for dm-common 1.0-SNAPSHOT:
[INFO]
[INFO] dm-common .......................................... SUCCESS [01:45 min]
[INFO] dm-common-dto ...................................... SUCCESS [08:24 min]
[INFO] dm-common-module ................................... SUCCESS [ 2.415 s]
[INFO] dm-common-dao ...................................... SUCCESS [01:35 min]
[INFO] dm-common-utils .................................... SUCCESS [01:08 min]
[INFO] dm-common-client ................................... SUCCESS [09:13 min]
[INFO] dm-common-ext-utils ................................ SUCCESS [ 37.881 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 22:58 min
[INFO] Finished at: 2020-05-17T13:15:59Z
[INFO] ------------------------------------------------------------------------
Waiting for Jenkins to finish collecting data
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-utils/pom.xml
to
cn.dm/dm-common-utils/1.0-SNAPSHOT/dm-common-utils-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-utils/target/dm-common-utils-1.0-SNAPSHOT.jar
to
cn.dm/dm-common-utils/1.0-20200517.130604-1/dm-common-utils-1.0-20200517.130604-1.jar
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/pom.xml
to
cn.dm/dm-common/1.0-SNAPSHOT/dm-common-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-dto/pom.xml
to
cn.dm/dm-common-dto/1.0-SNAPSHOT/dm-common-dto-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-dto/target/dm-common-dto-1.0-SNAPSHOT.jar
to
cn.dm/dm-common-dto/1.0-20200517.130315-1/dm-common-dto-1.0-20200517.130315-1.jar
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-dao/pom.xml
to
cn.dm/dm-common-dao/1.0-SNAPSHOT/dm-common-dao-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-dao/target/dm-common-dao-1.0-SNAPSHOT.jar
to
cn.dm/dm-common-dao/1.0-20200517.130455-1/dm-common-dao-1.0-20200517.130455-1.jar
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-client/pom.xml
to
cn.dm/dm-common-client/1.0-SNAPSHOT/dm-common-client-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-client/target/dm-common-client-1.0-SNAPSHOT.jar
to
cn.dm/dm-common-client/1.0-20200517.131518-1/dm-common-client-1.0-20200517.131518-1.jar
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-module/pom.xml
to
cn.dm/dm-common-module/1.0-SNAPSHOT/dm-common-module-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-module/target/dm-common-module-1.0-SNAPSHOT.jar to
cn.dm/dm-common-module/1.0-20200517.130319-1/dm-common-module-1.0-20200517.130319-1.jar
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-ext-utils/pom.xml
to
cn.dm/dm-common-ext-utils/1.0-SNAPSHOT/dm-common-ext-utils-1.0-SNAPSHOT.pom
[JENKINS]
Archiving
/root/.jenkins/workspace/common/dm-common/dm-common-ext-utils/target/dm-common-ext-utils-1.0-SNAPSHOT.jar
to cn.dm/dm-common-ext-utils/1.0-20200517.131557-1/dm-common-ext-utils-1.0-20200517.131557-1.jar
channel stopped
Finished: SUCCESS
至此,
dm-common
项目编译完成。
3. dm-common-module 项目的构建
common
项目构建完成后,即可开始构建
dm-common-module
项目。在
Jenkins
首页
单击
“
新建任务
”
,然后输入任务名称
“dm-common-module”
并选择
“
构建一个
maven
项目
”
,
之后单击
“
确定
”
按钮。如图 2.17 所示。
图
2.17 dm-common-module
项目创建
在
“
源 码 管 理
”
选 项 块 内 , 选 择
“Git”
。
“Repository URL”
填 写
http://192.168.9.13/root/common.git
。这里需要注意一下,项目仓库地址跟
common
项目
一样,是因为
dm-common-module
是
common
的子项目,以此类推
dm-common
下的其
他子项目仓库地址都是一样的。
“Credentials”
选择该项目的
Git
认证凭据,
“
指定分支
”
保持
默认,如图 2.18 所示。
图
2.18 dm-common-module
项目源码管理模块
接下来在
“Build”
选项块,填写项目的
pom.xml
文件地址和想要执行的
Maven
命令。
Root POM
填写
“dm-common/dm-common-module/pom.xml”
,填写
pom
文件的实际位置。
“Goals and options”
填写
“clean deploy -Dmaven.test.skip=true”
,如图
2.19
所示。
图 2.19 dm-common-module 项目
build
选项块
以上信息填写完成后,单击左下角的
“
保存
”
按钮保存退出。然后单击
“
立即构建
”
,完成
向
Nexus
仓库提交资源包。至此,完成了
dm-common-module
项目的构建。
dm-common
下还有几个子项目,创建和构建步骤跟
dm-common-module
类似,依照
dm-common-module
项 目 的 创 建 和 构 建 过 程 , 依 次 创 建 并 构 建
dm-common-dto
、
dm-common-dao
、
dm-common-client
、
dm-common-utils
、
dm-common-ext-utils
子项目。
dm-common
项 目 及 子 项 目 在
Jenkins
构 建 顺 序 是 :
dm-common→dm-common-module→dm-common-dto→dm-common-dao→dm-common-
client→dm-common-utils→dm-common-ext-utils
。
dm-common
和其子项目是整个项目的公共依赖包,只需要构建一次。这些公共依赖包
构建完成后,可继续构建 dm-base-consumer、dm-user-consumer 等剩下的其他业务项目。
4. env-project 项目的构建
在开始
env-project
业务项目的构建之前,需先将
Gitlab
上业务源码配置文件内对应的
IP
地址改为自己实验环境的
IP
地址,如果采用跟本案例相同的
IP
地址则不需要修改。需
要修改
IP
地址的配置文件如下所示。
env_project/dm-config-server/src/main/resources/application.yml
env_project/dm-gateway-zuul/src/main/resources/application.yml
env_project/dm-gateway-zuul/src/main/resources/bootstrap.yml
env_project/dm-zipkin-server/src/main/resources/application.yml
dm-base-consumer/dm-base-consumer/src/main/resources/application.yml
dm-base-provider/dm-base-provider/src/main/resources/application.yml
dm-user-consumer/dm-user-consumer/src/main/resources/application.yml
dm-user-provider/dm-user-provider/src/main/resources/application.yml
dm-order-consumer/dm-order-consumer/src/main/resources/application.yml
dm-order-provider/dm-order-provider/src/main/resources/application.yml
dm-pay-consumer/dm-pay-consumer/src/main/resources/application.yml
dm-pay-provider/dm-pay-provider/src/main/resources/application.yml
dm-scheduler-consumer/dm-scheduler-consumer/src/main/resources/application.yml
dm-scheduler-provider/dm-scheduler-provider/src/main/resources/application.yml
dm-item-consumer/dm-item-consumer/src/main/resources/application.yml
dm-item-provider/dm-item-provider/src/main/resources/application.yml
dm-item-search/dm-item-search/src/main/resources/application.yml
上面这些文件内默认的
IP
地址是
192.168.9.18
,直接将
IP
地址写入了配置文件内。在
实际实验过程中需改成自己的
IP
地址。修改方式可以采用本地
Git bash
修改后提交到仓库,
也可以通过
Gitlab
页面直接编辑修改。
env-project
项目由
4
个子项目构成,分别是
dm-config-server
、
dm-discovery-eureka
、
dm-gateway-zuul
、
dm-zipkin-server
,如图
2.20
所示。
图 2.20 env-project 项目
这
4
个子项目需要分别构建,首先来创建
dm-discovery-eureka
项目。在
Jenkins
主页
面,单击
“
新建任务
”
,然后输入任务名称
“dm-discovery-eureka”
并选择
“
构建一个
maven
项
目
”
,单击
“
确定
”
按钮,如图
2.21
所示。
图 2.21 dm-discovery-eureka 项目的创建
进入项目配置页面后,首先进行
“
源码管理
”
选项块的配置,
“Repository URL”
的内容是
“http://192.168.9.13/root/env-project.git”
,具体配置如图 2.22 所示。
图 2.22 dm-discovery-eureka
项目源码选项块
接 着 进 行
“Build”
选 项 块 的 配 置 , 如 图
2.23
所 示 设 置
Root POM
的 值 为
“dm-discovery-eureka/pom.xml”
、
Goals and options
的 值 为
“clean package
-Dmaven.test.skip=true”
。
注意:这里的命令是
“package”
,前面的
common
及其子项目使用的是
“deploy”
,
“
deploy”
可以将生成的
jar
包部署到本地
Maven
仓库和远程
Maven
私服仓库,而
“package”
则不会,
这是二者的区别。
图 2.23 dm-discovery-eureka 项目
Build
选项块
接着选择
Jenkins
项目构建后需执行的程序命令,在
“
构建后操作
”
内单击
“
增加构建后操
作步骤
”
选择
“Send build artifacts over SSH”
,如图 2.24 所示。
图 2.24 构建后执行选项
最后配置业务
jar
包发布及通过
Docker
程序启动的相关命令,通过提前配置好的
SSH
将
Jenkins
构建生成的
jar
包推送到远程服务器,就是推送到云主机
192.168.9.18
,然后在
云主机上通过
Docker
将对应
jar
包启动,如图
2.25
所示。
图 2.25 构建后执行的
Docker
编译启动配置
Name
:是之前创建的
SSH Server
,在哪个服务器上面发布就选哪个。
Source files
:
Jenkins
容 器 内 源 码 编 译 后 所 在 的 位 置 , 此 项 目 值 为 :
dm-discovery-eureka/target/*.jar
。
Remove prefix
:去除前缀路径,此项目值为
dm-discovery-eureka/target/
。
Remote directory
:传送到的目的路径,此项目值为
dm/dm-discovery-eureka
。
Exec command
:在目标机器上面执行的命令,其值如下。
cd /home/px2/tools/dm
sudo `which docker-compose` stop discovery-eureka
sudo `which docker-compose` build discovery-eureka
sudo `which docker-compose` up -d discovery-eureka
在正式开始构建此项目之前,需要上传
“Spring Cloud
实施业务服务体系
”
整个目录的内
容到
damiwang
云主机的
/home/px2/tools/dm
目录内。
“Spring Cloud
实施业务服务体系
”
在提供的发布包内位置为:
“
大觅网
\Spring Cloud
实施业务服务体系
”
。上传完成后就可以开
始构建此项目。
注 意
:
“sudo `which docker-compose` stop discovery-eureka”
最 后 的
discovery-eureka
名称是
“Spring Cloud
实施业务服务体系
”
内
docker-compose.yml
内对应
的服务名。
构 建 完 成 后 , 检 查 该 容 器 是 否 正 常 运 行 , 可 以 通 过 访 问
Shipyard
(
http://192.168.9.18:8080/
)进行查看。如果
Shipyard
内可以看到此容器正在运行,说明
该项目构建发布成功,如图 2.26 所示。
图
2.26 Shipyard
内
dm-discovery-eureka
项目对应的容器
至此,
dm-discovery-eureka
项目构建完成。
接下来开始构建
dm-config-server
项目,操作步骤和
dm-discovery-eureka
项目类似,
需注意如下地方:
Repository URL
同样是
“http://192.168.9.13/root/env-project.git”
。
Root POM
的值为
“dm-config-server/pom.xml”
。
“
构建后操作
”
里面对应的项目名称改为
“config-server”
。
都配置完成后就可以开始构建了。
最后两个子项目
dm-gateway-zuul
、
dm-zipkin-server
的构建步骤也类似,配置对照着
改为对应的子项目名称即可开始构建。
注意
:
dm-gateway-zuul
项目在
docker-compose.yml
内对应的服务是
zuul-gateway
。
5. dm-base-consumer 项目的构建
Jenkins
首页内单击
“
新建任务
”
,然后输入任务名称
“dm-base-consumer”
,并选择
“
构建
一个
maven
项目
”
,之后单击
“
确定
”
按钮,如图
2.27
所示。
图 2.27 dm-base-consumer 项目创建
进入项目配置界面后,在源码管理选项卡下选中
“Git”
,
“Repository URL”
填写项目的
Git
地址
“http://192.168.9.13/root/base-consumer.git”
,
“Credentials”
选择该项目的认证凭
证,
“
指定分支
”
内保持默认,如图 2.28 所示。
图
2.28 dm-base-consumer
项目源码管理
接下来
,
在
“Build”
选项卡,填写项目的
pom.xml
文件的地址和要执行的
Maven
命令,
“Root POM”
值 为
“dm-base-consumer/pom.xml”
,
“Credentials”
值 为
“clean package
-Dmaven.test.skip=true”
,如图
2.29
所示。
图 2.29 Maven 编译相关命令界面
最后,在
“
构建后操作
”
选项卡下,选择
“Send build artifacts over SSH”
,如图
2.30
所示。
图 2.30 配置构建后操作
接着填写
“Send build artifacts over SSH”
相关内容,如图
2.31
所示。
图 2.31 配置构建后相关操作
单击左下角的
“
保存
”
按钮保存退出后,选择立即构建,等待
dm-base-consumer
构建完
成,此时对应业务的容器已经启动。可通过
docker ps -a
查看,也可以通过
Shipyard
查看,
可自由选择。
[root@damiwang dm]#
docker ps -a
CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
7e9a8d2cfa0b
dm_base-consumer
"java -server -Xms64…"
39
seconds ago
Up 38 seconds
22/tcp, 0.0.0.0:7000->7000/tcp
dm_base-consumer_1
6. dm-base-provider 项目的构建
Jenkins
首页单击
“
新建任务
”
,然后输入任务名称
dm-base-provider
并选择
“
构建一个
maven
项目
”
,之后单击
“
确定
”
按钮。如图
2.32
所示。
图 2.32 创建
dm-base-provider
项目
进入项目配置界面后,在源码管理选项卡下选中
“Git”
,
“Repository URL”
填写项目的
Git
地址为
“http://192.168.9.13/root/base-provider.git”
,
“
Credentials”
选择
damiwang
的认证
凭证,
“
指定分支
”
内保持默认,如图 2.33 所示。
图
2.33 dm-base-provider
项目源码管理
接下来在
“Build”
选项卡,填写项目的
pom.xml
文件地址及想要执行的
Maven
命令,如
图 2.34 所示。
图
2.34 Maven
编译相关命令界面
最后,在
“
构建后操作
”
选项卡下,选择
“Send build artifacts over SSH”
。配置通过
SSH
远程上传文件及远程
Docker
构建启动容器命令,如图
2.35
所示。
图 2.35 配置通过
SSH
操作容器内容
保存退出后,选择立即构建,等待
dm-base-provider
构建完成后,容器已经启动。可
通过
Shipyard
或者
docker ps -a
进行查看。
7. 其他项目的构建
大觅网的整体业务项目构成,如图
2.36
所示。
图 2.36 大觅网业务项目
其他项目的构建方法和
dm-base-consumer
的构建方法相同。需要特别注意:在
“
构建
后操作
”
步骤里
docker
命令最后的名称是
docker-compose.yml
内的服务名。剩余业务项目
的构建顺序没有特殊要求。
当所有的业务模块都构建完成后,可以访问微服务的注册中心,访问地址为
http://192.168.9.18:7776
,用户名是
root
,密码为
123456
。所有业务服务正常都应该已经
注册到了注册中心,如图
2.37
所示。
图 2.37 注册中心
2.2.2 项目测试
在 进 行 测 试 之 前 , 还 需 要 确 认 两 处 配 置 。
Tengine
容 器 内 , 前 端 文 件
/usr/local/dm/static/js/1.11375dc8746e5242630d.js
内包含
“192.168.9.18”
的
IP
地址,如果
实验过程中使用的不是本案例的
IP
,则需要根据实际
IP
地址进行调整。另外一处是
Tengine
的配置文件
/usr/local/tengine/conf/nginx.conf
,文件内有跳转到
“192.168.9.18”
的
7600
端口,
此处也需要根据实际
IP
进行修改。
相 关 的 基 础 服 务 、 业 务 服 务 都 构 建 完 成 后 , 就 可 以 进 行 项 目 测 试 。 访 问
http://192.168.9.18:8888
查看大觅网的首页内容,如图
2.38
所示。
图 2.38 大觅网首页
至此,大觅网项目搭建完成。
项目总结
大觅网整个项目已经介绍完了,通过本项目的学习和实施,充分复现了整个项目从研发、基 础环境部署到业务部署的过程。项目过程中用到了 OpenStack、Docker、Jenkins 等环境和 软件。读者在实验过程中应该理解各功能的 Dockerfile,明白 Dockerfile 都实现了什么,因 为基础环境和业务部署都是通过 Docker-compose 来实现的。本项目做下来,读者基本掌 握了云环境下微服务的相关部署。
更多推荐
已为社区贡献14条内容
所有评论(0)