微服务部署策略的选择

动机

部署单体应用程序意味着运行多个通常是单个大型应用程序的相同副本。您通常会提供N个服务器(物理或虚拟)并在每个服务器上运行M个应用程序的实例。部署单体应用程序并不简单,但它比部署微服务应用程序要简单得多。

微服务应用程序由数十甚至上百个服务组成。服务由各种语言和框架编写。每个应用程序都是具有自己特定部署、资源、扩展和监视要求的小型应用程序。例如,您需要根据该服务的需求运行一定数量的每个服务的实例。此外,每个服务实例必须提供相应的CPU、内存和I / O资源。除了复杂性外,更具挑战性的是部署服务必须快速,可靠和具有成本效益。

有几种不同的微服务部署模式。我们先看看每个主机多服务实例模式。

每个主机多个服务实例的模式

部署微服务的一种方法是使用每个主机部署多个服务实例的模式。 使用此模式时,您可以提供一个或多个物理主机或虚拟主机,并在其上运行多个服务实例。 在许多方面,这是传统的应用程序部署方法。 每个服务实例在一个或多个主机上的公共端口上运行。

下图显示了此模式的结构。

这种模式有几种变体。一个变体是每个服务实例都是进程或进程组。例如,您可以将Java服务实例作为Web应用程序部署在Apache Tomcat上。 Node.js服务实例可能包含父进程和一个或多个子进程。

此模式的另一个变体是在同一进程或进程组中运行多个服务实例。例如,您可以在同一个Apache Tomcat上部署多个Java Web应用程序,或在同一OSGI容器中运行多个OSGI软件包。

每主机多服务实例模式具有好处和缺点。其主要优点是其资源使用效率相对较高。多个服务实例共享服务器及其操作系统。如果进程或进程组运行多个服务实例(例如共享相同的Apache Tomcat服务器和JVM的多个Web应用程序),这将更加有效。

这种模式的另一个好处是部署服务实例比较快。您只需将服务复制到主机并启动它。如果服务是使用Java编写的,则可以复制JAR或WAR文件。对于其他语言,例如Node.js或Ruby,您可以复制源代码。在任一情况下,通过网络复制的字节数相对较小。

另外,由于缺乏开销,启动服务通常非常快。如果服务是自己的进程,你只需要启动它。否则,如果服务是在同一容器进程或进程组中运行的几个实例之一,则可以将其动态部署到容器中或重新启动容器。

尽管很有吸引力,但每主机多服务实例模式也有一些显着的缺点。一个主要的缺点是服务实例很少或没有隔离,除非每个服务实例是一个单独的进程。您可以准确地监控每个服务实例的资源利用率,但是不能限制每个实例使用的资源。行为不当的服务实例可能会消耗主机的所有内存或CPU。

如果多个服务实例在同一进程中运行,则根本没有隔离。例如,所有实例可能共享相同的JVM堆。行为不当的服务实例可能会轻易破坏在同一进程中运行的其他服务。此外,您无法监控每个服务实例使用的资源。

这种方法的另一个重要问题是部署服务的运维团队必须了解如何执行此操作的具体细节。 服务可以用各种语言和框架编写,因此开发团队必须与运维共享许多细节。 这种复杂性增加了部署期间错误的风险。

如您所见,除了熟悉度,每个主机多服务实例的模式有一些显着的缺点。 现在我们来看看避免部署微服务这些问题的其他方法。

每个主机的服务实例模式

部署您的微服务的另一种方法是每个主机服务实例模式。 当您使用此模式时,您可以在其主机上单独运行每个服务实例。 这种模式有两种不同的特点:每个虚拟机的服务实例和每个容器的服务实例。

每个虚拟机的服务实例模式

当您使用每个虚拟机的服务实例模式时,将每个服务打包为虚拟机(VM)镜像(如Amazon EC2 AMI)。 每个服务实例是使用该VM镜像启动的VM(例如,EC2实例)。 下图显示了此模式的结构:

这是Netflix部署其视频流服务的主要方法。 Netflix将其每个服务作为EC2 AMI使用Aminator进行打包。每个正在运行的服务实例是EC2实例。

可以使用多种工具来构建自己的虚拟机。您可以配置您的持续集成(CI)服务器(例如Jenkins)来调用Aminator将服务打包为EC2 AMI。 Packer.io是自动创建虚拟机镜像的另一个选项。与Aminator不同,它支持各种虚拟化技术,包括EC2,DigitalOcean,VirtualBox和VMware。

Boxfuse公司有一个引人注目的方式来构建VM镜像,克服了下面我描述的虚拟机的缺点。 Boxfuse将您的Java应用程序打包成一个最小的虚拟机镜像。这些镜像快速构建、启动,并且更加安全,因为它们暴露有限的攻击面。

