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

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

 找回密码
 立即注册

扫描二维码登录本站

QQ登录

只需一步,快速开始

查看: 1912|回复: 0

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

[复制链接]
发表于 2018-10-31 10:15:22 | 显示全部楼层 |阅读模式
本帖最后由 adminlily 于 2018-10-31 10:17 编辑 0 ~! w: ], h, `! t* P$ Q% E! z

# I7 R$ V$ ]4 @8 Q
1.png
Docker们手拉手,互相聊天互相吹牛,以确保所有工具和微服务都能装一个锅里。
- 国外大厨名语录
4 Z) O/ O# A6 k. K7 d. Z+ O

) N2 e' A) z3 n) J8 q/ d8 Y4 D
Docker,微服务,持续交付是地球上目前运维圈子里最受欢迎的话题了。在由数十个微服务相互通信的环境中,测试,构建和部署过程的自动化显得尤为重要。Docker,当红小生是微服务的理想解决方案,它可以创建和运行带服务的隔离容器。

: u+ e. \1 o: N; O

+ `4 b) Y1 a% a" @) _2 h. y! L0 h
今天,我们来交流如何以流行的软件自动化工具(Jenkins)为微服务实例创建基本的持续交付流程。

& D, w  _" m# d
+ C5 N' l& m. m% w+ G" r/ b
1. 微服务实例构建
" Y, _$ D  S: A- q9 T
" x! F; V* S9 i7 E) j
开篇,我先简要讲讲用于创建微服务实例的结构思路和工具。实例应用由两个彼此通信的微服务(帐户,客户),发现服务器(Eureka)和API网关(Zuul)组成,用Spring Boot和Spring Cloud框架实现,而且你可以在GitHub上download到源码。Spring Cloud支持微服务发现和网关的开箱即用 - 只要在maven项目配置文件中定义正确的依赖关系(pom.xml)。
) P! }. o- l5 Q- S$ N6 U7 K
# ~" n) s( O6 x/ ~
客户、帐户REST API服务、发现服务器和gateway都在Docker里分别跑着。网关是微服务系统的切入点,它与所有其他服务交互,将请求发送到所对应的微服务器,在发现服务中搜索其地址。在每个帐户或客户微服务器有不止一个实例的情况下,请求Ribbon与Feign客户端负载平衡。
2 a% w9 _; v) A' ^1 s

; l$ M. V' p  y/ G
帐号和客户服务在启动后自动注册到发现服务器,之间有交互的可能 - 例如,如果我们想查找并返回所有客户的帐户详细信息。
4 H3 X; E7 ?7 C$ E, z
) R! m( Z: s! D+ b# R
解决方案架构如下图所示。
1.png

8 X6 T3 M; v; R6 S6 y9 x9 ~- N% I
2 x, a' J8 L% [$ o0 L
其实我不太想用Spring Boot和Spring Cloud框架了解这些微服务实现的细节。不过,通常Spring框架完全支持所有Netflix OSS工具(如Ribbon,Hystrix和Eureka)的微服务。

! o) m8 a# u+ h/ b

8 m3 ^  l% G; y/ _
2. Dockerfiles

