微服务部署策略 学习记录

学习文章: https://www.nginx.com/blog/deploying-microservices/

一个微服务的应用程序包括几十甚至数百个服务的。服务以多种语言和框架编写。每个应用程序都是一个微型应用程序,具有自己的特定部署,资源,扩展和监视要求。例如,您需要根据对该服务的需求运行一定数量的每个服务的实例。另外,必须为每个服务实例提供适当的CPU,内存和I / O资源。更具挑战性的是,尽管存在这种复杂性,但部署服务必须快速,可靠且具有成本效益。

  • 每个主机模式有多个服务实例
    image.png

优点:
一个主要的好处是它的资源使用相对高效。多个服务实例共享服务器及其操作系统。如果一个进程或进程组运行多个服务实例,例如共享同一个Apache Tomcat服务器和JVM的多个Web应用程序,则效率更高。
另一个好处是,部署服务实例相对较快。您只需将服务复制到主机并启动即可。如果服务是用Java编写的,则可以复制JAR或WAR文件。对于其他语言,例如Node.js或Ruby,则复制源代码。无论哪种情况,通过网络复制的字节数都相对较小。
缺点:
“每个主机的多个服务实例”模式仍存在一些重大缺陷。一个主要缺点是,除非每个服务实例是一个单独的进程,否则服务实例几乎没有隔离。尽管可以准确地监视每个服务实例的资源利用率,但是不能限制每个实例使用的资源。行为异常的服务实例可能会消耗主机的所有内存或CPU。
如果多个服务实例在同一进程中运行,则根本没有隔离。例如,所有实例可能共享相同的JVM堆。行为异常的服务实例很容易破坏在同一进程中运行的其他服务。此外,您无法监视每个服务实例使用的资源。

每个主机模式的服务实例

部署微服务的另一种方法是“ 每主机服务实例”模式。使用此模式时,每个服务实例都在其自己的主机上独立运行。此模式有两种不同的专业化:每个虚拟机的服务实例和每个容器的服务实例

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

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

image.png

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

Boxfuse公司有一种引人注目的方式来构建VM映像,它克服了我在下面描述的VM的缺点。Boxfuse将Java应用程序打包为最小的VM映像。由于这些映像暴露出有限的攻击面,因此它们可以快速构建,快速启动并且更安全。

每个虚拟机模式的服务实例有很多好处。
VM的主要优点是,每个服务实例都可以完全隔离地运行。它具有固定数量的CPU和内存,无法从其他服务中窃取资源。

将微服务部署为VM的另一个好处是,您可以利用成熟的云基础架构。AWS之类的云提供了有用的功能,例如负载平衡和自动扩展。

将服务部署为VM的另一个巨大好处是,它封装了服务的实现技术。将服务打包为VM后,它将变成一个黑匣子。VM的管理API成为用于部署服务的API。部署变得更加简单和可靠。
缺点
一个缺点是资源利用效率较低。每个服务实例都有整个VM(包括操作系统)的开销。此外,在典型的公共IaaS中,VM具有固定的大小,并且VM使用率可能不足。

迁移时,公共IaaS通常对VM收费,而不管它们是忙还是闲。诸如AWS之类的IaaS提供自动缩放功能,但是很难对需求变化做出快速反应。因此,您通常必须过量配置VM,这会增加部署成本。

这种方法的另一个缺点是,部署新版本的服务通常很慢。由于VM映像的大小,其生成速度通常很慢。同样,再次由于其大小,VM实例化速度通常很慢。另外,操作系统通常需要一些时间才能启动。但是请注意,这并不是普遍适用的,因为存在轻量级VM,例如Boxfuse构建的那些。

每个容器模式的服务实例

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

image.png

请将服务打包为容器映像。容器映像是由运行服务所需的应用程序和库组成的文件系统映像。一些容器映像由完整的Linux根文件系统组成。其他则更轻巧。例如,要部署Java服务,您需要构建一个容器映像,其中包含Java运行时(可能是Apache Tomcat服务器)和已编译的Java应用程序。

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

优点:
容器的好处类似于VM的好处。它们将您的服务实例彼此隔离。您可以轻松地监视每个容器消耗的资源。另外,容器与VM一样,封装了用于实现服务的技术。容器管理API也可用作管理服务的API。
容器是一种轻量级技术。容器映像通常构建起来非常快。例如,在我的笔记本电脑上,将Spring Boot应用程序打包为Docker容器仅需5秒钟。由于没有冗长的OS启动机制,因此容器也可以非常快速地启动。当容器启动时,运行的是服务。

缺点:
是,您要对管理容器图像进行无差别的繁重工作负责。另外,除非您使用托管容器解决方案(例如Google Container Engine或Amazon EC2容器服务(ECS)),否则您必须管理容器基础架构以及可能在其上运行的VM基础架构。

此外,容器通常部署在按虚拟机定价的基础架构上。因此,如前所述,您可能会产生过度配置VM的额外费用,以处理负载高峰。

无服务器部署

AWS Lambda是无服务器部署技术的示例

你可能感兴趣的:(微服务部署策略 学习记录)