CloudNative公司拥有Bakery,这是一种用于创建EC2 AMI的SaaS产品。您可以在您的微服务通过测试后,配置您的CI服务器以调用Bakery。Bakery然后将您的服务打包为AMI。使用Bakery等SaaS产品意味着您不必浪费宝贵的时间来设置AMI创建的基础架构。

每个虚拟机服务实例的模式有许多好处。 VM的主要优点是每个服务实例完全隔离。它具有固定量的CPU和内存,不能从其他服务窃取资源。

将您的微服务部署为虚拟机的另一个好处是可以利用成熟的云基础设施。诸如AWS之类的云提供了有用的功能,如负载均衡和自动伸缩。

将您的服务部署为虚拟机的另一个好处是它封装了您服务的实现技术。一旦将服务打包成VM,它将成为一个黑匣子。 VM的管理API成为部署服务的API。部署变得更加简单和可靠。

然而,每个虚拟机服务实例的模式也有一些缺点。一个缺点是资源利用效率较低。每个服务实例都有整个VM的开销,包括操作系统。此外,在典型的公共IaaS中,VM具有固定的大小,并且VM可能未被充分利用。

而且,公共IaaS通常对VM负责,无论它们是忙还是空闲。诸如AWS之类的IaaS提供自动伸缩,但很难快速响应需求变化。因此,您经常需要过度提供虚拟机,从而增加部署成本。

这种方法的另一缺点是部署新版本的服务通常很慢。 由于VM的大小,VM镜像的构建通常很慢。 此外,VM实例化由于它们的大小通常也很慢。 此外,操作系统通常需要一些时间启动。 但是请注意,这并不普遍,因为有Boxfuse构建的轻量级VM。

每个虚拟机服务实例的模式的另一个缺点是,通常你(或组织中的其他人)对很多未分化的重担负责。 除非您使用Boxfuse这样的工具来处理构建和管理虚拟机的开销,那么这是您的责任。 这个必要而且耗时的活动会分散您的核心业务。

现在我们来看看一种替代方式来部署更轻量级的但还有许多虚拟机的好处的微服务器。

每个容器服务实例的模式

当您使用每个容器服务实例的模式时,每个服务实例都在其自己的容器中运行。 容器是操作系统级的虚拟化机制。 容器由在沙箱中运行的一个或多个进程组成。 从进程的角度来看,它们有自己的端口、命名空间和根文件系统。 您可以限制容器的内存和CPU资源。 一些容器实现也具有I / O速率限制。 容器技术的例子包括Docker和Solaris Zones。

下图显示了此模式的结构:

要使用此模式,请将您的服务打包为容器镜像。容器镜像是由运行服务所需的应用程序和库组成的文件系统镜像。一些容器镜像由完整的Linux根文件系统组成。其他更轻便。例如,要部署Java服务,您可以构建包含Java运行时,可能是Apache Tomcat服务器和编译的Java应用程序的容器镜像。

将服务打包成容器镜像后,您将启动一个或多个容器。您通常在每个物理或虚拟主机上运行多个容器。您可以使用集群管理器(如Kubernetes或Marathon)来管理容器。集群管理器将主机视为资源池。它根据容器所需的资源和每个主机上可用的资源来决定放置每个容器的位置。

每个容器服务实例的模式有好处和缺点。容器的优点与虚拟机类似。它们将您的服务实例隔离开来。您可以轻松监控每个容器所消耗的资源。而且,像VM一样,容器封装了用于实现您的服务的技术。容器管理API还用作管理您管理服务的API。

然而,与虚拟机不同,容器是轻量级的技术。容器镜像的构建通常非常快。例如,在笔记本电脑上,将Spring Boot应用程序打包成Docker容器需要5秒钟的时间。容器也很快启动,因为没有冗长的操作系统引导机制。当一个容器启动时,服务就运行了。

使用容器有一些缺点。虽然容器基础设施正在快速成熟,但它并不像虚拟机的基础架构那么成熟。此外,容器不像VM那样安全,因为容器彼此共享主机OS的内核。

容器的另一个缺点是,您负责管理容器镜像的未分化重担。另外,除非您使用托管容器解决方案(如Google容器引擎或Amazon EC2容器服务(ECS)),否则您必须管理容器基础架构以及可能运行的VM基础架构。

此外,容器通常部署在具有每VM定价的基础设施上。因此,如前所述,您可能会招致过度配置虚拟机的额外成本,以处理负载峰值。

有趣的是,容器和VM之间的区别可能会模糊。如前所述,Boxfuse VMs快速构建和启动。清除容器项目旨在创建轻量级虚拟机。

还有一个越来越流行的无服务器部署概念,这是一种避开是选择是要在容器还是虚拟机中部署服务的方法。接下来我们来看看。

