本文档全面概述了设计和维护可扩展后端系统所需的关键基础设施组件和运维实践。内容涵盖了构成现代分布式应用骨干的核心中间件技术、监控系统、DevOps 实践和测试策略。有关这些系统使用的网络协议信息,请参阅 网络与通信。
后端基础设施由多个专业组件协同工作,以提供可靠、可扩展的服务。下图展示了典型架构中的关键组件及其关系。
来源: README.md128-169
Web服务器处理 HTTP 请求,是客户端与系统交互的入口。
| Web 服务器 | 描述 | 用例 |
|---|---|---|
| Nginx | 事件驱动、非阻塞架构,高并发 | 反向代理、静态内容、负载均衡 |
| Apache HttpD | 基于进程/线程的架构 | 传统 Web 托管,支持多种模块 |
| Tomcat | Java Servlet 容器 | Java Web 应用 |
| Jetty | 轻量级 Java HTTP 服务器和 Servlet 容器 | 嵌入式应用、微服务 |
来源: README.md129-137
缓存通过将频繁访问的数据存储在内存中,从而减少数据库负载并提高响应时间。
| 缓存类型 | 示例 | 特性 |
|---|---|---|
| 本地缓存 | Ehcache, Guava Cache | 内存缓存,单实例,访问速度最快 |
| 客户端缓存 | 浏览器缓存、App 缓存 | 减少网络请求 |
| 服务端缓存 | Redis, Memcached, Tair | 分布式缓存,跨服务一致 |
来源: README.md138-147
消息队列支持服务间的异步通信,提高系统弹性和可扩展性。
| 消息队列 | 重点 | 投递保证 | 用例 |
|---|---|---|---|
| RabbitMQ | 可靠性、多协议支持 | 强保证(事务) | 关键业务操作 |
| Kafka | 高吞吐量、基于日志 | 至少一次 | 日志处理、事件流 |
| RocketMQ | 高性能、可靠性 | 事务性 | 电子商务、金融系统 |
| ActiveMQ | 标准 JMS 实现 | 可配置 | 企业集成 |
来源: README.md148-156
RPC (远程过程调用) 框架促进分布式服务之间的通信。
| RPC 框架 | 语言支持 | 序列化 | 特性 |
|---|---|---|---|
| Dubbo | 主要支持 Java | 多种序列化格式 | 服务治理、负载均衡 |
| gRPC | 多语言 | Protocol Buffers | HTTP/2、流式传输 |
| Thrift | 多语言 | Thrift 格式 | 二进制紧凑协议 |
来源: README.md160-163
API 网关为客户端应用程序提供统一的入口点,以访问后端服务。
常见的 API 网关实现包括 Zuul、Spring Cloud Gateway 和 Kong。
来源: README.md167-169
运维实践确保系统在生产环境中可靠、安全、高效地运行。
监控系统跟踪应用和基础设施的健康状况,而应用性能管理 (APM) 则侧重于应用级别的性能。
| 监控类型 | 工具 | 关注点 |
|---|---|---|
| 基础监控 | Zabbix, Nagios, Prometheus | 服务器指标、资源使用情况 |
| APM | SkyWalking, Pinpoint, Zipkin, CAT | 分布式追踪、请求流 |
| 日志管理 | ELK Stack, Graylog | 日志收集与分析 |
| 自定义指标 | StatsD, Graphite | 业务特定指标 |
需要监控的关键指标
来源: README.md101-107 README.md835-875
CI/CD 实践自动化测试和部署流程,实现频繁、可靠的软件发布。
| CI/CD 实践 | 工具 | 目的 |
|---|---|---|
| 持续集成 | Jenkins, GitLab CI, Travis CI | 自动化构建和测试 |
| 持续交付 | Spinnaker, ArgoCD | 自动化发布到预生产环境 |
| 持续部署 | Jenkins X, GitOps 工具 | 自动化生产部署 |
| 环境隔离 | Docker, Kubernetes | 隔离开发/测试/生产环境 |
来源: README.md891-905
DevOps 融合开发和运维实践,以提高协作和软件交付效率。
DevOps 实践包括
来源: README.md982-985
自动化减少手动干预,提高一致性,并实现可扩展的运维。
| 自动化工具 | 主要用途 | 方法 |
|---|---|---|
| Ansible | 配置管理 | 无代理,基于 YAML |
| Puppet | 配置管理 | 基于代理,DSL |
| Chef | 配置管理 | 基于代理,Ruby DSL |
| Terraform | 基础设施配置 | 声明式,支持多云 |
来源: README.md906-917
全面的测试策略可确保软件质量和在生产环境中的可靠性。
TDD 是一种开发方法,先编写测试,然后编写代码,指导实现过程。
TDD 流程如下
来源: README.md920-925
单元测试用于独立验证各个组件。
| 单元测试框架 | 语言 | 特性 |
|---|---|---|
| JUnit | Java | 注解、断言、参数化测试 |
| TestNG | Java | 比 JUnit 更灵活,更适合复杂场景 |
| Mockito | Java | 用于隔离依赖的 Mocking 框架 |
单元测试关键实践
来源: README.md926-932
性能测试评估系统在各种负载条件下的行为。
| 性能测试工具 | 类型 | 特性 |
|---|---|---|
| Apache JMeter | 通用 | GUI,可扩展,支持多种协议 |
| Apache Bench (ab) | HTTP 基准测试 | 命令行,简单的 HTTP 基准测试 |
| Gatling | 负载测试 | 基于 Scala 的 DSL,模拟真实场景 |
| nGrinder | 企业负载测试 | 基于代理,分布式测试 |
来源: README.md933-941
端到端测试从用户视角验证整个系统的功能。
在负载下测试整个系统,包括所有互联的服务和依赖项。
主要注意事项
来源: README.md942-947
来源: README.md948-956
虚拟化和容器技术实现了高效的资源利用和灵活的部署。
| 虚拟化技术 | 类型 | 特性 |
|---|---|---|
| KVM | Type 1 Hypervisor (一类虚拟机管理程序) | 基于内核,集成于 Linux |
| Xen | Type 1 Hypervisor (一类虚拟机管理程序) | 裸金属,隔离性好 |
| OpenVZ | 操作系统级虚拟化 | 轻量级,共享内核 |
来源: README.md957-970
容器提供轻量级、一致的运行时环境,支持跨不同平台。
Docker 已成为容器化的标准,提供
来源: README.md971-976
云平台提供托管的基础设施、平台和软件服务。
| 云模型 | 描述 | 示例 |
|---|---|---|
| IaaS | 基础设施即服务 | 虚拟机、存储、网络 |
| PaaS | 平台即服务 | 应用托管、数据库、中间件 |
| SaaS | 软件即服务 | 完整应用程序 |
| FaaS | 函数即服务 | 无服务器计算 |
OpenStack 是一个用于构建私有云和公有云的开源平台,提供
来源: README.md977-985
有效的文档对于维护和运营复杂系统至关重要。
流行的文档工具包括
文档最佳实践
来源: README.md986-991
基础设施和运营构成了可靠、可扩展的后端系统的基础。通过利用合适的技术和实践,团队可以构建支持业务需求同时保持运营效率的健壮平台。有关特定组件的更详细信息,请参阅本架构知识库中的相应子部分。