菜单

应用层

相关源文件

应用层,也称为平台层,是可扩展系统设计的关键组成部分,位于 Web 层和数据存储层之间。本节介绍如何将应用层组件从 Web 层分离、应用层设计原则、微服务架构和服务发现机制。

有关数据库和数据存储的信息,请参阅数据库。有关服务之间通信的信息,请参阅通信

应用层概述

应用层封装了系统的业务逻辑,并为 Web 层提供了一个与底层数据和服务交互的 API。将应用层从 Web 层分离,可以清晰地划分职责,从而可以独立扩展和配置每个组件。

来源: README.md773-784

分离 Web 层和应用层的好处

应用层分离在可扩展系统设计中提供了许多优势

优点描述
独立扩展每一层都可以根据其特定的资源需求进行水平扩展
专门优化Web 服务器可以针对 HTTP 请求进行优化,而应用服务器可以针对业务逻辑进行优化
资源隔离一层中的问题不太可能影响另一层
部署灵活性对应用程序逻辑的更新不需要更改 Web 层
技术多样性每层都可以使用不同的技术

添加新的 API 或服务时,可以添加应用服务器,而无需添加 Web 服务器。这种方法符合 单一职责原则,该原则提倡小型、自主的服务协同工作以形成完整的系统。

来源: README.md781-784

微服务

微服务是一套可以独立部署的小型模块化服务。每个服务运行一个唯一的进程,并通过定义明确的轻量级机制进行通信,以实现业务目标。

微服务的特点

  • 独立部署:每个服务都可以独立部署,不会影响其他服务
  • 小而专注:每个服务处理特定的业务功能
  • 模块化:服务围绕业务能力构建
  • 轻量级通信:通信通常使用 REST API 或消息队列
  • 去中心化数据管理:每个服务管理自己的数据库
  • 故障隔离:一个服务中的故障不会蔓延到其他服务

用例示例

例如,Pinterest 为各种功能实施了微服务

  • 用户资料服务
  • 关注者服务
  • Feed 生成服务
  • 搜索服务
  • 照片上传服务

这些服务中的每一个都可以独立地开发、部署和扩展,从而使团队可以并行工作并快速响应不断变化的需求。

来源: README.md786-790

服务发现

服务发现是一种机制,可帮助服务找到彼此并进行通信,而无需硬编码的位置。这在微服务架构中至关重要,因为服务可以动态创建、销毁或移动。

服务发现组件

Consul、Etcd 和 Zookeeper 等系统通过以下方式提供服务发现

  1. 服务注册:服务注册其名称、地址和端口
  2. 服务查找:服务查询注册表以查找其他服务
  3. 健康检查:定期验证服务是否正常运行
  4. 键值存储:存储配置和共享数据

健康检查

健康检查对于维持服务可靠性至关重要。它们通常使用

  • 返回状态信息的 HTTP 端点
  • TCP 套接字检查
  • 用于复杂验证的自定义脚本

服务发现系统从注册表中删除不健康的实例,从而防止其他服务尝试使用它们。

来源: README.md792-794

应用层和异步性

应用层通常包含异步处理,以处理耗时的任务,而不会阻塞用户体验。应用层中的 Worker 可以

  • 处理来自消息队列的作业
  • 执行计划任务
  • 处理长时间运行的操作
  • 处理来自数据流的事件

这种方法可以独立于主请求-响应流水平扩展特定操作。

来源: README.md784

分离应用层的缺点

虽然拥有一个独立的应用层有很多好处,但也存在一些挑战

  1. 增加复杂性:需要管理的更多网络跃点和组件
  2. 运营开销:需要部署、监控和维护的更多服务
  3. 需要不同的方法:从单体架构迁移到松散耦合架构需要改变开发实践、运营和流程
  4. 微服务的复杂性:微服务给部署、监控和调试带来了挑战

来源: README.md796-798

何时使用独立的应用层

在以下情况下,独立的应用层最有利

  • 您的系统需要独立扩展不同的组件
  • 您有可以与演示逻辑分离的独特业务逻辑
  • 您预计业务逻辑会频繁更改
  • 您需要支持多个客户端界面(Web、移动设备、API)
  • 您的系统具有复杂的处理要求

对于流量低且复杂度较低的简单应用程序,单体方法可能更合适。

实际实施注意事项

实施应用层时

  • 使用 API 网关来管理对微服务的访问
  • 跨服务实施一致的错误处理
  • 使用断路器来优雅地处理服务故障
  • 考虑使用容器化 (Docker) 和编排 (Kubernetes)
  • 实施强大的日志记录和监控
  • 在服务之间定义清晰的接口和合约

总结

通过将业务逻辑与 Web 演示文稿分离,应用层提供了一种构建大规模系统的强大方法。通过微服务架构和服务发现机制,它可以使复杂的系统高效扩展和独立发展。虽然引入了一些额外的复杂性,但灵活性、可扩展性和可维护性的优势使其成为现代系统设计的关键组成部分。