云计算百科
云计算领域专业知识百科平台

架构之服务化:把业务能力切成能独立演进的服务

架构之服务化:把业务能力切成能独立演进的服务

很多团队把服务化直接理解成“上微服务”。于是拆控制器、拆数据库表、拆代码目录,最后服务数量上去了,系统却从一个单体变成了一个更难排查的分布式单体。

服务化不是把代码切碎,也不是把服务数量当成绩效。它的本质是把原来进程内的业务能力边界,升级为网络上可独立部署、独立演进的服务边界。

真正要回答的问题不是“要不要微服务”,而是“当前哪些业务能力已经具备独立演进的条件,并且拆分后团队能够独立交付”。

一、服务化到底解决什么问题

单体架构的优点是简单:本地调用、本地事务、单次发布、单套日志。但它会在一些信号出现后变得难以继续:

  • 多个团队频繁修改同一个应用,发布互相阻塞;
  • 局部小改动必须发布整个系统;
  • 一个非核心模块故障会拖垮整个进程;
  • 不同模块的流量、资源需求和变化速度差异很大;
  • 业务边界已经清晰,团队能够认领某个完整能力。

服务化要解决的核心问题不是“单体不好”,而是“业务能力无法独立演进”。它的收益集中在四个方面:

目标服务化前服务化后
独立交付 所有团队共用一个发布节奏 服务可独立开发、测试、发布
独立扩缩容 整体扩容,资源利用率低 按服务流量和资源特征伸缩
故障隔离 单点异常可能拖垮全进程 故障范围被限制在服务边界内
团队自治 跨团队协调成本高 团队对所属服务负责

如果这些收益在当前阶段并不成立,就不应该为了“先进”而服务化。服务化是用分布式复杂度,换取业务能力的独立演进能力。它只有在业务和组织真正需要独立演进时,才是划算的。

二、拆分对象不是代码,而是业务能力

服务化最常见的错误,是按技术层或数据库表拆:

错误拆分方式:
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;}

    模块化单体

    识别限界上下文

    定义团队所有权

    抽取核心业务能力

    补服务治理能力

    绞杀者模式逐步迁移

    业务服务独立演进

    每一步都有一个验证点:

  • 单体内部是否已经形成稳定模块边界;
  • 团队是否能用统一语言描述业务能力;
  • 服务是否由清晰团队负责;
  • 抽取后的服务是否能独立发布;
  • 网关、注册、监控、链路是否已经可用;
  • 新服务是否已经开始承接真实流量。
  • 绞杀者模式是服务化落地的常用方式。它不是先停掉旧系统再上线新系统,而是在旧系统旁边建设新服务,逐步替换旧能力,直到旧系统可以安全下线。

    九、服务化与平台化、中台化的关系

    服务化、平台化、中台化并不是三个互相替代的架构形态,而是复用能力在不同层次上的升级:

    服务化 复用对象:服务接口
    平台化 复用对象:技术能力
    中台化 复用对象:业务能力

    服务化先把业务能力变成可独立演进的服务;平台化再把支撑服务运行的技术能力统一沉淀;中台化则在服务边界之上,把真正跨产品复用的业务能力组织成领域中心。

    三者之间也存在顺序关系。服务化是平台化和中台化的基础,因为只有先形成稳定的服务边界,团队才能知道哪些技术能力需要平台化,哪些业务能力值得中台化。

    结语

    服务化的目标,是让业务能力可以独立开发、独立部署、独立伸缩、独立演进。它解决的是“变化速度不同的业务,不应该被绑在同一个发布节奏里”。

    但服务化的成本是分布式复杂度。只有业务边界清楚、团队所有权明确、治理能力具备、数据边界独立时,拆分才真正有意义。服务化的成功标准不是服务数量,而是团队能否在拆分后更独立、更快地交付业务能力。

    服务化复用的是服务接口。
    它把业务能力从进程内边界,升级为网络上的独立演进单元。
    好的服务化,拆开的是变化,留住的是清晰边界。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 架构之服务化:把业务能力切成能独立演进的服务
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!