学成线上 类慕课网 微服务教育网-第20天-讲义-DevOps
1DevOps介绍
1.1什么是DevOps
DevOps是Development和Operations两个词的缩写,引用百度百科的定义:

DevOps是一种方法或理念,它涵盖开发、测试、运维的整个过程。DevOps是提高软件开发、测试、运维、运营等各部门的沟通与协作质量的方法和过程,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件整合,使软件从构建到测试、释出更加快 捷、可靠,最终按时交付软件。

1.2DevOps工具链
DevOps兴起于2009年,近年来由于云端计算、互联网的发展,促进了DevOps的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发、测试、运维的各各领域,例如:GitHub、Git/SVN、Docker、Jenkins、 Hudson、Ant/Maven/Gradle、Selenium、QUnit、JMeter等。下图是DevOps相关的工具集:

2Git/GitLab
2.1Git与GitLab介绍引用百度百科中对Git和GitLab的描述:


Git是一个版本控制系统,GitLab是一个远端的Git仓库,GitLab与GitHub及国内的码云类似,使用者在GitLab上注 册账号,上传专案到GitLab,通过GitLab对专案进行版本控制。通常企业使用GitLab在局域网搭建自己的Git程式码 管理仓库,不过随着云端计算的发展,很多企业也开始使用提供Git仓库管理公共服务的平台,比如:码云、GitHub 等。
下图是GitLab的界面图:

2.2安装 Git及GitLab
个人电脑上安装Git,过程略。
注意:Git安装完成需配置user.name和user.email
查询user.name和uesr.email git config user.name
git config user.email
设定:
git config ‐‐global user.name "itcast"
git config ‐‐global user.email "[email protected]"
在Linux服务器上安装GitLab,安装方法见“GitLab安装文件” 。
注意:个人测试Git版本控制推荐建议直接使用GitHub或码云,两者提供免费建立专案的功能。
2.3在GitLab建立专案
进入GitLab首页:http://192.168.101.64:8889,点选“New Project”建立新专案

输入专案资讯,提交。
专案新建成功,进入专案主页,通过专案主页即可访问专案内容,并得到专案的Git专案仓库地址:

2.4使用Git管理专案
在Idea中整合Git,并用Git管理学成线上专案。
2.4.1设定Git
在开发电脑安装Git,并在Idea中设定Git

设定 修改程式码后父级目录颜色变化:

2.4.2从GitLab检出专案
开启idea,按下图选单指示从GitLab克隆专案:

输入专案的Git仓库地址进行克隆:

2.4.3提交程式码到GitLab
1、在工程根目录建立 .gitignore
此档案中记录了在提交程式码时哪些档案或目录被忽略
.idea/
target/
*.iml
2、程式码修改后档案的颜色会出现变化:

首先执行新增档案到暂存区:

再执行commit 提交档案到本地仓库

最终程式码确认无误可以提交到远端仓库

3Docker
3.1虚拟化技术3.1.1问题描述
互联网的发展使软件业发生了巨大的变化,其中一个显著的变化是软件的规模越来越大,基于微服务架构的软件在 生产部署时遇到了这样的挑战:
1、微服务的开发语言、操作系统、依赖库等环境配置不同,如何快速安装、迁移、配置软件?
2、一个软件由若干微服务组成,如何快速批量部署微服务?
3、如何有效的利于计算机资源? 针对前两个问题的思考:
传统的软件部署流程是:安装操作系统-->安装依赖软件/库-->安装软件(微服务)-->配置软件-->最终软件上线运 行,面对大量的微服务及微服务丛集,使用此方案不仅效率低下,而且还可能会出现环境相容问题,显然此方案不 适合用在微服务部署。
设想:如果有一项技术可以快速的将软件及所需要的各种环境配置打包、批量复制将会解决以上问题。 针对第三个问题的思考:
在一台计算机只安装一个微服务对计算机资源极大的浪费,如果安装多个微服务就可以有效的利于计算机资源,但 是对于批量软件的安装部署还是会面临1、2问题。
设想:在一台计算机安装多个微服务,使用一种技术将微服务打包、复制部署,并且微服务之间隔离互不影响。
3.1.2虚拟化技术
引用百度百科(https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%8C%96/547949)

