Skip to content

分布式系统与微服务技术全景

分布式系统是地基,微服务是建在地基上的建筑。二者共同构成了现代互联网的技术底座。


一、先厘清两个概念的关系

分布式系统微服务架构
定位理论+实践的工程学科一种软件架构风格
解决的问题多节点协作、可靠性、可扩展性业务解耦、独立部署、技术异构
关注焦点数据一致性、节点通信、容错服务拆分边界、独立生命周期
关系微服务是分布式系统的具体实践分布式系统是微服务的底层支撑

简单说:微服务是分布式系统在业务架构层面的应用;分布式系统的核心技术是微服务能正常工作的前提。


二、分布式系统核心技术

核心技术一:分布式一致性

这是分布式系统最核心、最难的问题——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/gRPCHTTP/2多路复用,gRPC基于protobuf,高性能同步调用,低延迟
Dubbo阿里开源,支持多协议,服务治理完善国内Java生态
ThriftFacebook开源,多语言支持跨语言服务调用

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:用数据告诉你系统正在经历什么
  • 配置中心:改配置不用重启,改完自动推送到所有服务

参考资料

Move fast and break things