作者 | JavaEdge

来源 | JavaEdge(ID:Java-Edge)

头图 | CSDN 下载自视觉中国

容器的普及,带来了微服务架构和DevOps的高速发展。

微服务的弊端

1.1 测试、发布工作量剧增

单体应用拆分成多个微服务后,虽能实现快速开发迭代,但带来更大测试和运维部署的成本。

  1. 很多业务早期就是一个大的单体Web应用,测试和运维时,只需把Web应用打WAR包,部署到Tomcat完事,

  2. 拆成微服务后,很多业务需求就需同时修改多个服务的代码。测试和运维要把这些服务打包、测试、发布上线,同时还要测试这些服务接口的功能,最后发布上线多个系统,工作量增剧增。

  3. 这个时候就需要减轻测试和运维的负担,我在上一讲给出的解决方案是DevOps。

DevOps可理解为开发和运维的结合。服务的开发者不再只负责服务的代码开发,还要负责服务的测试、上线发布和故障处理等全生命周期过程,这样就能把测试和运维从微服务拆分后所带来的复杂工作中解放出来。

DevOps要求开发、测试和发布流程自动化,这就需保证开发人员将自己本地部署测试通过的代码和运行环境,能够复制到测试环境,测试通过后再复制到线上环境发布。虽然看上去就是复制代码,但实际上本地环境、测试环境和线上环境往往是隔离的。软件配置环境差异很大,会导致开发、测试和发布流程割裂。

1.2 机器初始化复杂度剧增

弹性扩缩容时,不同微服务所要求的软件运行环境差异,带来了机器初始化复杂度的提升。拆分后的微服务相比原来大单体应用更灵活,需根据实际访问量做在线扩缩容,并且通常会采用在公有云上创建的ECS扩缩容。
这意味着又给运维带来了挑战。因为公有云上创建的ECS通常只包含基本os环境,微服务运行依赖的软件配置等需运维单独初始化,因不同微服务的软件配置依赖不同,服务部署的初始化工作十分繁琐。比如Java服务依赖JDK,就需在ECS安装JDK,而且不同微服务JDK版本也可能不同。

还好有你:容器

容器技术解决了本地、测试、线上环境的隔离,解决部署服务初始化繁琐的问题。
容器,即Container,可翻译成集装箱。在港口用集装箱把货物封装起来,然后通过货轮从海上运输到另一个港口,再在港口卸载后通过大货车运送到目的地。如此货物便可在任何地方流转时,都封装在集装箱,无需根据是在货轮还是大货车而对货物重新装配。
软件的容器也是这个原理。它封装的是软件的运行环境。容器本质是Linux里的进程,但容器通过Namespace和Cgroups,可有自己的root文件系统、网络配置、进程空间,甚至自己的用户ID空间,如此容器里的进程就像运行在宿主机上的另外一个单独的os内,从而实现与宿主机os里运行的其他进程隔离。

Docker即是基于Linux内核的Cgroups、Namespace实现进程的封装和隔离。
虽然容器解决了应用程序运行时隔离问题,但要想实现应用从一台机器迁移到另外一台机器上还能正常运行,就必须保证另外一台机器上的os一致,而且应用程序依赖的各种环境也必须一致。Docker镜像就解决了这个痛点。
即Docker镜像不仅可打包应用程序本身,而且还可打包应用程序的所有依赖,甚至包含整个os。这样在本机上运行通过的应用程序,就可使用Docker镜像把应用程序文件、所有依赖的软件以及os都打包成一个镜像,可在任何一个安装了Docker的地方运行。

Docker镜像解决了DevOps中微服务运行的环境难以在本地环境、测试环境以及线上环境保持一致的难题。如此一来,开发就可以把在本地环境中运行测试通过的代码,以及依赖的软件和操作系统本身打包成一个镜像,然后自动部署在测试环境中进行测试,测试通过后再自动发布到线上环境上去,整个开发、测试和发布的流程就打通了。

无论使用内部物理机还是公有云的机器部署服务,都可利用Docker镜像封装微服务运行环境,从而屏蔽机器内部物理机和公有云机器运行环境的差异,实现同等对待,降低运维复杂度。

微服务容器化实践