总结:虚拟化技术是对软件基础设施、操作系统、软件等IT资源进行有效的管理,使使用者不再受物理资源的限制, 提高计算机资源的利用率。虚拟化技术是云端计算的基础,例如阿里云的云主机、腾讯云等都应用了虚拟化技术。
虚拟化技术整体上包括两个方面:硬件虚拟化和软件虚拟化,具体分为:网络虚拟化、储存虚拟化、桌面虚拟化、 服务器虚拟化等,我们平常说的最多的是服务器虚拟化。
服务器虚拟化就是在同一个物理服务器上执行多个虚拟机器,让服务器的cpu、内存、磁盘、I/O等硬件设施为每个 虚拟机器服务,在每个虚拟机器中执行不同的软件,虚拟机器之间是隔离状态。
服务器虚拟化主要有两种技术:
1、Hypervisor也叫VMM(virtual machine monitor)即虚拟机器监视器
Hypervisor是一种将操作系统与硬件抽象分离的方法,实现在宿主机(host machine)上能同时执行多个客户机
(guest machine),每个客户机就是一个虚拟机器,这些虚拟机器高效地分享宿主机的硬件资源。
如下图:

在服务器(宿主机)上安装操作系统,并安装hypervisor虚拟机器管理软件,如VMware、VirtualBox等,由
hypervisor管理多个虚拟机器,每个虚拟机器上需要安装客户操作系统、依赖库、应用软件。
2、Containers容器化技术