无服务器部署

AWS Lambda是无服务器部署技术的示例。它支持Java,Node.js和Python服务。要部署一个微服务,您可以将其打包成ZIP文件并将其上传到AWS Lambda。您还提供元数据,其中指定了调用以处理请求(a.k.a.一个事件)的函数的名称。 AWS Lambda自动运行足够的微服务实例来处理请求。您只需根据所用时间和内存消耗,为每个请求收费。当然,恶魔在细节上,您很快就会看到AWS Lambda有局限性。但是,您作为开发人员或组织中的任何人都不需要担心服务器,虚拟机或容器的任何方面都有令人难以置信的吸引力。

Lambda函数是无状态服务。它通常通过调用AWS服务来处理请求。例如,当镜像上传到S3桶时调用的Lambda函数可以将一个项目插入到DynamoDB镜像表中,并将消息发布到Kinesis流以触发镜像处理。 Lambda功能还可以调用第三方Web服务。

有四种方法来调用Lambda函数:

直接使用Web服务请求

自动响应由AWS,DynamoDB,Kinesis或简单电子邮件服务等AWS服务生成的事件

自动通过AWS API网关来处理应用程序客户端的HTTP请求

按照一个类似cron的时间表

如您所见,AWS Lambda是部署微服务的便捷方式。基于请求的定价意味着您只需支付您的服务实际执行的工作。另外,由于您不负责IT基础设施,您可以专注于开发应用程序。

然而,存在一些显着的局限性。它不适用于部署长时间运行的服务,例如从第三方消息代理消费消息的服务。请求必须在300秒内完成。服务必须是无状态的,因为在理论上,AWS Lambda可能为每个请求运行单独的实例。它们必须用支持的语言之一来编写。服务也必须快速启动;否则,它们可能会超时并终止。

总结

部署微服务应用程序具有挑战性。有多种甚至数百种服务用各种语言和框架编写。每个应用程序都是一个具有自己特定部署、资源、扩展和监控要求的小型应用程序。有几个微服务部署模式,包括每个虚拟机服务实例和每个容器的服务实例。部署微服务的另一个有趣的选择是AWS Lambda,一种无服务器的方法。

原文发布于微信公众号 - IT技术精选文摘(ITHK01)

原文发表时间:2017-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯移动品质中心TMQ的专栏

像 google 一样测试系列之五:流程与覆盖率篇

有了用例,还需持续跑起来,并能有覆盖率。如何让 Local Unit Tests和Instrumented Tests 都支持脚本执行?

2301
来自专栏SDNLAB

基于Linux Network Namespace的Mininet架构分析

Mininet作为一个轻量级的SDN仿真工具,在其系统实现架构中充分利用了Linux命名空间内核技术,其中Linux Network Namespace机制更是...

4306
来自专栏R语言___生物信息

Anaconda安装使用

Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本p...

5767
来自专栏Golang语言社区

NSQ:分布式的实时消息平台--简介

源码下载地址: https://github.com/bitly/nsq NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在Gi...

4526
来自专栏美团技术团队

【美团技术博客】Docker系列之二:基于容器的自动构建

自动构建系统是从美团的自动部署系统发展出来的一个新功能。每当开发人员提交代码到仓库后,系统会自动根据开发人员定制的构建配置,启动新的Docker容器,在其中对源...

40010
来自专栏云计算D1net

为什么需要PaaS?对Deis,Heroku,Flynn的一些观察

为什么需要PaaS?一句话,现在的应用程序从源代码到运行阶段太复杂,没有标准的,通用的方式。 整个过程及产出如下: 开发阶段:源代码构建阶段:发布包/可执行程序...

3046
来自专栏不二小段

Python性能提升20倍居然不是标题党?

前两天有小伙伴发了篇文章给我,让我验证一下靠不靠谱,标题写着《如何在 i5 上实现 20 倍的 Python 运行速度?》,我看了不以为然,八成又是个标题党。看...

3318
来自专栏Golang语言社区

NSQ:分布式的实时消息平台--简介

源码下载地址: https://github.com/bitly/nsq NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在Gi...

3946
来自专栏butterfly100

权限控制的解决方式(科普向)

目录 1 权限控制是什么   1.1 ACL   1.2 RBAC     1.2.1 名词术语     1.2.2 RBAC定义     1.2.3 RBAC...

1K11
来自专栏CSDN技术头条

运用Kubernetes进行分布式负载测试

本文为CSDN原创编译文章,禁止转载。 负载测试是开发后台基础架构的重要一环,它不但能够演示系统在真实需求面前的性能表现,还可以通过模拟用户与设备行为,在应用程...

2146

扫码关注云+社区

领取腾讯云代金券