Docker解决了服务运行环境迁移问题,因为在使用Docker镜像时并非把业务代码、依赖的软件环境以及os直接打包镜像,而是利用Docker镜像的分层机制,在每层编写Dockerfile逐层打包镜像。
因为虽然不同微服务依赖的软件环境不同,但还是存在相同,因此打包Docker镜像时,可以分层设计、逐层复用,减少每层镜像文件大小。

业务案例

看看生产环境如何使用Docker镜像。某Docker镜像分为四层。

  • 基础环境层
    定义操作系统运行的版本、时区、语言、yum源、TERM等

  • 运行时环境层

    定义了业务代码的运行时环境,比如Java代码的运行时环境JDK的版本。

  • Web容器层

    定义了业务代码运行的容器的配置,比如Tomcat容器的JVM参数

  • 业务代码层

    定义了实际的业务代码的版本,比如是V4业务还是blossom业务。

如此每层镜像都基于上层添加新内容,比如V4业务的Dockerfile。

FROM registry.intra.xxx.com/xxx_rd_content/tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dns
ADD confs /data1/confs/
ADD node_pool /data1/node_pool/
ADD authconfs /data1/authconfs/
ADD authkey.properties /data1/
ADD watchman.properties /data1/
ADD 200.sh /data1/xxx/bin/200.sh
ADD 503.sh /data1/xxx/bin/503.sh
ADD catalina.sh /data1/xxx/bin/catalina.sh
ADD server.xml /data1/xxx/conf/server.xml
ADD logging.properties /data1/xxx/conf/logging.properties
ADD ROOT /data1/xxx/webapps/ROOT/
RUN chmod +x /data1/xxx/bin/200.sh /data1/xxx/bin/503.sh /data1/xxx/bin/catalina.sh
WORKDIR /data1/xxx/bin
  • FROM代表上层镜像文件为:tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dns,可见该层包含了Java运行时环境JDK和Web容器Tomcat及Tomcat版本和JVM参数等;

  • ADD,即要在该层镜像添加的文件,主要包含业务的代码和配置RUN,该层镜像启动时需要执行的命令;

  • WORKDIR,该层镜像启动后的工作目录。如此便可通过Dockerfile基于上层镜像完成该层镜像制作。

总结

正是因为Docker可做到一处通过、到处运行,对业务价值极大,解决了以前应用程序在开发环境、测试环境及生产环境间移植难,提高了运维自动化水平,也为DevOps理念的流行和业务上云提供了基础。

当然Docker也会带来新问题,如旧的针对物理机的运维模式就无法适应了,需要一种新的针对容器的运维模式。

更多精彩推荐☞中台“不火”了,企业数智转型如何破圈?
☞AWS 聘用 Rust 编译器联合创始人,大企为何都爱 Rust?
☞CSDN星城大巡礼,长沙“科技之星”年度企业评选正式开启
☞做数据中心,腾讯是认真的
☞首次公开!阿里巴巴云原生实时数仓核心技术揭秘
☞升级版“绝悟”AI自带“军师”,解禁王者荣耀全英雄池
☞一文告诉你雾计算与云计算的区别及对物联网的价值!
点分享点点赞点在看

微服务、容器、DevOps三者之间的关系你清楚吗?相关推荐

  1. 微服务、容器、DevOps三者之间的演进关系,你清楚吗?

    微服务.容器.DevOps三者之间的演进关系 容器的普及,带来了微服务架构和DevOps的高速发展. 1 微服务的弊端 1.1 测试.发布工作量剧增 单体应用拆分成多个微服务后,虽能实现快速开发迭代, ...

  2. 初学SpringCloud:探讨一下为什么要使用微服务?,为什么要使用服务注册中心?怎样理解服务注册中心,服务提供者,服务调用者三者之间的关系?

    目录 1.本篇博客的背景 2.为什么要使用微服务? 3.为什么要使用服务注册中心 4.怎样理解服务注册中心,服务提供者,服务调用者三者之间的关系? 1.本篇博客的背景 我目前正在学习微服务的一些知识, ...

  3. docker的文件流处理_迁移到微服务与DevOps,微服务和Docker容器的全面实用指南

    迁移到微服务与DevOps,改变软件开发效能! 一如既往,技术行业正处于巨大的转变之中,物联网.软件定义网络以及软件即服务(SaaS)仅为其中几例.由于这些创新,对能够改进应用开发和部署过程的平台和架 ...

  4. 微服务下数据表之间的耦合关系

    微服务下数据表之间的耦合关系 1.问题产生 今天同事给我发了一个链接,问我这种做可视化建表的过程觉得怎么样?(如下图) 同事的意思主要是,在微服务架构下,新建单一数据表,然后表内数据需要引用其他数据表 ...

  5. 微服务、DevOps…不是效率银弹,请同时升级你的管理方式

    " 对于正处于创业期的互联网公司来说,研发效率就是生命线.员工人数的增加并不等于公司在变好,一家没有效率的创业公司,将以最快的方式死去." 在互联网快速发展的这些年,软件工程的协同 ...

  6. 微服务容器化运维:微博容器运维平台DCP

    微服务容器化运维系列的前两期,我给你详细介绍了微服务容器化后如何运维的几个关键问题:镜像仓库.资源调度.容器调度.服务编排,这些问题的产生都是因为微服务部署的节点从一台台物理机或者虚拟机变成了一个个容 ...

  7. 有容云:微服务容器化的挑战和解决之道

    注: 本文根据6月是18日七牛云微服务课堂-微服务容器化的挑战和解决之道演讲内容整理而成,演讲者:有容云联合创始人兼首席架构师马洪喜,与大家一起探讨了如何通过容器技术将微服务和 DevOps 落地. ...

  8. service、servlet和WebService三者之间的关系

    学习Java很久了,但是一直没怎么弄清楚过service和servlet的区别,下午找了同学聊了聊才发现,一直以来的理解都有错误,下面就为大家好好理清一下他们的关系. 一.service 我们一般理解 ...

  9. 微服务容器化最短路径,微服务 on Serverless 最佳实践

    简介:阿里云Serverless应用引擎(SAE)初衷是让客户不改任何代码,不改变应用部署方式,就可以享受到微服务+K8s+Serverless的完整体验,开箱即用免运维. 前言 微服务作为一种更灵活 ...

最新文章

  1. 国行版HomePod售价2799元,本周五发售
  2. Java 枚举(enum)详解
  3. 抓包(Charles工具入门)
  4. Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...
  5. Akka系列---什么是Actor
  6. 为TFS配置跨平台的生成服务器Xplat (Ubuntu Linux)
  7. Luogu P2101 命运石之门的选择(分治+搜索)
  8. php如何解决报错,php 启动报错如何解决_PHP教程
  9. python百度aip移动目标监控系统_python利用百度云接口实现车牌识别
  10. 深度剖析 Linux 的 3 种“拷贝”命令
  11. iOS开发之控制器的创建
  12. 病毒防疫管理系统基于VS2017 .netcore2.2
  13. 编译OpenJDK12:globalDefinitions_visCPP.hpp(46): fatal error C1083:inttypes.h No such file or directory
  14. Scut游戏server引擎Unity3d访问
  15. Idea系列文章2-依赖包的引入
  16. 终于把AI换脸的原理搞清了
  17. 站长统计工具区别:百度统计、51la统计系统和cnzz数据统计工具
  18. 齐岳生物化学交联剂稳定融合蛋白
  19. 手机维修刷机综合工具箱
  20. JS-计算日期差,计算日期之间的月数

热门文章

  1. Python:一文让你彻底理解numpy中axis=-1/0/1/2... [实例讲解:np.argmax(axis= -1 0 1 2) np.sum(aixs= -1 0 1 2)]
  2. extjs FormPanel更改为普通表单提交,提交到iframe显示
  3. hdu 6203 ping ping ping(贪心+树状数组+dfs序)
  4. C#.NET常见问题(FAQ)-如何使用DataGridView跟Excel数据交互
  5. lintcode-106-排序列表转换为二分查找树
  6. 如何关闭远程桌面后仍处于可交互状态
  7. java对象比较排序
  8. DucleBox | A Game Engine for OpenGL Programming
  9. 四种浏览器对 clientHeight、offsetHeight、scrollHeight、clientWidth、offsetWidth 和 scrollWidth 的解释差异...
  10. Remoting學習(三)----Reomoting 基楚知識