文章目录
-
- 什么是后端中的分布式系统
- 为什么需要分布式系统?
- 核心技术、知识
-
- [1. 服务发现与注册](#1. 服务发现与注册)
- [2. API 网关](#2. API 网关)
- [3. 配置中心](#3. 配置中心)
- [4. 分布式缓存](#4. 分布式缓存)
- [5. 消息队列](#5. 消息队列)
- [6. 分布式数据存储](#6. 分布式数据存储)
- 深入与拓展
什么是后端中的分布式系统
分布式系统 是一组位于网络上的计算机,为了共同完成一个任务而协同工作的系统。对于用户来说,它就像一个单一、连贯的系统。
在后端开发中,分布式系统意味着将原本运行在一台强大服务器(单体架构)上的应用程序,拆分成多个服务,这些服务可以部署在不同的服务器(节点)上,通过网络进行通信和协作。
核心目标:通过协作获得更高的性能(吞吐量)、可扩展性(水平扩展)、可用性(容错)和可维护性。
为什么需要分布式系统?
1、突破单机性能瓶颈 :单台服务器的计算能力、内存、磁盘I/O和网络带宽总是有限的。分布式系统可以通过增加普通机器来提升整体能力。
2、高可用性与容错 :单台服务器故障会导致整个服务不可用。分布式系统中,部分节点宕机,其他节点可以接管工作,保证服务不中断。
3、可扩展性 :当用户量和数据增长时,可以通过简单地增加机器(水平扩展)来应对,而不是不断升级单台服务器的硬件(垂直扩展,成本高且有限)。
4、低延迟:可以将服务部署在全球各地的数据中心,让用户就近访问,减少网络延迟。
核心技术、知识
通过一些核心概念和图表来深入理解。
1. 服务发现与注册
在动态的分布式环境中,服务的实例可能会因为扩容、故障或更新而频繁地改变IP地址和端口。服务发现机制允许服务自动找到并与其他服务通信。
工作流程:
Service A (实例) 服务注册中心 (e.g., Nacos, Consul, Eureka) Service B (消费者) 1. 注册 / 心跳 注册元数据:服务名、IP、端口等 2. 查询:Service A的地址列表 3. 返回可用实例列表 4. 直接向选择的实例发起请求 Service A (实例) 服务注册中心 (e.g., Nacos, Consul, Eureka) Service B (消费者)
涉及技术:Nacos
, Consul
, ZooKeeper
, Eureka
2. API 网关
它是系统的唯一入口,所有外部请求首先经过网关。它负责路由、认证、限流、监控等跨切面关注点。
架构图:
分布式系统集群 注册 注册 注册 API Gateway Service 1 Service 2 Service 3 服务注册中心 客户端请求
涉及技术:Spring Cloud Gateway
, Kong
, Zuul
, Nginx
3. 配置中心
将应用程序的配置(如数据库连接、第三方API密钥、功能开关)从代码中分离出来,集中管理。动态修改配置后,所有服务实例可以自动获取最新配置,无需重启。
工作流程:
多个服务实例 配置中心 (e.g., Nacos, Apollo) 管理员 1. 在界面上修改配置并发布 2. 推送更新通知 (Push) 或由服务拉取 (Pull) 3. 获取最新配置 服务应用新配置 多个服务实例 配置中心 (e.g., Nacos, Apollo) 管理员
涉及技术:Nacos
, Apollo
, Spring Cloud Config
4. 分布式缓存
将高频访问的数据存储在内存中,减少对后端数据库的访问,极大提升读取性能和降低数据库负载。通常是分布式的键值存储。
架构图:
分布式缓存集群 e.g., Redis Cluster 节点 1 节点 2 节点 3 应用程序集群 后端数据库
涉及技术:Redis
(Cluster/Sentinel模式), Memcached
5. 消息队列
用于实现服务之间的异步通信和解耦。生产者将消息发送到队列,消费者从队列中取出消息进行处理。它还提供了流量削峰和保证最终一致性的能力。
工作流程:
生产者服务 消息队列 (e.g., Kafka, RabbitMQ) 消费者服务 1. 发送消息 发送后即刻返回,无需等待处理 2. 推送消息 (或C主动拉取) 3. 处理成功,发送确认ACK 4. 消息处理完毕,从队列移除 生产者服务 消息队列 (e.g., Kafka, RabbitMQ) 消费者服务
涉及技术:Kafka
(高吞吐), RabbitMQ
(功能丰富), RocketMQ
6. 分布式数据存储
数据量巨大,单机数据库无法存储和处理。需要将数据分片存储到多台机器上。
- CAP定理:一个分布式系统不可能同时满足一致性(C)、可用性(A)和分区容错性(P),只能三者取其二。
- 数据库分片:将一张大表的数据按某种规则(如用户ID哈希)拆分到不同的数据库节点中。
- 复制:为主数据库创建多个从库副本,用于读写分离和故障转移。
分片与复制示意图:
分片 3 分片 2 分片 1 主库 Master 从库 Slave 主库 Master 从库 Slave 主库 Master 从库 Slave 应用程序
涉及技术:
- NoSQL :
MongoDB
(文档),Cassandra
(宽列) - NewSQL :
TiDB
,CockroachDB
- 中间件 :
MyCat
,ShardingSphere
深入与拓展
第一阶段:基础
1、语言与网络:熟练掌握一门后端语言(如 Java/Go)。深刻理解 HTTP/1.1/2/3、TCP/IP 协议。
2、数据库与缓存 :精通一种关系型数据库(如 MySQL )和一种 NoSQL 数据库(如 Redis)。理解事务、索引、锁、主从复制等概念。
第二阶段:理论学习
1、阅读经典:精读《数据密集型应用系统设计》,这是分布式领域的圣经。
2、理解核心理论:弄懂 CAP 、BASE、一致性协议(如 Raft/Paxos)。不必深究数学证明,但要理解其思想和工作流程。
第三阶段:实践
1、选择一个生态:建议从 Spring Cloud Alibaba 开始,因为它集成了很多优秀组件,文档丰富,社区活跃。
2、动手搭建:
- 用 Nacos 搭建一个服务注册和配置中心。
- 用 Spring Cloud Gateway 搭建一个 API 网关。
- 搭建一个 Redis 哨兵或集群,并在代码中集成它。
- 搭建 Kafka 或 RabbitMQ,写一个生产者和消费者的 Demo。
3、做一个综合项目:设计一个简单的电商系统,包含用户、商品、订单、支付等服务。将上述所有技术都用上去:
- 服务注册到 Nacos。
- 通过网关暴露 API。
- 用 Redis 缓存商品信息。
- 下单后,通过 MQ 通知库存服务和积分服务。
第四阶段:深入与拓展
1、容器化与编排 :学习 Docker 和 Kubernetes 。K8s 本身就是一个极其复杂的分布式系统,它提供了服务发现、负载均衡、自愈等能力,是现代分布式应用的基石。
2、观察与监控 :学习使用 Prometheus (收集指标)、Grafana (展示仪表盘)、ELK (日志收集分析)来监控你的分布式系统。
3、读源码:选择一两个你常用的组件(如 Redis、Nacos),开始尝试阅读其源码,理解其核心实现。