分布式系统与微服务核心技术全景
分布式系统是地基,微服务是建在地基上的建筑。二者共同构成了现代互联网的技术底座。
一、先厘清两个概念的关系
| 分布式系统 | 微服务架构 | |
|---|---|---|
| 定位 | 理论+实践的工程学科 | 一种软件架构风格 |
| 解决的问题 | 多节点协作、可靠性、可扩展性 | 业务解耦、独立部署、技术异构 |
| 关注焦点 | 数据一致性、节点通信、容错 | 服务拆分边界、独立生命周期 |
| 关系 | 微服务是分布式系统的具体实践 | 分布式系统是微服务的底层支撑 |
简单说:微服务是分布式系统在业务架构层面的应用;分布式系统的核心技术是微服务能正常工作的前提。
二、分布式系统核心技术
核心技术一:分布式一致性
这是分布式系统最核心、最难的问题——CAP 定理。
在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance) 三者不可兼得,最多同时满足两个。
| 场景 | 选择 | 特点 | 代表 |
|---|---|---|---|
| CP系统 | 一致性 + 分区容错 | 放弃可用性,分区时可能不可用 | Zookeeper、HBase、Etcd |
| AP系统 | 可用性 + 分区容错 | 放弃强一致,分区后各节点继续服务 | Eureka、Cassandra、DynamoDB |
实用一致性模型(不追求强一致,但足够实用):
| 模型 | 说明 | 适用场景 |
|---|---|---|
| 最终一致性 | 分区恢复后最终达到一致 | 社交Feed、评论系统 |
| 因果一致性 | 有因果关系的操作顺序一致 | 协同文档 |
| 读己之所写 | 自己写的内容立即可见 | 用户个人信息 |
| 单调读 | 不会读到比之前更旧的数据 | 消息通知 |
核心技术二:共识算法
一致性靠什么保证?共识算法——让多个节点对某个值达成一致。
| 算法 | 类型 | 核心特点 | 代表 |
|---|---|---|---|
| Raft | 强一致 | 易于理解和实现,leader-follower模型 | Etcd、Kubernetes leader选举 |
| Paxos | 强一致 | 理论鼻祖,工程实现复杂 | Google Chubby |
| Gossip | 最终一致 | 无中心,像流行病传播,适合大规模节点 | Cassandra、Redis Cluster |
| PBFT | 拜占庭容错 | 能容忍最多1/3节点作恶 | Hyperledger Fabric |
Raft 的核心工作流程(最容易理解的共识算法):
leader选举 → 日志复制 → 状态同步
leader挂了 → follower超时 → 发起选举 → 多数票当选新leader核心技术三:分布式数据存储
3.1 分片(Sharding)——数据如何分
| 策略 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 哈希分片 | hash(key) % N | 数据分布均匀 | 扩缩容时数据迁移量大 |
| 范围分片 | 按key范围划分 | 适合范围查询 | 热点数据不均衡 |
| 一致性哈希 | 哈希环 + 虚拟节点 | 扩缩容迁移量小 | 实现复杂 |
3.2 副本(Replication)——数据如何备份
主从复制:
Master(写) → 同步 → Slave1、Slave2(读)
多主复制:
节点A ←→ 节点B ←→ 节点C(均可写)
无主复制:
写入任意3个节点,读取时从N个节点中取最新3.3 分布式事务——跨节点操作如何保证原子性
Seata 的 AT 模式(国内最流行):
1. TM(事务管理器)开启全局事务,发全局XID
2. 每个微服务(RM)执行本地SQL,自动生成undo_log
3. 如果全部成功 → 全局提交,删除undo_log
4. 如果任何一个失败 → 全局回滚,按undo_log逆向恢复Saga 模式(长事务,不锁资源):
编排型Saga:A服务 → B服务 → C服务
↘失败补偿:撤消C → 撤消B → 撤消A核心技术四:分布式通信
4.1 服务间通信协议
| 协议 | 特点 | 适用场景 |
|---|---|---|
| HTTP/gRPC | HTTP/2多路复用,gRPC基于protobuf,高性能 | 同步调用,低延迟 |
| Dubbo | 阿里开源,支持多协议,服务治理完善 | 国内Java生态 |
| Thrift | Facebook开源,多语言支持 | 跨语言服务调用 |
4.2 消息队列——异步解耦的枢纽
| 队列 | 特点 | 一句话定位 |
|---|---|---|
| Kafka | 高吞吐、日志型、持久化能力强 | 追求吞吐的日志流场景 |
| RabbitMQ | 灵活路由、插件丰富 | 复杂路由的企业集成场景 |
| RocketMQ | 阿里开源,金融级可靠性 | 电商交易链路 |
| Pulsar | 云原生架构,计算存储分离 | 需要极致弹性扩展 |
消息队列的核心作用:
同步调用(耦合)→ 异步消息(解耦)
订单服务 → 支付服务 → 库存服务 → 物流服务
同步等待 同步等待 同步等待 同步等待
↓ 改用消息队列 ↓
订单服务发布"订单创建"事件
→ 支付服务订阅(异步处理)
→ 库存服务订阅(异步扣减)
→ 物流服务订阅(异步通知)核心技术五:服务发现与负载均衡
5.1 服务发现
客户端发现:
客户端直接查询注册中心(如Eureka),自己选一个服务实例
优点:少一跳网络调用 缺点:客户端需要感知注册中心
服务端发现:
客户端请求LB(如Nginx、Envoy),LB查询注册中心并转发
优点:客户端轻量 缺点:多一跳
注册中心:Consul / Nacos / Eureka / Zookeeper
核心功能:服务注册、健康检查、服务注销5.2 负载均衡算法
| 算法 | 原理 | 特点 |
|---|---|---|
| 轮询 | 依次分配 | 简单,假设实例性能一致 |
| 加权轮询 | 按权重分配 | 解决性能不一致问题 |
| 最少连接 | 分配给连接数最少的 | 适合长连接场景 |
| IP哈希 | hash(IP) % N | 来自同一IP的请求打到同一实例 |
| 一致性哈希 | 哈希环分配 | 最小化迁移,适合缓存场景 |
三、微服务架构核心技术
技术一:服务治理(Service Governance)
这是微服务区别于分布式 monolith 的关键。
| 技术 | 作用 | 核心工具 |
|---|---|---|
| 流量管理 | 灰度发布、蓝绿部署、金丝雀发布、A/B测试 | Istio、Envoy、Spring Cloud Gateway |
| 熔断 | 防止故障在服务间级联传播 | Sentinel、Hystrix |
| 限流 | 保护系统不被瞬时流量冲垮 | Sentinel、Redis + Lua、API网关 |
| 降级 | 系统压力过大时主动关闭非核心功能 | Sentinel、Hystrix |
| 服务路由 | 按版本、标签、地域等条件路由流量 | Istio、Spring Cloud Zuul |
熔断器的工作原理:
正常状态 → 故障率超阈值 → 熔断打开(直接返回降级响应)
→ 半开状态(放一个请求试试)→ 恢复成功 → 关闭熔断器技术二:API 网关
所有外部请求的统一入口。
用户请求
↓
┌─────────────────────────────────────┐
│ API Gateway │
│ 路由转发 统一认证 限流熔断 │
│ 协议转换 日志监控 请求聚合 │
└─────────────────────────────────────┘
↓
各微服务(用户中心、订单、支付……)主流实现:Kong / APISIX(Nginx + Lua)、Spring Cloud Gateway、Envoy、Traefik
技术三:容器化与编排
3.1 Docker——容器化标准
传统部署:应用 + 依赖库 + 配置文件 → 手动安装 → "在我机器上能跑"
Docker部署:Dockerfile → Image → Container(容器)
优势:Build Once, Run Anywhere(一次构建,到处运行)
启动速度秒级 vs 虚拟机分钟级3.2 Kubernetes——容器编排之王
Kubernetes(K8s)的核心能力:
| 能力 | 说明 | 解决的问题 |
|---|---|---|
| 自愈 | 节点挂了自动重启容器,不可用时自动驱逐 | 机器故障不用人管 |
| 弹性伸缩 | HPA根据CPU/内存自动扩缩 | 流量突增时自动扛住 |
| 滚动更新 | 蓝绿部署/灰度发布,不影响可用性 | 发布零停机 |
| 服务发现 | Service + DNS,无需手动配置IP | 服务间自动寻址 |
| 存储编排 | PVC挂载持久存储,数据不丢 | 有状态服务的存储问题 |
技术四:配置中心
所有微服务的配置集中管理,运行时动态更新。
没有配置中心:每个服务一套配置,改一个配置要改10个地方、发布10次
有配置中心(Nacos / Apollo):
配置中心 → 每个服务拉取自己的配置
修改配置 → 推送到所有相关服务 → 无需重启Apollo(阿波罗)核心功能:
- 配置的版本管理(改错了可以一键回滚)
- 配置的灰度发布(先让1%实例生效,验证后全量)
- 权限管理(谁可以改什么配置)
技术五:链路追踪
在微服务架构中,一个请求可能经过十几个服务,如何定位哪一步慢了?
用户请求 → 网关 → 认证服务 → 订单服务 → 库存服务 → 支付服务 → 物流服务
│
└──── Trace ID(全局唯一)────┘
每一步记录耗时核心工具:Jaeger / Zipkin / SkyWalking(国内最流行)
技术六:可观测性三剑客
| 技术 | 回答的问题 | 核心工具 |
|---|---|---|
| Metrics(指标) | "系统现在怎么样?" | Prometheus + Grafana |
| Logging(日志) | "哪里出了问题?" | ELK(Elasticsearch+Logstash+Kibana) |
| Tracing(链路追踪) | "哪个环节慢了?" | Jaeger / SkyWalking |
| 告警 | "出了问题怎么通知?" | Alertmanager / 飞书/钉钉机器人 |
Prometheus 的工作方式:
Prometheus Server → 定期拉取各服务暴露的 /metrics 接口
→ 存储时序数据 → Grafana 绑定Prometheus查询 → 展示Dashboard
→ 指标超阈值 → Alertmanager → 触发告警四、技术全景图
用户请求
│
┌──────┴──────┐
│ API Gateway │
│ (Kong/Envoy) │
└──────┬──────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│用户服务│ │订单服务│ │商品服务│
└────┬───┘ └────┬───┘ └────┬───┘
│ │ │
┌────┴─────────────┴─────────────┴────┐
│ 服务网格 (Istio) │
│ 限流 / 熔断 / 链路追踪 / 鉴权 │
└────┬─────────────┬─────────────┬────┘
│ │ │
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ MySQL │ │ Kafka │ │ Redis │
│ (分片) │ │ 消息队列 │ │ 缓存 │
└────────┘ └────────┘ └────────┘
│ │ │
└─────────────┼─────────────┘
▼
┌─────────────────────────┐
│ 可观测性层 │
│ Metrics / Logs / Trace │
│ Prometheus+ELK+Jaeger │
└─────────────────────────┘五、核心技术速查对照
| 层级 | 问题 | 解决方案 | 核心工具 |
|---|---|---|---|
| 通信层 | 服务间怎么通信 | RPC/HTTP + 序列化 | gRPC、Dubbo、HTTP |
| 发现层 | 怎么找到其他服务 | 服务注册与发现 | Nacos、Eureka、Consul |
| 网关层 | 外部怎么统一接入 | API网关 | Kong、Spring Cloud Gateway |
| 治理层 | 流量怎么控制 | 熔断/限流/降级 | Sentinel、Hystrix |
| 数据层 | 数据怎么存储和一致 | 分片+副本+分布式事务 | ShardingSphere、Seata |
| 消息层 | 异步怎么解耦 | 消息队列 | Kafka、RocketMQ |
| 容器层 | 怎么部署和运行 | 容器+编排 | Docker、Kubernetes |
| 配置层 | 配置怎么统一管理 | 配置中心 | Nacos、Apollo |
| 追踪层 | 请求慢怎么定位 | 链路追踪 | SkyWalking、Jaeger |
| 观测层 | 系统怎么监控告警 | 可观测性 | Prometheus + Grafana + ELK |
| 安全层 | 服务怎么安全通信 | mTLS / 鉴权 | Istio(服务网格) |
六、一句话总结每项技术的核心价值
- CAP 定理:分布式系统没有完美的方案,只有适合场景的选择
- Raft 共识:让一群机器对谁来当"老大"这件事达成一致
- 分片 + 副本:数据太大分开放、放多份不怕丢
- 消息队列:把同步调用变成异步事件,让服务不再互相阻塞
- 熔断器:当某个服务彻底崩溃时,不让它把整个系统拖垮
- Kubernetes:自动管理容器的生死,让运维工程师睡个好觉
- 链路追踪:在几十个服务中找到"是哪一步慢"
- Prometheus:用数据告诉你系统正在经历什么
- 配置中心:改配置不用重启,改完自动推送到所有服务
参考资料
- Eric Brewer, CAP Theorem (原始论述): https://en.wikipedia.org/wiki/CAP_theorem
- Diego Ongaro, In Search of an Understandable Consensus Algorithm (Raft 论文): https://raft.github.io/raft.pdf
- Leslie Lamport, The Part-Time Parliament (Paxos, 1998)
- Kubernetes 官方文档: https://kubernetes.io/docs/home/
- Apache Kafka 文档: https://kafka.apache.org/documentation/
- Seata 分布式事务: https://seata.apache.org/
- Sentinel 流量治理: https://sentinelguard.io/
- Prometheus 文档: https://prometheus.io/docs/
- Martin Fowler, Microservices: https://martinfowler.com/articles/microservices.html
- Sam Newman, Building Microservices (O'Reilly)
- Nacos 文档: https://nacos.io/
- Istio 服务网格: https://istio.io/