微服务实战(六):选择微服务部署策略

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文讲的是微服务实战(六):选择微服务部署策略,【编者的话】这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理。这篇文章,我们将讨论部署微服务的策略。
本文讲的是微服务实战(六):选择微服务部署策略 【编者的话】这篇博客是用微服务建应用的第六篇, 第一篇 介绍了微服务架构模板,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理。这篇文章,我们将讨论部署微服务的策略。

本系列文章:

动机

部署一个单体式应用意味运行大型应用的多个副本,典型的提供若干个(N)服务器(物理或者虚拟),运行若干个(M)个应用实例。部署单体式应用不会很直接,但是肯定比部署微服务应用简单些。

一个微服务应用由上百个服务构成,服务可以采用不同语言和框架分别写就。每个服务都是一个单一应用,可以有自己的部署、资源、扩展和监控需求。例如,可以根据服务需求运行若干个服务实例,除此之外,每个实例必须有自己的CPU,内存和I/O资源。尽管很复杂,但是更挑战的是服务部署必须快速、可靠和性价比高。

有一些微服务部署的模式,先讨论一下每个主机多服务实例的模式。

单主机多服务实例模式

部署微服务的一种方法就是单主机多服务实例模式,使用这种模式,需要提供若干台物理或者虚拟机,每台机器上运行多个服务实例。很多情况下,这是传统的应用部署方法。每个服务实例运行一个或者多个主机的well-known端口,主机可以看做宠物。

下图展示的是这种架构:
1.png

这种模式有一些参数,一个参数代表每个服务实例由多少进程构成。例如,需要在Apache Tomcat Server上部署一个Java服务实例作为web应用。一个Node.js服务实例可能有一个父进程和若干个子进程构成。

另外一个参数定义同一进程组内有多少服务实例运行。例如,可以在同一个Apache Tomcat Server上运行多个Java web应用,或者在同一个OSGI容器内运行多个OSGI捆绑实例。

单主机多服务实例模式也是优缺点并存。主要优点在于资源利用有效性。多服务实例共享服务器和操作系统,如果进程组运行多个服务实例效率会更高,例如,多个web应用共享同一个Apache Tomcat Server和JVM。

另一个优点在于部署服务实例很快。只需将服务拷贝到主机并启动它。如果服务用Java写的,只需要拷贝JAR或者WAR文件即可。对于其它语言,例如Node.js或者Ruby,需要拷贝源码。也就是说网络负载很低。

因为没有太多负载,启动服务很快。如果服务是自包含的进程,只需要启动就可以;否则,如果是运行在容器进程组中的某个服务实例,则需要动态部署进容器中,或者重启容器。

除了上述优点外,单主机多服务实例也有缺陷。其中一个主要缺点是服务实例间很少或者没有隔离,除非每个服务实例是独立进程。如果想精确监控每个服务实例资源使用,就不能限制每个实例资源使用。因此有可能造成某个糟糕的服务实例占用了主机的所有内存或者CPU。

同一进程内多服务实例没有隔离。所有实例有可能,例如,共享同一个JVM heap。某个糟糕服务实例很容易攻击同一进程中其它服务;更甚至于,有可能无法监控每个服务实例使用的资源情况。

另一个严重问题在于运维团队必须知道如何部署的详细步骤。服务可以用不同语言和框架写成,因此开发团队肯定有很多需要跟运维团队沟通事项。其中复杂性增加了部署过程中出错的可能性。

可以看到,尽管熟悉,但是单主机多服务实例有很多严重缺陷。下面看看是否有其他部署微服务方式能够避免这些问题。

单主机单服务实例模式

另外一种部署微服务方式是单主机单实例模式。当使用这种模式,每个主机上服务实例都是各自独立的。有两种不同实现模式:单虚拟机单实例和单容器单实例。

单虚拟机单实例模式

但是用单虚拟机单实例模式,一般将服务打包成虚拟机映像(image),例如一个Amazon EC2 AMI。每个服务实例是一个使用此映像启动的VM(例如,EC2实例)。下图展示了此架构:
2.png

Netfix采用这种架构部署video streaming service。Netfix使用Aminator将每个服务打包成一个EC2 AMI。每个运行服务实例就是一个EC2实例。

有很多工具可以用来搭建自己的VMs。可以配置持续集成(CI)服务(例如,Jenkins)避免Aminator将服务打包成EC2 AMI。packer.io是自动虚机映像创建的另外一种选择。跟Aminator不同,它支持一系列虚拟化技术,例如EC2,DigitalOcean,VirtualBox和VMware。​

Boxfuse公司有一个创新方法创建虚机映像,克服了如下缺陷。Boxfuse将java应用打包成最小虚机映像,它们创建迅速,启动很快,因为对外暴露服务接口少而更加安全。

CloudNative公司有一个用于创建EC2 AMI的SaaS应用,Bakery。用户微服务架构通过测试后,可以配置自己的CI服务器激活Bakery。Bakery将服务打包成AMI。使用如Bakery的SaaS应用意味着用户不需要浪费时间在设置自己的AMI创建架构。

