请选择 进入手机版 | 继续访问电脑版

IT运维管理,ITIL,ITSS,ITSM,ISO20000-ITIL先锋论坛

 找回密码
 微信、QQ、手机号一键注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

搜索
查看: 603|回复: 0

DevOps系列之国外大厨用Docker和Jenkins演示微服务的持续交付

[复制链接]
发表于 2018-10-31 10:15:22 | 显示全部楼层 |阅读模式
本帖最后由 adminlily 于 2018-10-31 10:17 编辑
- m, J7 u2 ?( \# M
' h1 m5 k8 Y) m6 {
1.png
Docker们手拉手,互相聊天互相吹牛,以确保所有工具和微服务都能装一个锅里。
- 国外大厨名语录
2 C  U) I* {) A+ ^

8 N+ E( d5 ?( i7 |2 g1 J  g, o
Docker,微服务,持续交付是地球上目前运维圈子里最受欢迎的话题了。在由数十个微服务相互通信的环境中,测试,构建和部署过程的自动化显得尤为重要。Docker,当红小生是微服务的理想解决方案,它可以创建和运行带服务的隔离容器。

# A1 Y5 ~3 G3 [5 M# o

& @4 ~8 r! }; w% u
今天,我们来交流如何以流行的软件自动化工具(Jenkins)为微服务实例创建基本的持续交付流程。
* Z- V0 G8 @" _( h' ]& x
' s9 O% ]) c$ n8 i4 b/ ?
1. 微服务实例构建

  p" ?6 P2 U# }
/ J0 `$ j# ~, D5 F2 Z5 m$ B
开篇,我先简要讲讲用于创建微服务实例的结构思路和工具。实例应用由两个彼此通信的微服务(帐户,客户),发现服务器(Eureka)和API网关(Zuul)组成,用Spring Boot和Spring Cloud框架实现,而且你可以在GitHub上download到源码。Spring Cloud支持微服务发现和网关的开箱即用 - 只要在maven项目配置文件中定义正确的依赖关系(pom.xml)。

# Y4 y* ?' o3 O3 [3 ?6 \3 ]

& N8 `' {; L7 \/ L& {; S
客户、帐户REST API服务、发现服务器和gateway都在Docker里分别跑着。网关是微服务系统的切入点,它与所有其他服务交互,将请求发送到所对应的微服务器,在发现服务中搜索其地址。在每个帐户或客户微服务器有不止一个实例的情况下,请求Ribbon与Feign客户端负载平衡。
9 R5 e/ d: e" g3 T4 O7 G

! n! b& R8 g5 Q$ s. U  \! [
帐号和客户服务在启动后自动注册到发现服务器,之间有交互的可能 - 例如,如果我们想查找并返回所有客户的帐户详细信息。
& t6 \$ q( a  ]. D/ V" b+ q* |

% k* i- ], c5 J
解决方案架构如下图所示。
1.png

/ b% ^' p# o5 d' {4 y

0 {9 k" J1 i# g9 Q- q& }+ W
其实我不太想用Spring Boot和Spring Cloud框架了解这些微服务实现的细节。不过,通常Spring框架完全支持所有Netflix OSS工具(如Ribbon,Hystrix和Eureka)的微服务。
3 g5 O4 O) t" K2 M/ v( {  r$ T
; X) x/ B0 B) ]  H- r" c+ g4 k
2. Dockerfiles

