背景

Cars.com 是美国的汽车门户网站,为用户提供各种购车相关的信息和资讯,类似于国内的汽车之家。

他们之前的技术栈是比较传统的 Java Web 结构:Java 7,  Websphere/Weblogic, Oracle Linux, IBM 硬件,Oracle 数据库 。开发语言包含 Java,NodeJs,Go。随着网站宣传的投入,Cars.com 的流量也变大了。

·      3000万访问者 / 月

·      470万车辆信息

·      每天处理200万张图片请求

·      每天服务端处理1亿次请求

问题来了,流量变大之后,传统的架构显得力不从心。同时,软件交付流程也成为了瓶颈,来看看他们的痛点。

痛点

·      两套操作系统和中间件

操作系统和中间件的选型不同,各自分别包含Websphere, Weblogic, Oracle Linux, Redhat Linux, AIX等等。

·      每套运行环境需要5份

包含开发者环境,功能测试环境,集成测试环境,性能测试环境,生产环境。

·      10个 Web 应用,100多个服务需要部署。

由于环境的差异性,上线流程的复杂性,导致 Cars.com 的团队经常碰到的问题是:为什么代码在这个环境能运行,在另外一个环境不行?久而久之为团队带来大量重复的定位环境问题的工作,严重影响了开发进度。

Cars.com 总结了他们的诉求 – 实现不可变基础设施

·      统一上线流程。

·      具备实时扩展的能力,应对高峰期流量。

·      当服务出现问题,能够自动回滚,自动恢复。



使用 Docker 实现不可变基础设施

为什么选择 Docker?

·      提供一致性,可预期的环境。

使用 Docker 可以屏蔽环境的差异,解决维护5份环境的痛点。

·      实现微服务部署。

Cars.com 底层有100多个服务,服务如果不能单独部署,会有造成构建时间长,上线周期长,排除问题困难等问题。 实现微服务的独立部署,可以加速软件上线速度,降低问题排除难度。

·      秒级故障恢复。

Docker 作为服务的载体,具备快速销毁,快速上线,快速回滚的能力。一旦线上服务出问题,可以快速回滚到上一个版本。

·      实现蓝绿部署,金丝雀发布。

快速发布环境,让一部分用户体验某些新功能,待功能被快速验证得到积极的反馈之后,再进行大面积部署。


构建一个通用 Docker 镜像

为什么需要构建通用的 Docker 镜像?

·      公司内部有很多镜像,当有新的环境需要搭建时,要把镜像从仓库一个一个都拷贝到开发者的机器。

·      多语言开发团队,包括 JavaScript,Java,Go 等等,每种语言打包的镜像体积过大,导致镜像构建,下载速度慢,影响开发效率。

经过一系列实践,Cars.com 总结出来了通用镜像的方案:

·      采用 Alpine Linux 作为基础镜像

Alpine Linux 系统的文件大小非常小,可以达到5MB。

·      轻量级的容器

- 删除 Package Manager 里面的所有Source。

- 在软件安装完之后,删除安装包,删除没有用到的依赖,删除临时文件。

- 剪裁官方镜像。剪裁 Node 镜像,Node 官方镜像最新版达到了649MB,他们将这个镜像缩减到55MB。JDK 缩减到122MB,Tomcat 从357MB 缩减到181MB。

在裁剪镜像大小的实践中,Artifactory 中的 Docker info 提供了帮助,可以在 Docker info 中看到每次打包的镜像 Layer 的实际大小,通过裁剪每层 Layer 的大小,最终达到缩小镜像的目的。

仓库的需求

每个团队都有管理包的需求,开发者要管理 Jar,War,静态文件,系统 Admin 要管理不同的 Linux 发行版,每种语言都用不同的包管理系统,维护这5,6种二进制包仓库非常麻烦,他们使用了 Artifactory 作为一站式包管理平台。理由:

·      本地搭建的仓库

大大提升所有语言构建,打包的速度。

·      支持 NPM modules,Docker 注册中心,Maven,Go。

·      支持 Linux 的包管理工具(RPM,Debian)。

·      和 Jenkins/Bamboo/MSBuild/TFS 等工具集成,收集构建信息。

·      元数据支持,并且提供 Rest API。

Cars.com 通过为 Docker 镜像,War 包设置元数据,使得任何包都可以通过 Artifactory Query Language  根据元数据,过滤出符合上线条件的包,打包到镜像里,部署到环境上。

封装 Docker API – PowerTrain

为什么要封装Docker API?

·      需要即时响应快速上线,回滚,支持滚动升级,动态绑定端口。

·      保证开发者环境里能跑的应用,在生产环境里也能跑,实现不可变基础设施。

·      声明式配置管理。

PowerTrain 的配置文件 powertrain.mk 解决的问题是将不同环境中变化的部分,作为变量,存在文件里,当需要生成某个环境时,只需将需要的变量传递给 PowerTrain,即可获取对应环境所需的依赖,实现按需搭建环境。

PowerTrain 也封装了一些 Docker 的常用操作,例如 Docker build,pull,push 等等,在这基础之上增加的一些定制化的信息,来适应灵活的镜像构建和部署。利用 Docker 的轻量级部署特性,实现快速搭建环境,快速上线服务。PowerTrain 的具体的实现可以在 Carsdotcom 的 Github 上找到源代码。

持续集成流水线

·      开发提交代码到 Bitbucket。

·      Commit 触发 Jenkins 的 Webhook, 执行构建。

