跳转到正文
zeno's blog
返回

微服务(二):完整微服务集群的分层系统

专题: 微服务

Table of contents

Open Table of contents

TL;DR

一个完整的微服务集群,从来不只是“一堆 RPC 服务实例”。至少要同时看见四层:平台层负责调度和运行,流量层负责入口和东西向治理,业务层承载真正的领域逻辑,状态层保存持久数据与异步事件;可观测性、配置、密钥、发布流水线则是横切支撑层。少看任何一层,架构判断都会失真。


先给结论:完整集群到底包含什么

如果你问“一个完整的微服务集群包含什么”,最实用的答案不是背产品名,而是先分层。

层次核心职责典型组件
平台层调度、运行、收敛工作负载Kubernetes control plane、worker nodes、kubelet、container runtime、CNI/CSI
流量层处理入口流量和服务间流量治理Load Balancer、Ingress / API Gateway、Service Mesh data plane、Service discovery
业务层执行真正的业务语义user-serviceorder-servicepayment-service、消费者、定时任务
状态层保存状态、缓存、消息、文件PostgreSQL、Redis、Kafka、对象存储、搜索引擎
横切支撑层观测、配置、发布、安全Metrics/Logs/Traces、Secret、Config、CI/CD、备份恢复、证书

最关键的结论:

为什么不能把“微服务集群”理解成“一堆服务”

因为服务实例只是业务逻辑的执行载体,不是整个系统。

只看服务实例,会漏掉四类决定生死的问题:

漏掉的层你会误判什么
平台层以为“服务挂了就重启进程”足够,忽略调度、节点故障、期望状态收敛
流量层以为服务只要监听端口就能通信,忽略入口、服务发现、超时重试、mTLS、灰度
状态层以为服务无状态就等于系统无状态,忽略数据库、缓存、消息队列才是真正的数据重心
横切支撑层以为日志和监控是锦上添花,忽略它们决定了系统是否可运维

这也是为什么“我已经有 20 个微服务了”不等于“我有一个完整可运维的微服务平台”。

第一层:平台层负责“让工作负载在集群里持续活着”

如果你用 Kubernetes,那么平台层的核心是:

Kubernetes 官方文档明确把 cluster 拆成 control plane 和 nodes;controllers 持续把 current state 拉向 desired state(确定,见 Cluster Architecture / Controllers)。

平台层解决的是:

一句话: 平台层不关心“订单怎么下”,它只关心“承载订单服务的工作负载能不能持续存在”。

第二层:流量层负责“让请求进得来、到得对、控得住”

流量层通常再分成两个方向:

方向处理什么流量典型组件
North-South外部用户到集群Load Balancer、Ingress、API Gateway、边缘 Envoy/Nginx
East-West服务到服务Service、Mesh sidecar / waypoint、L4/L7 LB、mTLS、重试熔断

这层解决的是:

容易犯的错: 把流量层和业务层混在一起,把网关写成“超级业务服务”,或者把业务服务误叫 data plane。

第三层:业务层才是“你真正写的微服务”

业务层就是你平时说的那些服务实例:

这些东西的共同点不是“都用 RPC”,而是:

这层回答的是:

而不是:

第四层:状态层才是大多数业务系统真正的“重心”

很多人学微服务只盯服务,不盯状态,这是幼稚病。

一个完整系统里,状态层通常包括:

类型典型系统作用
关系数据库PostgreSQL / MySQL持久业务数据、事务边界
缓存Redis降低读延迟、做热点缓存、短期状态
消息队列 / 事件流Kafka / RabbitMQ / NATS异步解耦、削峰、事件传播
对象存储S3 / OSS / MinIO文件、图片、归档数据
搜索引擎Elasticsearch / OpenSearch搜索和分析

一句话:
业务层负责“算”,状态层负责“记”。
一个没有数据库、缓存、消息系统的“微服务集群”,通常只是 demo,不是生产系统。

横切支撑层不是第五等公民,而是运维生死线

严格说它不是单独业务层,而是横跨全系统:

为什么把它单独点出来?因为很多团队默认“先把服务写完,监控以后再说”,最后得到的是能跑但不可运维的系统。