( s; g7 h" L$ Q+ C3 K
$ ?! [9 `1 P; E' n; x! m9 \% ~
示例源码中每个服务都具有DockerfileDocker映像构建定义。这个Dockerfile的帐户服务,理解起来不难。我们用OpenJDK作为基础镜像,目标JAR文件添加到映像中,然后用java -jar命令运行,随后占用2222端口,暴露至外网。- i" [# d* W, `* C

( I. B" ~$ s/ `, ?. z; o! u4 [: K

3 {/ b/ d/ l- ?/ k/ |
1.png
, n, e% S3 X! L$ ]$ @
. `. \& c3 r# K- ~* u" d+ g1 X( T
* u/ v2 y( I! u+ S
我们还得在JAR manifest里面设置主类,在模块pom.xml中用spring-boot-maven-plugin来实现它。片段在下方可见。我们还要设置构建finalName切断目标JAR的版本号。Dockerfile和Maven构建定义与所有其他微服务相似。
; |5 Q2 u  o9 Y+ ?$ x4 l6 R

+ o. d! `( b2 V, H/ e- K/ N3 d
1.png

  |+ R1 r; X, H. s9 D7 \
6 P9 ^3 Y5 h% g7 d5 L+ N" Q* p' }& H
3. Jenkins Pipelines
1 e  ]# d. W  u8 Q2 U- h& B6 |( k3 z
8 p* T% x6 s8 o2 ^# ^3 @5 x
我们用pipeline插件为我们的微服务构建连续交付。除了Jenkins上的标准插件,我们还要个叫CloudBees的Docker Pipeline插件。我已经定义了四条流水线,如下图。

' n- @5 U+ M8 P# {- [: j+ G+ L
% C: y2 n( m1 f' M) T0 q& W
1.png
  R4 S' G. R1 S# d' K( s
8 }  p' S/ \# d: _

* z5 }0 q% T& }& A
这是用Groovy语言写的用于发现服务的流水线定义。这里有五个执行阶段,在Checkout阶段,我们正在为项目的远程Git仓库提取更改。然后使用MVN clean install命令构建项目,并从pom.xml中读取Maven版本。在Image阶段,从发现服务Dockerfile构建Docker镜像,然后推送到本地注册表。在第四步里,我们在运行默认公开端口的内置镜像,这时候大家可以在对应的Docker看到主机名。最后,帐户pipeline的等待选项消失,也就是源pipeline构建完成。
. H( }" h2 h7 ], M( y4 h; K

2 \7 Y! d( d" w% g, z# X4 Q
1.png

9 A; s" k8 b2 a, y( o% C; L1 U0 J; }

! ^5 p. Z5 Q- [4 F0 o: c
- R4 T9 a4 L0 C2 B
帐户pipeline看起来很像。不过主要区别在于第四阶段,让帐户服务容器与发现容器做关联。这些容器要链接起来,因为account-service要求在发现服务器注册,并且必须能够使用主机名连接。

4 C2 m3 M. ?/ e+ ^& _4 o% \

1 p: x! a+ c( W9 O8 N: t9 W
1.png

& q6 s' S0 ^7 Q4 H+ m
5 m- B0 r+ H- m/ F' b# B
" x7 T9 N  C  w# T0 n% ^
客户和网关也定义了类似pipeline,它们在每个微服务器的主项目目录中都可以作为Jenkinsfile。在执行期间构建的每个镜像也被推送到本地Docker注册表里。

. Z& ]4 w) o1 B& P
4 ~, I- F7 |: P
要在主机上启用本地注册表,则需要拉取和运行Docker注册表镜像,而且要在拉取或推送时将该注册表地址用作图像名称前缀,本地注册表会显示在默认的5000端口上。
+ G) ?* Y: f+ O8 c; N
4 K; W; c, s+ c. q9 Y7 {! i( K0 W3 A
你可以通过调用REST API(例如http:// localhost:5000 / v2 / _catalog)来查看推送的镜像列表到本地注册表。

! E; @8 L! A  s% \( K0 A- n5 Y
7 q1 [- |& D5 \4 x% T: R
docker运行-d --name注册表-p 5000:5000注册表
3 F1 m& q* t9 G7 U
3 f" `0 b% a1 u* ~
4. 测试

  u1 R) q0 r$ X/ Y! s
5 M* I/ u" B' Q& k$ S5 u6 a! Y6 J
启动构建discovery-service-pipeline,这个流水线不仅可以为发现服务运行构建,还可以在最后调用start下一个pipeline build(account-service-pipeline)。

# ^$ x" L, _* o/ J# z
# f7 ~4 P. G& C% N' A
配置一套gui'zeaccount-service-pipeline和customer-service-pipeline配置一套相同的规则,为customer-service-pipeline和gateway-service-pipeline也配置一套相同的规则。在所有流水线完成后,你就可以通过调用docker ps命令来检查运行的docker列表。此时你应该能看到五个容器:本地注册表和我们的四个微服务器。

% c( D% `& k1 b1 n2 ^
; ]+ R! |6 c& y1 ^; [% Z
当然你还可以通过运行命令检查每个容器的日志docker logs。例如docker logs account。如果一切正常,你应该能向http:// localhost:2222 / accounts或通过Zuul网关http:// localhost:8765 / account / account调用一个服务。
3 g  `; d3 t/ N5 E' E

; z) A/ f/ c5 D2 S2 s) k7 d
1.png
* b! J/ Y/ `  G; }* l0 _  Y7 x
) A! \, Q) B7 v9 U  [7 @
5. 结论
' c) ?5 G8 z- e+ k' A( R

  J0 T, s3 }) }9 b+ }) f6 Q
好了,基于Docker和Jenkins的微服务持续交付的示例忽悠完成。
! \2 H7 b% z& [  m$ X; C  z$ D

4 k" M/ ^- g0 d3 @$ A* J
我觉得如果看明白了,你应该可以轻松发现这个方案的潜在局限性。例如,实例已经把Docker串起来实现通信了,又或者实例中所有工具和微服务都在同一台机器上跑。

2 r; J2 M: k; j/ C' M$ i
1.png

7 _1 R; A& e8 R8 A. v0 c
对于更高级的栗子,比如我们可以用运行在不同机器或Docker里的Jenkins附件来编排各种眼花缭乱的集群,包括Kubernetes工具的应用,又或者可以用Docker-in-Docker容器来虚拟一大堆Docker……

/ D& f0 v5 {  X. x4 o' R: A

  h! I; ?5 V" z
扯得有点远了……但是我希望这篇文章是对微服务和持续交付的一个很好的介绍,帮助你了解一些基础知识。文中提到的大神级工具,未来一定有更多更闪亮的应用场景。

9 M) X$ m0 v/ `0 T6 P
) C# C! `1 q! [0 z' }, e) \# C9 X
原创: DevOps研究院

  M: A) E2 m, |6 y4 ^
. W6 w8 d2 n) [0 t7 n4 M  H

本版积分规则

QQ|小黑屋|手机版|Archiver|艾拓先锋网 ( 粤ICP备11099876号-1 )|网站地图

Baidu

GMT+8, 2019-9-23 07:03 , Processed in 0.162184 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表