随着服务数量的增加,管理微服务会变得越来越困难。每个微服务都需要特定的计算资源、数据存储、配置、环境变量和其他一系列特定于微服务的特性。每个微服务还必须可由拥有它的团队管理和部署。容器化和虚拟化,以及配套的管理系统,是达到这一目标的普遍路径。这两个选项都允许每个团队通过单个可部署单元定制其微服务的需求。
将微服务放到容器内
容器(比如最近很流行的 Docker)将应用程序相互隔离。容器通过共享内核模型来使用已有的宿主操作系统。这提供了容器之间的基本分离,而容器本身隔离了环境变量、库和其他依赖项。容器以较低的成本提供了虚拟机(下一节会介绍)的大部分优点,能够快速启动,且资源开销较低。
容器的共享操作系统方式是有一些折中的。容器化的应用程序必须能够运行在宿主操作系统上。如果应用程序需要特殊的操作系统,那么就需要搭建单独的宿主机。安全性是主要关注的问题之一,因为容器共享对宿主机操作系统的访问。内核中的漏洞会让在该宿主机上的所有容器处在危险之中。在友好的工作负载之下,这可能不是一个问题,但当前在云计算中的共享租赁模型使其成为一个需要更多考虑的因素。
将微服务放到虚拟机内
虚拟机解决了容器的一些缺点,尽管它们的速度比较慢。传统的虚拟机为每个实例提供了自包含操作系统和特定虚拟化硬件的完全隔离能力。尽管这种替代方案提供的安全性比容器更高,但从历史上看,它的成本要高得多。相比容器,每个虚拟机的开销更高,启动时间更长,系统占用空间更大。
目前人们正在努力使虚拟机更便宜、更高效。目前的计划包括谷歌的 gVisor、亚马逊的 Firecracker、Kata Containers,等等。随着这些技术的改进,虚拟机会成为容器更具竞争力的替代品,以满足你的微服务需求。如果你的需求是安全优先驱动的,那么很值得关注这一领域的发展。
管理容器和虚拟机
容器和虚拟机是通过各种专门构建的软件,即所谓的容器管理系统(container management system,CMS)来管理的。这些软件控制着容器的部署、资源分配和底层计算资源的集成。流行和常用的 CMS 包括Kubernetes、Docker Engine、Mesos Marathon、Amazon ECS 和 Nomad。
微服务必须能够根据不断变化的工作负载、服务等级协定(service-levelagreement,SLA)和性能要求进行扩缩容;必须支持垂直伸缩,即在每个微服务实例上增加或减少 CPU、内存和磁盘等计算资源;还必须支持水平伸缩,能够添加和删除新实例。
每个微服务都应该作为一个单元进行部署。对于许多微服务来说,一个单一的可执行文件是执行其业务需求所需的全部,并且可以在单个容器中部署。其他的微服务可能更复杂,有多个容器和外部数据存储需要协调。这就是类似 Kubernetes 的 pod 概念发挥作用的地方,它允许执行单个动作就完成多个容器的部署和恢复。Kubernetes 还允许单次运行操作,例如,数据库迁移可以在执行单次部署时运行。
虚拟机管理受到了大量实现的支持,但比起容器管理还是更加受限。Kubernetes 和 Docker Engine 支持谷歌的 gVisor 和 Kata Containers,同时亚马逊平台支持 AWS Firecracker。随着开发的继续,容器和虚拟机之间的界限将越来越模糊。请确保你选择的 CMS 能够处理你需要的容器和虚拟机。
关于 Kubernetes、Docker、Mesos、Amazon ECS 和 Nomad 的资源有很多,它们提供的信息远远超出了本书所能提供的。我鼓励你查阅这些资料以获得更多信息。
缴纳微服务税
微服务税是与实现微服务架构的工具和组件相关的成本总和,包括财务、人力和机会成本。它包含了管理、部署以及操作事件代理、CMS、部署管道、监控解决方案和日志服务的开销。这些费用是不可避免的,要么由组织集中支付,要么由实现微服务的每个团队独立支付。前者为开发微服务提供了一个可伸缩的、简化的、统一的框架,而后者导致了过度的开销、重复的解决方案、支离破碎的工具和不可持续的增长。
缴纳微服务税不是一件小事,它是事件驱动型微服务起步的最大障碍之一。小型组织最好坚持使用更适合其业务需求的体系结构,例如模块化的单体应用。大型组织需要考虑微服务平台实施和维护的总成本,并确定其业务的长期路线图是否能够适应预期的工作量。
幸运的是,近年来开源和托管服务都变得更加可用和易用。随着 CMS、事件代理和其他常用工具之间的新集成,微服务税正在稳步降低。确保你的组织已准备好投入必要的资源来支付这些前期费用。
小结
本章介绍了事件驱动型微服务背后的基本要求。事件代理是数据通信的主要机制,提供了大规模的实时事件流供其他服务消费。容器化和 CMS 使得可以大规模运行微服务。本章还介绍了事件和事件驱动逻辑的基本原理,并第一次介绍了在分布式事件驱动世界中管理状态的方法。