容器技术中docker引擎取代了hypervisor,docker引擎是执行在住宿操作系统上的一个程序,该程序管理了多个
docker容器,每个docker容器集成了应用软件、依赖库,容器之间相互隔离。
3、技术对比: 资源占用:
虚拟机器由于是独立的操作系统,占用资源比docker多。启动速度:
虚拟机器包括操作系统,启动虚拟机器相当于启动一个操作系统,容器则不一样,容器中只包括操作系统的核心,启动 一个容器例项相当于启动一个程序,容器的启动速度比虚拟机器快。
体积:
容器包括操作系统核心、软件及依赖库,虚拟机器不仅包括软件和依赖库还将完整的操作系统打包进去,虚拟机器的体 积比容器大的多。
3.1.3Docker介绍
引用百度百科(https://baike.baidu.com/item/Docker)

Docker 源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。官网:https://www.docker.com/
Docker包括以下部分:
引用百度百科https://baike.baidu.com/item/Docker

1、Docker daemon(Docker守护程序): Docker守护程序是部署在操作系统上,负责支撑Docker Container的执行以及本地Image的管理。
2、Docker client: 使用者不直接操作Docker daemon,使用者通过Docker client访问Docker,Docker client提供pull、run等操作命令。
3、Docker Image: Docker 映象就是一个只读的模板。 例如:一个映象可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Tomcat或使用者需要的其它应用程序。 映象可以用来建立 Docker 容器。 Docker 提供了一个很简单的机制来建立映象或者更新现有的映象,使用者甚至可以直接从其他人那里下载一个已经做好的映象来直接使 用。
4、Docker Container: Docker 利用容器来执行应用。容器是从映象建立的执行例项。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。打个比方,映象相当于类,容器相当于物件。
5、Docker Registry: Docker 仓库分为公开仓库(Public)和私有仓库(Private)两种形式 最大的公开仓库是Docker Hub,存放了数量庞大的映象供使用者下载。 使用者也可以在本地网络内建立一个私有仓库。 当用户建立了自己的映象之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个映象时候,只需要从仓库上 pull 下来就可以了。
3.2部署微服务到Docker
3.2.1安装Docker
Docker可以执行MAC、Windows、Centos、DEBIAN、UBUNTU等操作系统上,提供社群版和企业版,本教程基于Centos安装Docker。Centos6对docker支援的不好,使用docker建议升级到centos7。
1、在Centos7上安装Docker
直接通过yum安装即可:
yum install -y docker
启动docker:service docker start
查询docker版本:docker version
2、在Centos6上安装Docker
rpm -ivh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install -y docker-io
service docker start
3.2.2部署流程
本专案微服务采用SpringBoot开发,将每个微服务工程打成Jar包,最终在Docker容器中执行jar,部署流程如下:
1、SpringBoot工程最终打成 Jar包 2、建立Docker映象
3、建立容器
4、启动容器
3.2.3打包
1、使用maven的打包外挂:
将下边的外挂依赖拷贝到微服务工程中,本例子将学成线上的Eureka工程打包:
org.springframework.boot
spring‐boot‐maven‐plugin
完整的Eureka工程pom.xml档案如下:
xc‐framework‐parent
com.xuecheng
1.0‐SNAPSHOT
../xc‐framework‐parent/pom.xml
4.0.0
xc‐govern‐center
org.springframework.cloud
spring‐cloud‐starter‐netflix‐eureka‐server
${project.artifactId}‐${project.version}
org.springframework.boot
spring‐boot‐maven‐plugin
2、maven打包
在工程目录执行:mvn clear package
或通过IDEA执行clear package打包命令。打包成功,如下图:

3.2.4建立映象
测试jar包是否可以执行,执行:java -jar xc-govern-center-1.0-SNAPSHOT.jar
在xc-govern-center-1.0-SNAPSHOT.jar 位置编写Dockerfile档案
FROM java:8
ENV ARTIFACTID xc‐govern‐center ENV ARTIFACTVERSION 1.0‐SNAPSHOT
ENV HOME_PATH /home WORKDIR $HOME_PATH
ADD /$ARTIFACTID‐$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jar
ENTRYPOINT ["java", "‐jar", "xc‐govern‐center.jar"]
在Dockerfile档案所在目录执行:docker build -t xc-govern-center:1.0-SNAPSHOT .
映象建立成功,查询映象:
[[email protected] xc‐govern‐center]# docker images
REPOSITORY
CREATED
xc‐govern‐center ad14dcce6666
3.2.5建立容器
基于xc-govern-center:1.0-SNAPSHOT映象建立容器,容器名称为xc-govern-center-test
docker create ‐‐name xc‐govern‐center‐test ‐t ‐p 50101:50101 ‐e PORT=50101 ‐e EUREKA_SERVER=http://192.168.101.64:50101/eureka/,http://192.168.101.64:50102/eureka/ xc‐ govern‐center:1.0‐SNAPSHOT
容器建立成功,可通过docker ps -a命令检视
3.2.6启动容器
docker start xc-govern-center-test
容器启动完成可以通过docker ps 查询正在执行中的容器。
3.2.7停止与删除
要删除的一个映象重新建立,需要通过如下步骤:
1、停止正在执行的容器
docker stop 容器名
例如:docker stop xc-govern-center-test
2、删除容器
docker rm 容器名
例如:docker rm xc-govern-center-test
3、删除映象
docker rmi 映象名或映象Id
例如:docker rmi xc-govern-center:1.0-SNAPSHOT
3.2.8maven构建映象
上边构建的过程是通过手工一步一步完成,maven提供docker-maven-plugin外挂可完成从打包到构建映象、构建 容器等过程。
1、编写pom_docker.xml
xc‐framework‐parent
com.xuecheng
1.0‐SNAPSHOT
../xc‐framework‐parent/pom.xml
4.0.0
xc‐govern‐center
1.0‐SNAPSHOT
org.springframework.cloud
spring‐cloud‐starter‐netflix‐eureka‐server
${project.artifactId}‐${project.version}
org.springframework.boot
spring‐boot‐maven‐plugin
xc‐framework‐parent
com.xuecheng
1.0‐SNAPSHOT
../xc‐framework‐parent/pom.xml
4.0.0
xc‐govern‐center
1.0‐SNAPSHOT
org.springframework.cloud
spring‐cloud‐starter‐netflix‐eureka‐server
${project.artifactId}‐${project.version}
org.springframework.boot
spring‐boot‐maven‐plugin
2、将Dockerfile档案拷贝到src/main/resource下 3、删除之前建立的xc-govern-center映象
4、进入工程根目录(pom_docker.xml所在目录)执行
mvn ‐f pom_docker.xml clean package ‐DskipTests docker:build
建立映象成功,结果如下:
Successfully built 64682c9ba311
[INFO] Built xc‐govern‐center:1.0‐SNAPSHOT
[INFO] Tagging xc‐govern‐center:1.0‐SNAPSHOT with 1.0‐SNAPSHOT
[INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ [INFO] BUILD SUCCESS
[INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ [INFO] Total time: 7.409 s
[INFO] Finished at: 2018‐07‐19T14:21:16+08:00
[INFO] Final Memory: 52M/414M
[INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
4 持续整合
4.1持续整合介绍4.1.1问题描述
传统的软件开发流程如下:
1、专案经理分配模组给开发人员
2、每个模组的开发人员并行开发,并进行单元测试
3、开发完毕,将程式码整合部署到测试服务器,测试人员进行测试。
4、测试人员发现bug,提交bug、开发人员修改bug
5、bug修改完毕再次整合、测试。问题描述:
1、模组之间依赖关系复杂,在整合时发现大量bug
2、测试人员等待测试时间过长
3、软件交付无法保障解决上述问题的思考:
1、能否把整合测试时间提前?
2、能否使用自动化工具代替人工整合部署的过程?
4.1.2什么是持续整合

持续整合(Continuous integration)简称CI,持续整合的思想是每天要多次将程式码合并到主干,并进行整合、测试,这样就可以提早发现错误,进行修正。持久整合也属于DevOps
持续整合的好处:
1、自动化整合部署,提高了整合效率。
2、更快的修复问题。
3、更快的进行交付。
4、提高了产品质量。
4.1.3 本专案持续整合流程

4.2搭建环境
4.2.1安装 Jenkins
Jenkins是一个领先的开源自动化服务器,可用于自动化构建,测试,部署软件等相关任务。官网地址:https://jenkins.io


安装方法见“Jenkins安装文件”。
4.2.2安装GitLab
GitLab 是一个用于仓库管理系统的开源专案,使用Git作为程式码管理工具,并在此基础上搭建起来的web服务。
GitLab与GitHub的功能相似,通常企业使用GitLab在局域网搭建自己的Git程式码管理仓库。

安装方法见“GitLab安装文件”
4.2.3编写Pom.xml
本例子将xc-govern-center工程使用Jenkins进行构建。
在xc-govern-center工程根目录编写pom_docker_registry.xml
此档案相比工程原有pom.xml增加了docker-maven-plugin外挂,其作用是构建docker映象并将映象推送到
Docker私有仓库(192.168.101.64:5000)。
xc‐framework‐parent
com.xuecheng
1.0‐SNAPSHOT
../xc‐framework‐parent/pom.xml
4.0.0
xc‐govern‐center
1.0‐SNAPSHOT
org.springframework.cloud
spring‐cloud‐starter‐netflix‐eureka‐server
${project.artifactId}‐${project.version}
org.springframework.boot
spring‐boot‐maven‐plugin
com.spotify
docker‐maven‐plugin
1.0.0
${project.artifactId}‐${project.version}
${project.basedir}/src/main/resources
${project.version}
192.168.101.64:5000
true
192.168.101.64:5000/${project.artifactId}:${project.version}
/
${project.build.directory}
${project.artifactId}‐${project.version}.jar
4.4建立持续整合任务
4.4.1建立构建任务
建立学成线上的构建任务:

4.4.2配置git仓库
1、配置git凭证
此凭证用于远端从git仓库克隆工程源代码
输入git仓库的账号和密码,这里如果使用码云,下边需要配置码云的账号和密码。

2、配置git仓库地址,此地址即xc-edu专案的地址

4.4.3maven构建配置
目标:
使用jenkins重复构建不要产生重复映象
使用jekins停止容器、删除容器、删除映象之间进行判断
构建过程分为三步:
本例子以构建xc-govern-center工程为例,其它工程构建方式类似。
1、使用shell指令码停止容器、删除容器、删除映象远端登入192.168.101.64(测试服务器)
停止xc-govern-center容器删除xc-govern-center容器
删除192.168.101.64:5000/xc-govern-center:1.0-SNAPSHOT映象
shell指令码如下:
#!/bin/bash
result=$(docker ps | grep "192.168.101.64:5000/xc‐govern‐center") if [[ "$result" != "" ]]
then
echo "stop xc‐govern‐center" docker stop xc‐govern‐center fi
result1=$(docker ps ‐a | grep "192.168.101.64:5000/xc‐govern‐center") if [[ "$result1" != "" ]]
then
echo "rm xc‐govern‐center" docker rm xc‐govern‐center fi
result2=$(docker images | grep "192.168.101.64:5000/xc‐govern‐center")
if [[ "$result2" != "" ]] then
echo "192.168.101.64:5000/xc‐govern‐center:1.0‐SNAPSHOT" docker rmi 192.168.101.64:5000/xc‐govern‐center:1.0‐SNAPSHOT fi

2、执行maven构建:

执行如下maven指令:
clean package ‐f xc‐govern‐center/pom_docker_registry.xml ‐DskipTests docker:build
3、拉取映象,建立容器,启动容器
从docker私有仓库拉取映象并建立容器,启动容器显示容器执行日志

docker run ‐‐name xc‐govern‐center ‐p 50101:50101 ‐idt 192.168.101.64:5000/xc‐govern‐center:1.0‐ SNAPSHOT
docker logs ‐f xc‐govern‐center
4.4.4执行任务
1、进入任务页面,点选“立即构建”

2、开始构建,检视日志

4.4.5自动构建
使用Gitlab提供的webhook功能可以实现开发人员将程式码push到Git仓库自动进行构建。
1、设定webhook
参考“GitLab安装文件”配置webhook
2、在Idea中修改专案程式码,push到GitLab。
3、Jenkins任务收到GitLab通知自动执行构建。