架构之服务化:把业务能力切成能独立演进的服务
很多团队把服务化直接理解成“上微服务”。于是拆控制器、拆数据库表、拆代码目录,最后服务数量上去了,系统却从一个单体变成了一个更难排查的分布式单体。
服务化不是把代码切碎,也不是把服务数量当成绩效。它的本质是把原来进程内的业务能力边界,升级为网络上可独立部署、独立演进的服务边界。
真正要回答的问题不是“要不要微服务”,而是“当前哪些业务能力已经具备独立演进的条件,并且拆分后团队能够独立交付”。
一、服务化到底解决什么问题
单体架构的优点是简单:本地调用、本地事务、单次发布、单套日志。但它会在一些信号出现后变得难以继续:
- 多个团队频繁修改同一个应用,发布互相阻塞;
- 局部小改动必须发布整个系统;
- 一个非核心模块故障会拖垮整个进程;
- 不同模块的流量、资源需求和变化速度差异很大;
- 业务边界已经清晰,团队能够认领某个完整能力。
服务化要解决的核心问题不是“单体不好”,而是“业务能力无法独立演进”。它的收益集中在四个方面:
| 独立交付 | 所有团队共用一个发布节奏 | 服务可独立开发、测试、发布 |
| 独立扩缩容 | 整体扩容,资源利用率低 | 按服务流量和资源特征伸缩 |
| 故障隔离 | 单点异常可能拖垮全进程 | 故障范围被限制在服务边界内 |
| 团队自治 | 跨团队协调成本高 | 团队对所属服务负责 |
如果这些收益在当前阶段并不成立,就不应该为了“先进”而服务化。服务化是用分布式复杂度,换取业务能力的独立演进能力。它只有在业务和组织真正需要独立演进时,才是划算的。
二、拆分对象不是代码,而是业务能力
服务化最常见的错误,是按技术层或数据库表拆:
错误拆分方式:
UserController 拆成一个服务
OrderController 拆成一个服务
UserService 拆成一个服务
OrderService 拆成一个服务
User 表拆成一个服务
Order 表拆成一个服务
这种拆法得到的不是微服务,而是分布在网络上的“数据访问服务”。服务之间的调用链会非常长,任何业务动作都要跨越多个网络边界。
正确做法是按业务能力拆。DDD 在这里的价值尤其明显:限界上下文是逻辑边界,服务是物理边界。
正确拆分方式:
用户中心:账户、实名、会员等级、登录态
订单中心:下单、状态流转、履约、售后
支付中心:支付、退款、对账、风控接入
库存中心:库存、预留、扣减、释放
一个服务最好对应一个清晰、内聚、可独立演进的业务能力。它内部可以有多个聚合、多个实体和多条状态机,但对外应该只暴露稳定的业务契约。
#mermaid-svg-W2ss9hBKk89DANrz{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-W2ss9hBKk89DANrz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-W2ss9hBKk89DANrz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-W2ss9hBKk89DANrz .error-icon{fill:#552222;}#mermaid-svg-W2ss9hBKk89DANrz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W2ss9hBKk89DANrz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-W2ss9hBKk89DANrz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W2ss9hBKk89DANrz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W2ss9hBKk89DANrz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-W2ss9hBKk89DANrz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W2ss9hBKk89DANrz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W2ss9hBKk89DANrz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W2ss9hBKk89DANrz .marker.cross{stroke:#333333;}#mermaid-svg-W2ss9hBKk89DANrz svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W2ss9hBKk89DANrz p{margin:0;}#mermaid-svg-W2ss9hBKk89DANrz .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-W2ss9hBKk89DANrz .cluster-label text{fill:#333;}#mermaid-svg-W2ss9hBKk89DANrz .cluster-label span{color:#333;}#mermaid-svg-W2ss9hBKk89DANrz .cluster-label span p{background-color:transparent;}#mermaid-svg-W2ss9hBKk89DANrz .label text,#mermaid-svg-W2ss9hBKk89DANrz span{fill:#333;color:#333;}#mermaid-svg-W2ss9hBKk89DANrz .node rect,#mermaid-svg-W2ss9hBKk89DANrz .node circle,#mermaid-svg-W2ss9hBKk89DANrz .node ellipse,#mermaid-svg-W2ss9hBKk89DANrz .node polygon,#mermaid-svg-W2ss9hBKk89DANrz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W2ss9hBKk89DANrz .rough-node .label text,#mermaid-svg-W2ss9hBKk89DANrz .node .label text,#mermaid-svg-W2ss9hBKk89DANrz .image-shape .label,#mermaid-svg-W2ss9hBKk89DANrz .icon-shape .label{text-anchor:middle;}#mermaid-svg-W2ss9hBKk89DANrz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-W2ss9hBKk89DANrz .rough-node .label,#mermaid-svg-W2ss9hBKk89DANrz .node .label,#mermaid-svg-W2ss9hBKk89DANrz .image-shape .label,#mermaid-svg-W2ss9hBKk89DANrz .icon-shape .label{text-align:center;}#mermaid-svg-W2ss9hBKk89DANrz .node.clickable{cursor:pointer;}#mermaid-svg-W2ss9hBKk89DANrz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-W2ss9hBKk89DANrz .arrowheadPath{fill:#333333;}#mermaid-svg-W2ss9hBKk89DANrz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-W2ss9hBKk89DANrz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-W2ss9hBKk89DANrz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W2ss9hBKk89DANrz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-W2ss9hBKk89DANrz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W2ss9hBKk89DANrz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-W2ss9hBKk89DANrz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-W2ss9hBKk89DANrz .cluster text{fill:#333;}#mermaid-svg-W2ss9hBKk89DANrz .cluster span{color:#333;}#mermaid-svg-W2ss9hBKk89DANrz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-W2ss9hBKk89DANrz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-W2ss9hBKk89DANrz rect.text{fill:none;stroke-width:0;}#mermaid-svg-W2ss9hBKk89DANrz .icon-shape,#mermaid-svg-W2ss9hBKk89DANrz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W2ss9hBKk89DANrz .icon-shape p,#mermaid-svg-W2ss9hBKk89DANrz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-W2ss9hBKk89DANrz .icon-shape .label rect,#mermaid-svg-W2ss9hBKk89DANrz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W2ss9hBKk89DANrz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-W2ss9hBKk89DANrz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-W2ss9hBKk89DANrz :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
业务能力识别
限界上下文
服务边界
独立开发与部署
用户
用户中心
订单
订单中心
支付
支付中心
库存
库存中心
三、服务化后的技术能力清单
服务化以后,原来的本地调用变成网络调用,原来的本地事务变成分布式协作。团队必须补上一整套治理能力,否则系统会失控。
服务注册与发现
API 网关
配置中心
分布式链路追踪
统一日志与监控
限流、熔断、重试、降级
消息队列与最终一致性
分布式事务方案
统一错误码与契约治理
这些能力可以分为三类:
| 通信与发现 | 网关、注册中心、配置中心 | 服务怎么被找到、怎么被调用 |
| 可靠性与韧性 | 限流、熔断、重试、降级 | 服务故障如何被隔离和恢复 |
| 可观测与一致 | 日志、指标、链路、消息、事务 | 请求怎么被跟踪、数据怎么保持一致 |
其中最容易低估的是可观测性和最终一致性。服务拆开以后,一次用户请求可能经过十几个服务,没有统一链路追踪,排障会变成“从一个服务跳到另一个服务”。
四、服务化架构的基本形态
服务化后的典型结构,是前端流量先进入统一网关,再由网关路由到不同业务服务。每个服务拥有自己的数据边界,并通过标准契约对外提供能力。
#mermaid-svg-YXUZ0EA9hBMPjZTM{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YXUZ0EA9hBMPjZTM .error-icon{fill:#552222;}#mermaid-svg-YXUZ0EA9hBMPjZTM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YXUZ0EA9hBMPjZTM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .marker.cross{stroke:#333333;}#mermaid-svg-YXUZ0EA9hBMPjZTM svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YXUZ0EA9hBMPjZTM p{margin:0;}#mermaid-svg-YXUZ0EA9hBMPjZTM .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster-label text{fill:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster-label span{color:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster-label span p{background-color:transparent;}#mermaid-svg-YXUZ0EA9hBMPjZTM .label text,#mermaid-svg-YXUZ0EA9hBMPjZTM span{fill:#333;color:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .node rect,#mermaid-svg-YXUZ0EA9hBMPjZTM .node circle,#mermaid-svg-YXUZ0EA9hBMPjZTM .node ellipse,#mermaid-svg-YXUZ0EA9hBMPjZTM .node polygon,#mermaid-svg-YXUZ0EA9hBMPjZTM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .rough-node .label text,#mermaid-svg-YXUZ0EA9hBMPjZTM .node .label text,#mermaid-svg-YXUZ0EA9hBMPjZTM .image-shape .label,#mermaid-svg-YXUZ0EA9hBMPjZTM .icon-shape .label{text-anchor:middle;}#mermaid-svg-YXUZ0EA9hBMPjZTM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .rough-node .label,#mermaid-svg-YXUZ0EA9hBMPjZTM .node .label,#mermaid-svg-YXUZ0EA9hBMPjZTM .image-shape .label,#mermaid-svg-YXUZ0EA9hBMPjZTM .icon-shape .label{text-align:center;}#mermaid-svg-YXUZ0EA9hBMPjZTM .node.clickable{cursor:pointer;}#mermaid-svg-YXUZ0EA9hBMPjZTM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .arrowheadPath{fill:#333333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YXUZ0EA9hBMPjZTM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YXUZ0EA9hBMPjZTM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YXUZ0EA9hBMPjZTM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster text{fill:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM .cluster span{color:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YXUZ0EA9hBMPjZTM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YXUZ0EA9hBMPjZTM rect.text{fill:none;stroke-width:0;}#mermaid-svg-YXUZ0EA9hBMPjZTM .icon-shape,#mermaid-svg-YXUZ0EA9hBMPjZTM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YXUZ0EA9hBMPjZTM .icon-shape p,#mermaid-svg-YXUZ0EA9hBMPjZTM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YXUZ0EA9hBMPjZTM .icon-shape .label rect,#mermaid-svg-YXUZ0EA9hBMPjZTM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YXUZ0EA9hBMPjZTM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YXUZ0EA9hBMPjZTM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YXUZ0EA9hBMPjZTM :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
统一技术底座
浏览器 / App
API 网关
订单服务
支付服务
库存服务
用户服务
注册中心
配置中心
链路追踪
日志与监控
消息平台
这张图里,业务服务仍然保持独立,但公共技术能力由统一底座提供。这为后续平台化留出了清晰边界:平台负责技术能力,服务负责业务能力。
五、服务边界应该怎么判断
服务边界判断不是画多少个框,而是判断哪些业务能力应该放到同一个可独立交付的单元里。可以参考下面几个标准:
其中“数据独立”最容易被忽略。很多服务化失败,不是因为接口没拆开,而是因为多个服务仍然共享同一套数据库。表面上是微服务,实际上任何服务都能绕过契约改其他服务的数据。
#mermaid-svg-AcsRr2sYOR5R8ic7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AcsRr2sYOR5R8ic7 .error-icon{fill:#552222;}#mermaid-svg-AcsRr2sYOR5R8ic7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AcsRr2sYOR5R8ic7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .marker.cross{stroke:#333333;}#mermaid-svg-AcsRr2sYOR5R8ic7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AcsRr2sYOR5R8ic7 p{margin:0;}#mermaid-svg-AcsRr2sYOR5R8ic7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster-label text{fill:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster-label span{color:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster-label span p{background-color:transparent;}#mermaid-svg-AcsRr2sYOR5R8ic7 .label text,#mermaid-svg-AcsRr2sYOR5R8ic7 span{fill:#333;color:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .node rect,#mermaid-svg-AcsRr2sYOR5R8ic7 .node circle,#mermaid-svg-AcsRr2sYOR5R8ic7 .node ellipse,#mermaid-svg-AcsRr2sYOR5R8ic7 .node polygon,#mermaid-svg-AcsRr2sYOR5R8ic7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .rough-node .label text,#mermaid-svg-AcsRr2sYOR5R8ic7 .node .label text,#mermaid-svg-AcsRr2sYOR5R8ic7 .image-shape .label,#mermaid-svg-AcsRr2sYOR5R8ic7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-AcsRr2sYOR5R8ic7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .rough-node .label,#mermaid-svg-AcsRr2sYOR5R8ic7 .node .label,#mermaid-svg-AcsRr2sYOR5R8ic7 .image-shape .label,#mermaid-svg-AcsRr2sYOR5R8ic7 .icon-shape .label{text-align:center;}#mermaid-svg-AcsRr2sYOR5R8ic7 .node.clickable{cursor:pointer;}#mermaid-svg-AcsRr2sYOR5R8ic7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .arrowheadPath{fill:#333333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AcsRr2sYOR5R8ic7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AcsRr2sYOR5R8ic7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AcsRr2sYOR5R8ic7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster text{fill:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 .cluster span{color:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AcsRr2sYOR5R8ic7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AcsRr2sYOR5R8ic7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-AcsRr2sYOR5R8ic7 .icon-shape,#mermaid-svg-AcsRr2sYOR5R8ic7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AcsRr2sYOR5R8ic7 .icon-shape p,#mermaid-svg-AcsRr2sYOR5R8ic7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AcsRr2sYOR5R8ic7 .icon-shape .label rect,#mermaid-svg-AcsRr2sYOR5R8ic7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AcsRr2sYOR5R8ic7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AcsRr2sYOR5R8ic7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AcsRr2sYOR5R8ic7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
否
是
否
是
否
是
否
是
是否需要服务化
业务边界是否稳定
先保持模块化单体
能否独立部署和交付
先补团队与发布能力
数据边界能否独立
先梳理数据所有权
是否真正需要独立伸缩或隔离
保持共享模块或领域服务
拆分为业务服务
这个判断顺序的意义在于:服务化不应该由技术热情驱动,而应该由业务边界、交付能力、数据所有权和真实运维需求共同决定。
六、服务化带来的分布式复杂度
服务化不是免费的。业务拆开以后,团队要处理的问题会成倍增加。
| 本地方法调用 | 网络调用、序列化、超时、重试 |
| 本地事务 | 分布式事务、最终一致性、补偿 |
| 单次发布 | 多服务发布、版本兼容、契约治理 |
| 单套日志 | 跨服务日志、链路追踪、根因定位 |
| 进程内依赖 | 服务发现、熔断、降级、故障隔离 |
有两个问题必须重点处理:
1. 幂等与重试
网络调用可能超时,但服务端可能已经执行成功。所有可重试的写操作都应该支持幂等,否则重试会造成重复下单、重复扣款或重复发货。
2. 最终一致性
强一致在跨服务场景下成本很高。很多业务可以采用最终一致性:订单服务发布事件,库存服务消费事件并预留库存,支付服务在支付成功后回写状态。事件驱动和补偿流程会成为服务化后的主要协作方式。
七、服务化常见的六个反模式
| 分布式单体 | 服务很多,但共享数据库、互相直接调用 | 没有独立交付,复杂度却翻倍 |
| 按表拆分 | 每个数据表变成一个服务 | 调用链过长,服务没有业务语义 |
| 过早微服务化 | 业务未验证就拆成几十个服务 | 为不存在的规模化付出成本 |
| 只拆不治理 | 服务各自定义鉴权、日志、返回格式 | 标准不统一,难以协作 |
| 同步调用链过深 | 一次请求穿透十几层服务 | 延迟高、故障范围扩大 |
| 没有契约版本 | 接口随意变更,靠发布顺序碰运气 | 服务升级互相破坏 |
这些反模式的共同点,是只做了“分”,没有做“治”。服务化不是把系统拆开就结束,而是拆开后还要用统一契约、统一治理和统一可观测性重新组织起来。
八、服务化的演进路径
服务化不应该一次性重写。更稳妥的方式是先让单体内部形成清晰的模块边界,再逐步把真正需要独立的业务能力迁出去。
#mermaid-svg-855ugtREJxU99UwH{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-855ugtREJxU99UwH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-855ugtREJxU99UwH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-855ugtREJxU99UwH .error-icon{fill:#552222;}#mermaid-svg-855ugtREJxU99UwH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-855ugtREJxU99UwH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-855ugtREJxU99UwH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-855ugtREJxU99UwH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-855ugtREJxU99UwH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-855ugtREJxU99UwH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-855ugtREJxU99UwH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-855ugtREJxU99UwH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-855ugtREJxU99UwH .marker.cross{stroke:#333333;}#mermaid-svg-855ugtREJxU99UwH svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-855ugtREJxU99UwH p{margin:0;}#mermaid-svg-855ugtREJxU99UwH .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-855ugtREJxU99UwH .cluster-label text{fill:#333;}#mermaid-svg-855ugtREJxU99UwH .cluster-label span{color:#333;}#mermaid-svg-855ugtREJxU99UwH .cluster-label span p{background-color:transparent;}#mermaid-svg-855ugtREJxU99UwH .label text,#mermaid-svg-855ugtREJxU99UwH span{fill:#333;color:#333;}#mermaid-svg-855ugtREJxU99UwH .node rect,#mermaid-svg-855ugtREJxU99UwH .node circle,#mermaid-svg-855ugtREJxU99UwH .node ellipse,#mermaid-svg-855ugtREJxU99UwH .node polygon,#mermaid-svg-855ugtREJxU99UwH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-855ugtREJxU99UwH .rough-node .label text,#mermaid-svg-855ugtREJxU99UwH .node .label text,#mermaid-svg-855ugtREJxU99UwH .image-shape .label,#mermaid-svg-855ugtREJxU99UwH .icon-shape .label{text-anchor:middle;}#mermaid-svg-855ugtREJxU99UwH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-855ugtREJxU99UwH .rough-node .label,#mermaid-svg-855ugtREJxU99UwH .node .label,#mermaid-svg-855ugtREJxU99UwH .image-shape .label,#mermaid-svg-855ugtREJxU99UwH .icon-shape .label{text-align:center;}#mermaid-svg-855ugtREJxU99UwH .node.clickable{cursor:pointer;}#mermaid-svg-855ugtREJxU99UwH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-855ugtREJxU99UwH .arrowheadPath{fill:#333333;}#mermaid-svg-855ugtREJxU99UwH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-855ugtREJxU99UwH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-855ugtREJxU99UwH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-855ugtREJxU99UwH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-855ugtREJxU99UwH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-855ugtREJxU99UwH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-855ugtREJxU99UwH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-855ugtREJxU99UwH .cluster text{fill:#333;}#mermaid-svg-855ugtREJxU99UwH .cluster span{color:#333;}#mermaid-svg-855ugtREJxU99UwH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-855ugtREJxU99UwH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-855ugtREJxU99UwH rect.text{fill:none;stroke-width:0;}#mermaid-svg-855ugtREJxU99UwH .icon-shape,#mermaid-svg-855ugtREJxU99UwH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-855ugtREJxU99UwH .icon-shape p,#mermaid-svg-855ugtREJxU99UwH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-855ugtREJxU99UwH .icon-shape .label rect,#mermaid-svg-855ugtREJxU99UwH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-855ugtREJxU99UwH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-855ugtREJxU99UwH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-855ugtREJxU99UwH :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
模块化单体
识别限界上下文
定义团队所有权
抽取核心业务能力
补服务治理能力
绞杀者模式逐步迁移
业务服务独立演进
每一步都有一个验证点:
绞杀者模式是服务化落地的常用方式。它不是先停掉旧系统再上线新系统,而是在旧系统旁边建设新服务,逐步替换旧能力,直到旧系统可以安全下线。
九、服务化与平台化、中台化的关系
服务化、平台化、中台化并不是三个互相替代的架构形态,而是复用能力在不同层次上的升级:
服务化 复用对象:服务接口
平台化 复用对象:技术能力
中台化 复用对象:业务能力
服务化先把业务能力变成可独立演进的服务;平台化再把支撑服务运行的技术能力统一沉淀;中台化则在服务边界之上,把真正跨产品复用的业务能力组织成领域中心。
三者之间也存在顺序关系。服务化是平台化和中台化的基础,因为只有先形成稳定的服务边界,团队才能知道哪些技术能力需要平台化,哪些业务能力值得中台化。
结语
服务化的目标,是让业务能力可以独立开发、独立部署、独立伸缩、独立演进。它解决的是“变化速度不同的业务,不应该被绑在同一个发布节奏里”。
但服务化的成本是分布式复杂度。只有业务边界清楚、团队所有权明确、治理能力具备、数据边界独立时,拆分才真正有意义。服务化的成功标准不是服务数量,而是团队能否在拆分后更独立、更快地交付业务能力。
服务化复用的是服务接口。
它把业务能力从进程内边界,升级为网络上的独立演进单元。
好的服务化,拆开的是变化,留住的是清晰边界。
网硕互联帮助中心


评论前必须登录!
注册