专栏首页IT技术精选文摘微服务部署策略的选择

微服务部署策略的选择

动机

部署单体应用程序意味着运行多个通常是单个大型应用程序的相同副本。您通常会提供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),作者:Chris Richardson

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从Java视角理解系统结构(二)CPU缓存

    众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CP...

    用户1263954
  • 面试题: Docker的优缺点

    由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。

    用户1263954
  • 分布式系统关键技术之服务调度

    服务关键程度要通过对业务的梳理来发现。服务依赖关系用Spring Cloud的一套方法就能够非常好的解决,但是千万不要出现循环依赖,解决方式是通过第三方的消息队...

    用户1263954
  • Chris Richardson微服务翻译:微服务部署

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 ...

    butterfly100
  • 四种正确的微服务部署方式

    在过去的几年中,由于微服务架构(Microservices architecture)能够提供高级别的软件可扩展性,因此十分流行。尽管大多数组织都能够接受这种架...

    lyb-geek
  • 解决SecureCRT的vim中为下划线而无高亮问题,附最佳护眼配色方案。

    今天第一天上班,发现新公司也是用的最熟悉的 SecureCRT 终端。领到自己的办公电脑后,第一件事就是下载并安装了 SecureCRT 7.1。并设置了以前最...

    张戈
  • Android:最全面解析Android消息推送解决方案

    客户端 1. 通过 TCP/IP与XMPP 服务器连接,然后在之上传输与即时通讯相关的指令(XML); 2. 解析组织好的 XML 信息包; ...

    Carson.Ho
  • 如何利用声波对数据进行储存

    大数据文摘
  • 容器 VS. 虚拟机:云中应该使用哪一种?

    在开足马力使用容器之前,了解容器与虚拟机在私有云、公共云以及混合云部署之间的区别是至关重要的。 虽然目前大多数的云部署都是基于虚拟机的,但是容器技术为云用户带来...

    静一
  • Docker 完全指南

    Docker 作为新瓶装旧酒的一门技术,用简单便捷的操作极大改变了软件开发的流程与生态环境,本文我们就来了解一下。注:Docker 目前已改名为 Moby。

    小小科

扫码关注云+社区

领取腾讯云代金券