·      Jenkins 执行 PowerTrain build。

·      从 Artifactory 找到对应的 War 文件,基础镜像,构建出新的镜像。

·      快速搭建测试环境,使用 Docker 作为载体运行 war 包,进行测试(功能,接口,性能) 。


持续交付流水线

·      镜像通过测试,会升级到 Artifactory 的生产仓库。

·      通过 Jenkins 触发 PowerTrain 命令,部署到生产环境。

要部署到不同的环境,只需要执行不同的 powertrain.mk 文件,就能拉取不同的依赖,部署到不同的环境。

总结

Cars.com 通过一系列的实践,完成了从传统  Java Web 应用到容器化的转型。得到的收获:

·      使用 Docker 屏蔽之前5份环境的差异,实现一次构建,处处运行,大大减少运维中的重复性工作。使用  PowerTrain 的配置文件,让上线流程脚本化,实现不可变基础设施。

·      使用 Artifactory 作为多语言的本地仓库,大大提高获取第三方依赖,和管理自研件的效率。

·      剪裁 Docker 镜像,实现轻量级镜像发布,在突发流量到来时能够实现动态扩容,以及快速故障恢复。

作者;王青

目前任职 JFrog 中国首席架构师,之前在 IBM,HPE,爱奇艺,新浪,VIPKID 等公司做过研发和架构,是有十多年开发经验的互联网老兵,专注于软件生命周期管理,微服务架构,云原生应用,容器化等领域。

欢迎转载,但转载请注明作者与出处。谢谢!

传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!相关推荐

  1. 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)

    前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...

  2. 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)

    我们经常需要进到容器里去做一些工作,比如查看日志.调试.启动其他进程等.有两种方法进入容器:attach 和 exec. docker attach 通过 docker attach 可以 attac ...

  3. 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)

    除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络. Docker 提供三种 user-defined 网络驱动:bridge ...

  4. Docker学习总结(36)——利用Google开源Java容器化工具Jib构建镜像

    一.前言 容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身 ...

  5. 对传统应用进行容器化改造

    https://mp.weixin.qq.com/s/0yWIuIwarLiml4MD0pDxMg 本文接下来简要介绍什么是容器化,要在 Docker 容器中运行传统应用的缘由,容器化的过程,其间可能 ...

  6. Java开源开发平台O2OA V7.0发布,支持Docker容器化部署和三员管理模式

    O2OA开发平台开源至今,已经有很多开发者参与我们每个版本的迭代和更新,有的开发者已经利用O2OA在公司内部搭建公司的开发平台,有的开发者在商业项目中使用O2OA平台作为信息化系统建设的基础能力平台. ...

  7. docker4dotnet #2 容器化主机

    .NET 猿自从认识了小鲸鱼,感觉功力大增.上篇 <docker4dotnet #1 前世今生 & 世界你好>中给大家介绍了如何在Windows上面配置Docker for Win ...

  8. Docker最全教程之MySQL容器化 (二十四)

    Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四) 前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过 ...

  9. AI独角兽商汤科技的内部服务容器化历程

    本文由阿尔曼,商汤科技运维工程师于4月26日晚在Rancher微信群所做的技术分享整理而成.商汤科技是专注于计算机视觉领域的AI公司.本次分享结合了容器平台团队帮助公司业务/内部服务容器化历程,介绍商 ...

最新文章

  1. python使用matplotlib可视化线图(line plot)、并自定义设置可视化图像中没有网格线(remove grid line in matplotlib plot result)
  2. 特种部队【动态规划】
  3. Oracle中分区表中表空间属性
  4. 【笛卡尔树】【树状数组】Beautiful Pair(P4755)
  5. react之虚拟DOM的两种创建方式
  6. Android使用adb命令查看CPU信息
  7. net 中viewstate的原理和使用
  8. find和chmod结合来修改权限
  9. 数论 欧几里德算法
  10. nodejs下载集成到idea
  11. bum报文_数据中心VxLAN技术概念和原理解读
  12. html将网页保存成图片,谷歌浏览器保存网页为图片方法_chrome如何将网页保存为图片-win7之家...
  13. 阿里云网站域名备案流程全过程(图文讲解)
  14. 在线图片尺寸修改 生成图标
  15. 头条白板面试_我收到的最佳白板面试建议
  16. C语言情人节玫瑰花代码
  17. 7-7 韩信点兵 (10 分)
  18. 线上展厅3d化宣传效果怎样 广州商迪
  19. web前端-前端三剑客之CSS(1)
  20. word里显示的这个向下箭头是什么意思

热门文章

  1. java.lang.ClassNotFoundException: org.eclipse.jdt.internal.compiler.env.INameEnvironment
  2. GD32官方资料学习体系(主要包括MCU选型、原理图PCB设计、软件开发入门及用户手册等)
  3. 【历史上的今天】6 月 26 日:EDSAC 计算机之父诞生;B 站成立;Skype 创始人出生
  4. 多模态训练如何平衡不同模态
  5. vue02(脚手架,部署,helloworld)
  6. word删除页眉线,添加第几页共几页
  7. 解决linux看温度是报错No sensors found问题
  8. python实现情感分析
  9. i3cpu驱动xp_Intel英特尔 Core i3/Core i5/Core i7系列CPU显示驱动 14.46.9.5394版 For XP-64
  10. 战神引擎mud2没有mysql文件_战神引擎架设不要(MongoDB)芒果数据库配置教程