【从 0 开始学微服务】【11】微服务为什么要容器化?


持续学习&持续更新中…

守破离


【从 0 开始学微服务】【11】微服务为什么要容器化?

微服务带来的问题

  • 单体应用拆分成多个微服务后,能够实现快速开发迭代,但随之带来的问题是测试和运维部署的成本的提升

  • 相信拆分微服务的利弊你早已耳熟能详,我讲个具体的例子。微博业务早期就是一个大的单体 Web 应用,在测试和运维的时候,只需要把 Web 应用打成一个大的 WAR 包,部署到 Tomcat 中去就行了。后来拆分成多个微服务之后,有的业务需求需要同时修改多个微服务的代码,这时候就有多个微服务都需要打包、测试和上线发布,一个业务需求就需要同时测试多个微服务接口的功能,上线发布多个系统,给测试和运维的工作量增加了很多。这个时候就需要有办法能够减轻测试和运维的负担,一个解决方案是 DevOps。

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

  • DevOps 要求开发、测试和发布的流程必须自动化,这就需要保证开发人员将自己本地开发的代码和运行环境,能够复制到测试环境中去,测试通过后再复制到线上环境进行发布。虽然这个过程看上去好像复制代码一样简单,但在现实时,本地环境、测试环境以及线上环境往往是隔离的,软件配置环境的差异也很大,这也导致了开发、测试和发布流程的割裂。

  • 而且还有一个问题是,拆分后的微服务相比原来大的单体应用更加灵活,经常要根据实际的访问量情况做在线扩缩容,而且通常会采用在公有云上创建的 ECS(Elastic Compute Service) 来扩缩容。这又给微服务的运维带来另外一个挑战,因为公有云上创建的 ECS 通常只包含了基本的操作系统环境,微服务运行依赖的软件配置等需要运维再单独进行初始化工作,因为不同的微服务的软件配置依赖不同,比如 Java 服务依赖了 JDK,就需要在 ECS 上安装 JDK,而且可能不同的微服务依赖的 JDK 版本也不相同,一般情况下新的业务可能依赖的版本比较新比如 JDK 8,而有些旧的业务可能依赖的版本还是 JDK 6,为此服务部署的初始化工作十分繁琐。

  • 而容器技术的诞生恰恰解决了上面这两个问题,为什么容器技术可以解决本地、测试、线上环境的隔离,解决部署服务初始化繁琐的问题呢?下面我就以业界公认的容器标准 Docker 为例,来看看 Docker 是如何解决这两个问题的。

什么是 Docker

  • Docker 是容器技术的一种,事实上已经成为业界公认的容器标准,要理解 Docker 的工作原理首先得知道什么是容器。

  • 容器翻译自英文的 Container 一词,而 Container 又可以翻译成集装箱。我们都知道,集装箱的作用就是,在港口把货物用集装箱封装起来,然后经过货轮从海上运输到另一个港口,再在港口卸载后通过大货车运送到目的地。这样的话,货物在世界的任何地方流转时,都是在集装箱里封装好的,不需要根据是在货轮上还是大货车上而对货物进行重新装配。

  • 同样,在软件的世界里,容器也起到了相同的作用,只不过它封装的是软件的运行环境。容器的本质就是 Linux 操作系统里的进程,但与操作系统中运行的一般进程不同的是,容器通过Namespace和Cgroups这两种机制,可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至是自己的用户 ID 空间,这样的话容器里的进程就像是运行在宿主机上的另外一个单独的操作系统内,从而实现与宿主机操作系统里运行的其他进程隔离

  • Docker 也是基于 Linux 内核的 Cgroups、Namespace 机制来实现进程的封装和隔离的,那么 Docker 为何能把容器技术推向一个新的高度呢?这就要从 Docker 在容器技术上的一项创新 Docker 镜像说起。

  • 虽然容器解决了应用程序运行时隔离的问题,但是要想实现应用能够从一台机器迁移到另外一台机器上还能正常运行,就必须保证另外一台机器上的操作系统是一致的,而且应用程序依赖的各种环境也必须是一致的。Docker 镜像恰恰就解决了这个痛点,具体来讲,就是Docker 镜像不光可以打包应用程序本身,而且还可以打包应用程序的所有依赖,甚至可以包含整个操作系统。这样的话,你在你自己本机上运行通过的应用程序,就可以使用 Docker 镜像把应用程序文件、所有依赖的软件以及操作系统本身都打包成一个镜像,可以在任何一个安装了 Docker 软件的地方运行。

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

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

总结

  • 微服务拆分后相比于传统的单体应用所带来的两个问题:

    • 一个是测试和发布工作量的提升
    • 另一个是在弹性扩缩容时不同微服务所要求的软件运行环境差异带来的机器初始化复杂度的提升
  • 而 Docker 利用 Docker 镜像对软件运行环境的完美封装正好解决了这两个问题。

  • 正是因为 Docker 可以做到一处通过、到处运行,所以对业务的价值极大,解决了以前应用程序在开发环境、测试环境以及生产环境之间的移植难的问题,极大提高了运维自动化的水平,也为 DevOps 理念的流行和业务上云提供了基础,可见容器化改造对微服务是十分必要的

  • 但 Docker 也不是“银弹”,同样会产生新的复杂度问题,比如引入 Docker 后旧的针对物理机的运维模式就无法适应了,需要一种新的针对容器的运维模式。

参考

极客时间: 从 0 开始学微服务-- 微博服务化专家的一线实战经验


本文完,感谢您的关注支持!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值