h5打开以查看

微服务和 Serverless 是现代云原生架构中两个最核心和流行的概念,它们既有联系又有本质区别。

一、微服务

微服务是一种架构风格,它将一个庞大的单体应用程序拆分成一组小型、松散耦合、自治的服务

核心思想: “分而治之”。每个服务都围绕着特定的业务能力(例如,用户服务、订单服务、支付服务)进行构建,并可以独立开发、部署、扩展和运维。

关键特征:

  1. 单一职责: 每个服务只专注于做好一件事。

  2. 独立部署: 你可以更新一个服务并单独部署它,而无需重新部署整个应用程序。

  3. 技术多样性: 不同的服务可以使用不同的编程语言、数据库和技术栈。

  4. 围绕业务构建: 服务的划分是根据业务领域,而不是技术层。

  5. 轻量级通信: 服务之间通过明确的 API(通常是 RESTful HTTP 或 gRPC)进行通信。

  6. 去中心化治理: 每个服务可以有自己的数据库,强调数据自治。

优点:

  • 敏捷性: 小团队可以独立、快速地开发和发布功能。

  • 弹性: 一个服务的故障不一定会导致整个系统崩溃。

  • 可扩展性: 可以只对需要扩展的服务进行水平扩展,更节省资源。

  • 技术自由: 可以为不同的任务选择最合适的技术。

挑战:

  • 复杂性: 分布式系统本身就很复杂,涉及服务发现、配置管理、网络延迟、容错等。

  • 运维开销: 需要管理和监控大量的服务,对 DevOps 和自动化要求高。

  • 数据一致性: 维护跨服务的事务(分布式事务)比在单体应用中困难得多。


二、Serverless

Serverless(无服务器)是一种云原生计算模型,它让开发者无需关心服务器的管理和运维。云服务商会动态地管理机器资源的分配。

核心思想: “按需执行,按量付费”。你的代码只在被事件触发时运行,当任务完成后,计算资源会立即释放。你只为代码实际运行的时间付费。

关键特征:

  1. 无服务器管理: 开发者完全不用操心服务器、虚拟机或容器。所有的基础设施管理工作都由云厂商负责。

  2. 事件驱动: 函数通常由事件触发,例如 HTTP 请求、文件上传、消息队列中的消息、数据库变更等。

  3. 自动弹性伸缩: 云平台会根据请求数量自动从零扩展到成千上万个实例,无需任何配置。

  4. 按执行付费: 计费粒度是代码的执行时间和内存消耗,而不是预置的服务器时长。

主要形式:

  • FaaS: 这是 Serverless 的核心,例如 AWS Lambda, Azure Functions, Google Cloud Functions。你上传一段代码(函数),它会被事件触发执行。

  • BaaS: 后端即服务,例如云数据库、身份验证服务、存储服务等,让你可以直接调用 API 来使用后端功能,而无需自建服务器。

优点:

  • 极低的运维成本: 无需管理操作系统、打补丁、容量规划等。

  • 成本效益高: 对于流量波动大或间歇性任务,只为使用付费,可以极大降低成本。

  • 内置高可用和弹性: 这些能力由云平台提供,开箱即用。

挑战:

  • 冷启动延迟: 函数在闲置后首次被调用时,需要时间初始化,可能导致响应变慢。

  • 执行时长限制: 函数通常有最大执行时间限制(如15分钟),不适合长时间运行的任务。

  • 状态管理复杂: 函数是无状态的,需要将状态存储到外部服务(如数据库、缓存)中。

  • 厂商锁定: 不同云厂商的 FaaS 平台在事件源、工具链和API上存在差异,迁移成本较高。


三、微服务 vs. Serverless:关系与对比

它们不是互斥的,而是可以互补的,并且在概念上有重叠。

1. 关系:演进与互补

  • Serverless 是实现微服务的一种优秀方式。
    你可以将每个微服务写成一个或多个 Serverless 函数。例如,一个“图片处理微服务”可以由一个由图片上传事件触发的 Lambda 函数来实现。

  • 它们都致力于实现同样的目标: 构建松耦合、可扩展和可维护的系统。

2. 核心区别对比

特性微服务Serverless
核心概念架构风格(如何构建应用)计算模型/运行平台(如何运行代码)
抽象层次应用层,关注服务拆分和通信基础设施层,抽象了服务器和运行时环境
部署单位一个长期运行的服务进程(通常在容器中)一个短暂的函数/事件处理程序
生命周期常驻的,启动后持续运行,等待请求瞬时的,按需启动,执行完毕即终止
伸缩性需要手动或自动配置(如 K8s HPA)全自动、由平台实现,从零到无穷
计费模式按预留的资源(如 EC2 实例、ECS 任务)付费按执行次数和时长付费
运维责任需要管理服务运行时的环境(容器、编排)几乎无需管理底层基础设施
最佳场景复杂的、有状态的、需要长时间运行的后端服务事件驱动的、无状态的、短时间的任务(如API后端、数据处理)

四、如何选择?

  • 选择微服务架构:

    • 当你正在构建一个大型、复杂的应用程序,需要长期的、精细的控制。

    • 当你的服务需要复杂的、有状态的、长时间运行的业务流程。

    • 当你的团队有很强的 DevOps 能力,愿意管理容器和编排平台(如 Kubernetes)。

  • 选择 Serverless:

    • 当你的工作负载是事件驱动的,或者流量模式不可预测、有突发性

    • 当你需要构建API后端、进行数据处理(如ETL)、或响应事件(如文件上传)。

    • 当你希望最大化降低运维开销成本(尤其是对于低流量或间歇性任务)。

现代最佳实践:
很多成功的现代应用采用混合架构。它们使用微服务架构来构建核心的、复杂的、常驻的服务,同时使用 Serverless 函数来处理事件驱动的、辅助性的任务(如发送邮件、生成缩略图、定时任务等)。

简单总结:

  • 微服务回答的是“如何设计我的应用?” —— 答案是:拆分成小服务。

  • Serverless 回答的是“我在哪里以及如何运行我的代码?” —— 答案是:在无需管理服务器的平台上,按事件触发运行。

h5打开以查看

更多推荐