每虚拟机服务实例模式有许多优势,主要的VM优势在于每个服务实例都是完全独立运行的,都有各自独立的CPU和内存而不会被其它服务占用。

另外一个好处在于用户可以使用成熟云架构,例如AWS提供的,云服务都提供如负载均衡和扩展性等有用功能。

还有一个好处在于服务实施技术被自包含了。一旦服务被打包成VM就成为一个黑盒子。VM的管理API成为部署服务的API,部署成为一个非常简单和可靠的事情。

单虚拟机单实例模式也有缺点。一个缺点就是资源利用效率不高。每个服务实例战友整个虚机的资源,包括操作系统。而且,在一个典型的公有IaaS环境,虚机资源都是标准化的,有可能未被充分利用。

而且,公有IaaS根据VM来收费,而不管虚机是否繁忙;例如AWS提供了自动扩展功能,但是对随需应用缺乏快速响应,使得用户不得不多部署虚机,从而增加了部署费用。

另外一个缺点在于部署服务新版本比较慢。虚机镜像因为大小原因创建起来比较慢,同样原因,虚机初始化也比较慢,操作系统启动也需要时间。但是这并不一直是这样,一些轻量级虚机,例如使用Boxfuse创建的虚机,就比较快。

第三个缺点是对于运维团队,它们负责许多客制化工作。除非使用如Boxfuse之类的工具,可以帮助减轻大量创建和管理虚机的工作;否则会占用大量时间从事与核心业务不太无关的工作。

那么我们来看看另外一种仍然具有虚机特性,但是比较轻量的微服务部署方法。

单容器单服务实例模式

当使用这种模式时,每个服务实例都运行在各自容器中。容器是运行在操作系统层面的虚拟化机制。一个容器包含若干运行在沙箱中的进程。从进程角度来看,他们有各自的命名空间和根文件系统;可以限制容器的内存和CPU资源。某些容器还具有I/O限制,这类容器技术包括Docker和Solaris Zones。

下图展示了这种模式:
3.png

​使用这种模式需要将服务打包成容器映像。一个容器映像是一个运行包含服务所需库和应用的文件系统​。某些容器映像由完整的linux根文件系统组成,其它则是轻量级的。例如,为了部署Java服务,需要创建包含Java运行库的容器映像,也许还要包含Apache Tomcat server,以及编译过的Java应用。

一旦将服务打包成容器映像,就需要启动若干容器。一般在一个物理机或者虚拟机上运行多个容器,可能需要集群管理系统,例如k8s或者Marathon,来管理容器。集群管理系统将主机作为资源池,根据每个容器对资源的需求,决定将容器调度到那个主机上。

单容器单服务实例模式也是优缺点都有。容器的优点跟虚机很相似,服务实例之间完全独立,可以很容易监控每个容器消耗的资源。跟虚机相似,容器使用隔离技术部署服务。容器管理API也可以作为管理服务的API。

然而,跟虚机不一样,容器是一个轻量级技术。容器映像创建起来很快,例如,在笔记本电脑上,将Spring Boot 应用打包成容器映像只需要5秒钟。因为不需要操作系统启动机制,容器启动也很快。当容器启动时,后台服务就启动了。

使用容器也有一些缺点。尽管容器架构发展迅速,但是还是不如虚机架构成熟。而且由于容器之间共享host OS内核因此并不像虚机那么安全。

另外,容器技术将会对管理容器映像提出许多客制化需求,除非使用如Google Container Engine或者Amazon EC2 Container Service (ECS),否则用户将同时需要管理容器架构以及虚机架构。

第三,容器经常被部署在按照虚机收费的架构上,很显然,客户也会增加部署费用来应对负载的增长。

有趣的是,容器和虚机之间的区别越来越模糊。如前所述,Boxfuse虚机启动创建都很快,Clear Container技术面向创建轻量级虚机。unikernel公司的技术也引起大家关注,Docker最近收购了Unikernel公司。

除了这些之外,server-less部署技术,避免了前述容器和VM技术的缺陷,吸引了越来越多的注意。下面我们来看看。

Serverless 部署

AWS Lambda是serverless部署技术的例子,支持Java,Node.js和Python服务;需要将服务打包成ZIP文件上载到AWS Lambda就可以部署。可以提供元数据,提供处理服务请求函数的名字(一个事件)。AWS Lambda自动运行处理请求足够多的微服务,然而只根据运行时间和消耗内存量来计费。当然细节决定成败,AWS Lambda也有限制。但是大家都不需要担心服务器,虚拟机或者容器内的任何方面绝对吸引人。

Lambda 函数 是无状态服务。一般通过激活AWS服务处理请求。例如,当映像上载到S3 bucket激活Lambda函数后,就可以在DynamoDB映像表中插入一个条目,给Kinesis流发布一条消息,触发映像处理动作。Lambda函数也可以通过第三方web服务激活。

有四种方法激活Lambda函数:
  1. 直接方式,使用web服务请求
  2. 自动方式,回应例如AWS S3,DynamoDB,Kinesis或者Simple Email Service等产生的事件
  3. 自动方式,通过AWS API网关来处理应用客户端发出的HTTP请求​
  4. 定时方式,通过cron响应​--很像定时器方式

可以看出,AWS Lambda是一种很方便部署微服务的方式。基于请求计费方式意味着用户只需要承担处理自己业务那部分的负载;另外,因为不需要了解基础架构,用户只需要开发自己的应用。

然而还是有不少限制。不需要用来部署长期服务,例如用来消费从第三方代理转发来的消息,请求必须在300秒内完成,服务必须是无状态,因为理论上AWS Lambda会为每个请求生成一个独立的实例;必须用某种支持的语言完成,服务必须启动很快,否则,会因为超时被停止。

总结

部署微服务应用也是一种挑战。用各种语言和框架写成的服务成百上千。每种服务都是一种迷你应用,有自己独特的部署、资源、扩充和监控需求。有若干种微服务部署模式,包括单虚机单实例以及单容器单实例。另外可选模式还有AWS Lambda,一种serverless方法。

在下一篇也是本系列最后一篇​博客中,我们来讨论如何将一个单体式应用迁移到微服务架构。

原文链接:Choosing a Microservices Deployment Strategy(翻译:杨峰)

原文发布时间为:2016-02-28
本文作者:hokingyang 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:微服务实战(六):选择微服务部署策略
目录
相关文章
|
3天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
24天前
|
存储 监控 Kubernetes
探索微服务架构下的系统监控策略
在当今软件开发领域,微服务架构因其灵活性、可扩展性和容错性而日益受到青睐。然而,这种架构的复杂性也为系统监控带来了新的挑战。本文旨在探讨在微服务环境下实现有效系统监控的策略,以及如何利用这些策略来确保系统的健壮性和性能。我们将从监控的关键指标入手,讨论分布式追踪的重要性,并分析不同的监控工具和技术如何协同工作以提供全面的系统视图。
|
30天前
|
消息中间件 敏捷开发 运维
构建高效可靠的微服务架构:策略与实践
随着现代软件开发的复杂性增加,微服务架构逐渐成为企业解决大型应用系统分解、敏捷开发和持续部署问题的有效手段。本文深入探讨了构建一个高效且可靠的微服务架构的关键策略,包括服务的合理划分、通信机制的选择、数据一致性保障以及容错处理。通过分析这些策略在具体案例中的应用,我们旨在为开发者提供一套可行的微服务设计及实施指南。
130 6
|
1月前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
1月前
|
监控 Kubernetes 持续交付
构建高效微服务架构:策略与实践
【2月更文挑战第20天】 在现代软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将大型应用程序拆分为一组小型、独立的服务来提高可维护性和扩展性。本文旨在探讨构建高效微服务架构的关键策略和实践方法。我们将分析微服务设计原则、服务划分的最佳实践、容器化技术的应用,以及如何通过持续集成和持续部署(CI/CD)流程确保微服务的快速迭代和稳定性。此外,文章还将讨论监控和日志管理在微服务环境中的重要性,并提出一些处理分布式系统常见问题的策略。
|
5天前
|
机器学习/深度学习 运维 Prometheus
探索微服务架构下的系统监控策略
【4月更文挑战第18天】在当今快速迭代和持续部署盛行的软件工程实践中,微服务架构因其灵活性和可扩展性受到企业青睐。然而,随着服务的细粒度拆分和网络通信的增加,传统的监控手段已不再适用。本文将探讨在微服务环境中实施有效系统监控的策略,包括日志聚合、性能指标收集、分布式追踪以及异常检测等关键技术实践,旨在为读者提供构建稳定、可靠且易于维护的微服务系统的参考指南。
10 0
|
22天前
|
消息中间件 安全 API
构建高效微服务架构:策略与实践
【4月更文挑战第1天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和灵活部署的重要技术手段。本文将深入探讨如何通过合理的设计原则和先进的技术栈,构建一个高效的微服务系统。我们将剖析微服务设计的核心要点,包括服务的划分、通信机制、数据一致性以及安全性问题,并结合案例分析,展示如何在现实世界中应用这些策略以提升系统的可靠性和性能。
|
25天前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
38 0
|
1月前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
正如优秀的软件设计一样,uni-app把一些移动端常用的功能做成了独立的服务或者插件,我们在使用的时候只需要选择使用即可。但是在使用这些服务或者插件时一定要区分其提供的各种服务和插件的使用场景,例如其提供的【uni-starter快速开发项目模版】几乎集成了移动端所需的所有基础功能,使用非常方便,但是其许可协议只允许对接其uniCloud的JS开发服务端,不允许对接自己的php、java等其他后台系统。
140 2
|
1月前
|
消息中间件 敏捷开发 运维
构建高性能微服务架构:策略与实践
【2月更文挑战第27天】 在当今快速迭代和持续部署的软件发展背景下,微服务架构因其灵活性、可扩展性和技术异构性的优势而成为众多企业的首选架构模式。然而,随之而来的复杂性管理和性能优化问题也不容忽视。本文深入探讨了构建高性能微服务架构的策略与实践,包括服务拆分原则、通信机制、数据一致性保障以及监控和故障处理等方面。通过分析具体案例和最佳实践,旨在为开发者提供一个清晰、高效的微服务性能优化路径。