- O6 \* s3 t1 d4 P0 C& d
( n( i0 x$ s0 h6 N
示例源码中每个服务都具有DockerfileDocker映像构建定义。这个Dockerfile的帐户服务,理解起来不难。我们用OpenJDK作为基础镜像,目标JAR文件添加到映像中,然后用java -jar命令运行,随后占用2222端口,暴露至外网。
& J9 \4 E* V+ X( C' G0 `- I8 O9 Z
4 M$ w" I2 z6 J8 ~6 [/ s

, J( O. ~3 F  o: T( N' M
1.png
9 m" R  J6 c1 H! i; l

' J' H! m5 a* D* q6 \2 I: V# y9 c
# D) x5 g4 O3 I5 `/ O- A7 {
我们还得在JAR manifest里面设置主类,在模块pom.xml中用spring-boot-maven-plugin来实现它。片段在下方可见。我们还要设置构建finalName切断目标JAR的版本号。Dockerfile和Maven构建定义与所有其他微服务相似。
5 b6 `5 D, d  [" K1 V

3 g; f9 p3 L$ I+ C0 k/ {& k5 U
1.png
3 ^: W/ F* U/ `
; Q# E; M7 \1 u1 p
3. Jenkins Pipelines
# g3 H# c" ]% m( r  F; k3 ~% D

: Y$ ~* I$ C8 Q
我们用pipeline插件为我们的微服务构建连续交付。除了Jenkins上的标准插件,我们还要个叫CloudBees的Docker Pipeline插件。我已经定义了四条流水线,如下图。
- X$ u# [. d$ V& M
3 |/ P# J5 ~6 t8 I& I' I3 S
1.png

; A+ y5 z$ f6 X1 X
: ]9 p( b1 u2 j6 X) r+ Q' k+ H6 V7 M. k8 K# t) x: R0 ~, n: l; l
这是用Groovy语言写的用于发现服务的流水线定义。这里有五个执行阶段,在Checkout阶段,我们正在为项目的远程Git仓库提取更改。然后使用MVN clean install命令构建项目,并从pom.xml中读取Maven版本。在Image阶段,从发现服务Dockerfile构建Docker镜像,然后推送到本地注册表。在第四步里,我们在运行默认公开端口的内置镜像,这时候大家可以在对应的Docker看到主机名。最后,帐户pipeline的等待选项消失,也就是源pipeline构建完成。

$ C$ f; ~# K; A4 z; R, B

% i, F  B3 o* e, z# n; q( B# L7 |% W
1.png

! s# G+ |# C' {  O

% @) T/ k. G5 \
; k+ Z9 L) i/ ~2 [* V$ I: a' @
帐户pipeline看起来很像。不过主要区别在于第四阶段,让帐户服务容器与发现容器做关联。这些容器要链接起来,因为account-service要求在发现服务器注册,并且必须能够使用主机名连接。
( M( n7 f/ z3 V
' A. w8 w4 a  U
1.png
& O6 E0 f3 G4 h% y
) n' |9 h: ~# V& m5 |+ I7 t

3 E  P  G0 x$ M
客户和网关也定义了类似pipeline,它们在每个微服务器的主项目目录中都可以作为Jenkinsfile。在执行期间构建的每个镜像也被推送到本地Docker注册表里。

9 q0 ~( K/ S5 D

7 `3 M" o& \2 t0 B
要在主机上启用本地注册表,则需要拉取和运行Docker注册表镜像,而且要在拉取或推送时将该注册表地址用作图像名称前缀,本地注册表会显示在默认的5000端口上。
( W7 y: T- v. M- n; V
5 J. e4 m6 k! _& `0 T
你可以通过调用REST API(例如http:// localhost:5000 / v2 / _catalog)来查看推送的镜像列表到本地注册表。

/ P% }6 V6 W8 A. l2 V
( K/ s' M4 e: q$ S
docker运行-d --name注册表-p 5000:5000注册表
0 \5 B8 u; b, w# y$ E) T) v
% Z$ ~% U6 h# ]  k
4. 测试
8 k; x) m0 T. g* ^+ E! R

; Q- l# q- Y+ N* f4 ?3 Y1 j" @) H
启动构建discovery-service-pipeline,这个流水线不仅可以为发现服务运行构建,还可以在最后调用start下一个pipeline build(account-service-pipeline)。
$ Z. F- l2 Y. g2 V( R- x6 K9 {
- E+ r4 @5 P* T5 O' {
配置一套gui'zeaccount-service-pipeline和customer-service-pipeline配置一套相同的规则,为customer-service-pipeline和gateway-service-pipeline也配置一套相同的规则。在所有流水线完成后,你就可以通过调用docker ps命令来检查运行的docker列表。此时你应该能看到五个容器:本地注册表和我们的四个微服务器。
6 A* B* W2 G; k; l) a& |
5 d$ U- K$ p7 P9 i" q
当然你还可以通过运行命令检查每个容器的日志docker logs。例如docker logs account。如果一切正常,你应该能向http:// localhost:2222 / accounts或通过Zuul网关http:// localhost:8765 / account / account调用一个服务。

$ @1 X9 Y7 E0 K- }
' G. L: F, s  h& c
1.png

$ J8 x! y1 g+ p3 l, G' a
4 V2 r) {$ h4 {7 C* l* c$ h
5. 结论

/ S* q  I0 |8 t2 P8 \- p
. W* g7 {7 H5 j
好了,基于Docker和Jenkins的微服务持续交付的示例忽悠完成。

+ {. ]1 ~1 z( \0 i1 v$ Z
+ I, N: J- A1 S3 Q# \$ y$ o
我觉得如果看明白了,你应该可以轻松发现这个方案的潜在局限性。例如,实例已经把Docker串起来实现通信了,又或者实例中所有工具和微服务都在同一台机器上跑。
4 I& e6 V/ ~, D2 [7 F$ e; F  j
1.png
7 ?4 J- i$ P- G# j
对于更高级的栗子,比如我们可以用运行在不同机器或Docker里的Jenkins附件来编排各种眼花缭乱的集群,包括Kubernetes工具的应用,又或者可以用Docker-in-Docker容器来虚拟一大堆Docker……

( D3 J3 w5 m) s0 m, f$ R1 _, g

* o/ S5 |2 W5 k" C* R$ U: l# u
扯得有点远了……但是我希望这篇文章是对微服务和持续交付的一个很好的介绍,帮助你了解一些基础知识。文中提到的大神级工具,未来一定有更多更闪亮的应用场景。

  o' X5 R9 `" H/ h2 K: ?% D

4 c: Y% \$ Q! l) H. }# Q7 }
原创: ITILxf.com" target="_blank" class="relatedlink">DevOps研究院
1 p5 N" o) e6 m
3 q5 w/ f- ^! J2 S' e2 U




上一篇:成功实施DevOps的10个最大障碍
下一篇:DevOps时代合伙人张乐分享大型互联网公司金融项目DevOps转型实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

参加 ITIL 4 基础和专家认证、长河ITIL实战沙盘、DevOps基础级认证、ITSS服务经理认证报名
本站关键字: ITIL| ITSM| ISO20000| ITIL培训| ITIL认证| ITIL考试| ITSS| ITSS培训| ITSS认证| IT运维管理| DevOps| DevOps培训| DevOps认证| itop| itil4| sre| 开源ITSM软件

QQ|ITIL先锋论坛 ( 粤ICP备11099876号 )|appname

Baidu

GMT+8, 2022-5-23 04:42 , Processed in 0.117001 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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