如果没有这些东西:

一个典型微服务集群的全景图

               外部用户 / App / Browser
                        |
                 Load Balancer / DNS
                        |
                Ingress / API Gateway
                        |
        +---------------+----------------+
        |                                |
   user-service                      order-service
        |                                |
        +-------------+------------------+
                      |
               service-to-service RPC
             (direct or via service mesh)
                      |
          +-----------+-----------+
          |                       |
       PostgreSQL              Redis
          |
        Kafka / Object Storage / Search

旁边一直存在但不在业务热路径里:
  - Kubernetes control plane
  - 调度器 / 控制器 / kubelet / runtime
  - 可观测性、配置、密钥、CI/CD、备份恢复

这张图真正想表达什么

Kubernetes、Service Mesh、RPC 服务实例分别落在哪层

对象它属于哪层为什么
Kubernetes control plane平台层负责调度、对象存储、控制循环
Worker nodes / kubelet / runtime平台层执行容器与节点级生命周期
API Gateway / Ingress / Envoy edge流量层处理入口流量和路由治理
Mesh sidecar / waypoint / kube-proxy流量层处理服务间通信与服务访问语义
user-service / order-service业务层执行业务逻辑
PostgreSQL / Redis / Kafka状态层承载数据、缓存、事件
Prometheus / Loki / Tempo / OTel Collector横切支撑层负责观测与排障

所以你之前那个问题“完整集群是不是包含 data plane、control plane、各种 RPC 服务实例”,更准确的回答是:

是,但那只是其中一部分。
完整集群至少还包含平台执行层、状态层,以及一整套横切支撑设施。

与常见错误理解的对比

错误理解为什么错正确说法
微服务集群 = 一堆服务实例漏掉平台、流量、状态、支撑设施服务实例只是业务层
有 Kubernetes 就等于平台齐了K8s 只覆盖平台层核心,不自动替你解决流量治理、数据和运维体系还需要网关、状态系统、观测等
有 API Gateway 就是完整架构Gateway 只解决一部分 north-south 流量问题不能替代平台层和状态层
无状态服务多就代表系统简单数据最终都沉到状态层真复杂度往往在数据库、缓存、消息链路
监控以后再补生产系统没有观测就等于盲飞支撑层是基础设施,不是装饰

Pitfalls

1. 只画服务框,不画状态系统

架构图只写 user-service -> order-service -> payment-service,数据库和队列一句带过。这种图对真实复杂度几乎没有解释力。

避免方式: 任何微服务架构图都把数据库、缓存、消息队列单独画出来。

2. 把 Kubernetes 当“完整微服务平台”

Kubernetes 很重要,但它主要解决平台层问题。它不会自动替你解决 API 设计、服务边界、灰度策略、数据一致性和业务可观测性。

避免方式: 把 K8s 看成底座,不要把底座当整栋楼。

3. 把流量治理层和业务层写在一个进程里

网关里塞鉴权、聚合、转码、灰度、限流、业务编排,最后变成“超级边车”或“超级网关”,复杂度反而比服务内部更高。

避免方式: 流量层只承载横切流量能力;业务语义继续留在业务层。

4. 忽略横切支撑层

日志、指标、trace、配置、密钥、CI/CD 都不在核心请求路径上,但它们决定了系统是否可运维。

避免方式: 把它们当系统组成部分,而不是“上线后再说”的附属工程。

5. 把“外部托管数据库”当成“不属于系统”

即使 PostgreSQL 是云厂商托管的,它依然是你系统的状态层核心组成。托管不等于不重要。

避免方式: 组件是否自建和组件是否属于系统,是两回事。

6. 误以为“服务多”就等于“微服务成熟”

20 个服务但没有稳定入口、没有统一观测、没有发布规范、没有状态治理,只是 20 个孤岛进程,不是成熟的微服务平台。

避免方式: 先看层次是否完整,再看服务数量。

Checklist

信息来源


分享这篇文章:

上一篇
Tokio:定时器、时间轮与精度
下一篇
tokio(四):陷阱与生产最佳实践