微服务部署模式
微服务部署模式
大纲(优先看)
微服务部署模式的上下文:
- 微服务架构包含一组服务
- 每个服务都部署为一组服务实例以实现吞吐量和可用性
问题背景:如何部署?
需求背景:
- 微服务使用各种语言、框架和不同的框架版本
- 需要快速构建、独立部署和扩展服务
- 服务实例之间要相互隔离
- 监控每个服务实例的行为
- 限制服务消耗的资源(CPU和内存)
- 尽可能降低成本
部署模式列表:
- 单主机部署多个服务实例
- 单主机部署单个服务实例
- 服务部署到虚拟机
- 服务部署到容器
- 服务部署平台
- 无服务器部署
基础设施相关模式组——部署模式:

单主机部署多个服务实例
在主机(物理机或虚拟机)上运行不同服务的多个实例,存在资源需求冲突的风险。
有多种方法可以实现这种部署,比如每个服务实例占用一个进程
优点
资源利用率高
缺点
- 资源需求冲突
- 依赖版本冲突
- 难以限制服务实例消耗的资源
- 因为一个进程中可能有多个服务实例,因此很难监控每个服务实例资源消耗,也没法隔离每个实例
相关模式
替代模式:单主机部署单个服务实例
单主机部署单个服务实例
一台主机上部署一个服务实例
优点
- 服务实例彼此隔离
- 不存在资源冲突或依赖版本冲突
- 最多消耗一个主机的资源
- 监控、管理、重新部署都很简单
缺点
资源利用率低
相关模式
替代模式:单主机部署多个服务实例、无服务器部署
特化模式:服务部署到虚拟机、服务部署到容器
服务部署到虚拟机
把服务打包为虚拟机镜像,并将每个服务实例部署为单独的虚拟机。可以认为运行时每个服务都是该镜像实例化的虚拟机。
优点
- 通过增加实例数量来扩展服务很简单(负载均衡)
- VM封装了服务构建的细节,所有服务启动和终止方式是一致的
- 每个服务实例都是隔离的(单独的VM)
- VM可以对服务实例消耗的CPU与内存进行限制
缺点
- 资源利用率较低(一台虚拟机只允许一个服务实例)
- 部署相对慢(分钟级)
- 操作系统管理VM所需的额外开销
相关模式
替代模式:服务部署到容器
泛化模式:单主机部署单个服务实例
服务部署到容器
将服务打包为容器镜像并部署到容器中
容器是一种轻量级部署方案,可以在一台机器上运行多个容器共享操作系统,从容器的角度看,它就好像有自己的独立IP、端口,与其他容器不冲突,互相独立运行;同时目前有很多现代化工具来编排容器协调资源,比如k8s
优点
- 更改容器数量可以直接扩展或缩减服务
- 容器封装了服务构建的细节,所有服务启动和终止方式是一致的
- 服务实例互相隔离
- 容器可以限制服务实例使用的CPU及内存
- 容器的构建和启动是很快的(明显快于VM镜像构建与VM启动)
缺点
- 大量容器的管理
- 部署容器的基础设施没有部署VM的基础设施丰富
相关模式
替代模式:服务部署到虚拟机
泛化模式:单主机部署单个服务实例
无服务器部署
使用公有云提供的serverless部署机制部署服务,部署细节对用户是隐藏的,用户不要管理基础设施(没有服务器的概念)。需要用户打包代码(比如zip)并上传,基础设施获取服务代码并运行。常用的公有云serverless平台有AWS Lambda、Azure Functions等
示例:使用AWS Lambda部署Restaurant Service

优点
- AWS服务集成简单
- 消除系统管理任务,比如底层系统管理、操作系统或运行时补丁等
- 弹性伸缩:运行多个服务实例以动态处理负载
缺点
- 延迟:请求可能有高延迟(Java服务通常需要至少几秒钟,不适合对延迟敏感的服务)
- 不适合长时间运行的服务
相关模式
替代模式:单主机部署单个服务实例
服务部署平台
使用部署平台作为应用程序部署的自动化基础设施,提供服务抽象(一组命名的、高可用服务实例):
- Docker编排框架,比如k8s
- 无服务器平台,比如AWS Lambda
- PaaS,比如Cloud Foundary
Docker编排框架将运行着Docker的一组计算机转变为资源集群,将容器分配给机器,提供资源管理、调度和服务管理等功能。常用编排框架有k8s
现代常用的服务部署平台:k8s集群
优点
多种后续模式(Successor)支持,使用灵活性高;功能强大
缺点
额外的学习和资源成本
相关模式
后续模式:服务部署到虚拟机,服务部署到容器,无服务器部署
总结
微服务的各种部署模式都有各自利弊,在进行微服务部署时应当选择支持服务要求的最轻量级部署模式,比如Serverless 容器 虚拟机
再回顾一下这张关系图:
