拆分时机

服务拆分的核心目标是实现服务独立可扩展、降低维护成本、提升系统稳定性,以下是8个核心原则,结合文字说明、具体例子,以表格形式清晰呈现,兼顾理论与实操性。

拆分原则

原则名称

核心说明

具体例子

单一服务内部功能高内聚低耦合

每个服务仅负责自身职责范围内的任务,非自身职责的功能交由其他对应服务处理,避免功能混杂、边界模糊。

电商系统中,“订单服务”仅处理订单的创建、修改、查询、取消等订单相关操作;用户注册、登录由“用户服务”负责,支付由“支付服务”负责,订单服务不参与用户信息管理或支付流程。

闭包原则(CCP)

当需要修改某个微服务时,所有相关依赖、修改点均在该服务内部,无需改动其他微服务,降低修改带来的连锁影响。

“商品服务”负责商品信息(名称、价格、库存)的管理,若需新增“商品标签”字段,仅需修改商品服务的数据库、接口及内部逻辑,无需改动调用它的订单服务、首页服务。

服务自治、接口隔离原则

消除服务间的强依赖,通过标准接口对外提供服务,隐藏内部实现细节,实现服务独立开发、测试、部署、运行,降低沟通成本,提升稳定性。

“短信服务”通过标准HTTP接口对外提供“发送短信”“查询短信发送状态”功能,其他服务(如注册服务、订单服务)仅需调用该接口,无需知道短信服务内部是用阿里云还是腾讯云短信通道,也无需关注其代码实现。

持续演进原则

服务拆分初期无需追求“完美拆分”,应结合业务认知逐步划分、持续优化,避免服务数量爆炸性增长,防止过度拆分增加管理成本。

初期将电商系统拆分为“用户服务”“订单服务”“商品服务”3个核心服务;随着业务发展,发现“商品评价”功能日益复杂,再将其从商品服务中拆分出来,独立为“评价服务”,逐步完善服务边界。

拆分避免影响产品日常功能迭代

拆分与产品功能迭代并行,优先剥离独立边界服务、非核心服务,减少拆分对现有业务的影响,同时给团队提供试错、练习机会;有依赖关系时,优先拆分被依赖服务。

电商系统拆分时,优先剥离“短信服务”“日志服务”等非核心、边界清晰的服务,不影响核心的订单下单、商品浏览功能;若订单服务依赖商品服务,先拆分商品服务,再逐步拆分订单服务。

避免环形依赖与双向依赖

禁止服务间出现A依赖B、B依赖A的环形依赖或双向依赖,出现此类情况说明功能边界划分不清,或存在未下沉的通用功能。

错误示例:订单服务依赖商品服务查询商品价格,商品服务又依赖订单服务查询商品销量;正确做法:将“商品价格”“商品销量”统一放在商品服务,订单服务仅调用商品服务接口,消除双向依赖。

阶段性合并

当业务逻辑变化、对领域边界理解加深,或原有拆分不合理导致服务边界混乱时,需重新梳理边界,对服务进行阶段性合并,纠正拆分偏差。

初期将“地址管理”拆分为独立服务,但后续发现该服务功能简单、调用频率低,且主要被用户服务调用,边界模糊,此时将地址管理功能合并到用户服务,减少服务数量,简化管理。

自动化驱动

服务数量增多会导致部署、运维成本指数级上升,拆分前需构建自动化工具及环境,简化服务创建、开发、测试、部署、运维的重复性工作,降低管理复杂度。

搭建Jenkins自动化部署工具,实现服务代码提交后自动构建、自动测试、自动部署;使用ELK日志收集分析工具,统一管理所有服务的日志;通过Prometheus实现服务监控自动化,减少人工运维成本。

服务接口具备可扩展性

接口设计需考虑后续升级,避免因参数变更导致调用方报错,推荐使用封装类作为接口参数,新增参数时无需变更接口签名。

错误示例:用户注册接口最初设计为(username, password)两个参数,后续新增“phone”参数时,修改接口签名为(username, password, phone),导致所有调用该接口的服务报错;正确做法:将参数封装为“UserRegisterDTO”类,接口参数仅为该类,新增“phone”字段时,仅修改DTO类,接口签名不变。

总结:微服务拆分需围绕“业务边界”展开,兼顾高内聚、低耦合、可扩展、可维护性,无需追求一步到位,通过持续演进、自动化支撑、规避依赖问题,逐步实现服务拆分的合理性与高效性,同时确保拆分过程不影响业务正常迭代。

拆分粒度控制

果拆分粒度太细会增加运维复杂度,粒度过大又起不到效
果。平衡拆分粒度可以从两方面进行权衡,一是业务发展的复杂度,二是团队规模的人数

功能维度拆分策略

拆分模块

核心内容

一、核心拆分总原则

核心逻辑

按业务复杂度选型拆分模式,不局限单一方式,可灵活组合

选型标准

1. 业务复杂度低 → 数据驱动拆分(自下而上);2. 业务复杂度高 → 领域驱动DDD拆分(自上而下)

二、两大业务驱动拆分方式

1. 数据驱动拆分(简单业务首选)

设计思路:自下而上,先定数据表结构,按数据关系划服务;拆分流程:需求分析→抽象数据结构→划分服务→确定调用关系→流程验证

2. 领域驱动DDD拆分(复杂核心业务首选)

设计思路:自上而下,对齐业务专家统一语言,划定业务边界;核心优势:贴合真实业务目标,避免技术脱离业务;拆分流程:统一领域语言→业务场景分析→寻找业务聚合→划定限界上下文→确定服务调用→流程验证+持续优化;落地规则:一个限界上下文=一个微服务

3. 单体系统渐进式拆分

拆分顺序:前后端分离→抽取公共基础服务(登录、配置等)→优先垂直业务拆分→辅以水平通用切分→逐步剥离老系统业务

三、非功能维度六大拆分策略

1. 扩展性拆分

区分变/不变业务:稳定通用功能抽公共服务,高频迭代业务独立拆分;二八原则:20%变动业务独立拆分,80%稳定业务统一复用,互不影响发布

2. 复用性拆分

抽取通用重复能力:鉴权、限流、日志、监控、网关能力统一下沉为公共服务,全业务复用

3. 高性能拆分

1. 高压力模块独立拆分(如电商抢购排队服务);2. 读写分离拆分:读多写少业务拆读服务、写服务;3. 数据一致性原则:强一致数据尽量同服务,弱一致数据可跨服务拆分

4. 高可用拆分

核心业务与非核心业务物理拆分,集中资源保障核心服务稳定性;遵循三个火枪手原则控制核心服务数量

5. 安全性拆分

高密级安全业务独立拆分,分区部署(DMZ隔离),精准管控安全权限,降低安全设备压力

6. 异构性拆分

按技术栈/开发语言拆分,不同语言实现的业务独立成服务,适配技术异构场景

四、微服务拆分核心风险与避坑

1. 团队能力先行

先评估团队微服务技术栈驾驭能力,再落地拆分

2. 拒绝追求最优方案

只做当下最合适拆分,预留后期调整空间

3. 落地优先理论

先拆分落地,不合适再调整,搭建服务治理、双写迁移等配套能力

4. 杜绝只拆不合

服务过多、粒度过细、维护成本飙升需及时合并;多服务打包同机部署降资源损耗,内部依旧保持微服务边界,方便后续再次拆分

5. 组织架构适配

拆分后匹配独立小团队专职维护对应服务

实战

分类 技术组件 作用 替代传统 SpringCloud 优势
微服务框架 Spring Cloud Alibaba 整套微服务生态 组件持续维护、可视化完善、上手简单
服务注册 / 发现 Nacos 注册中心 + 配置中心 一站式整合,界面友好,环境隔离
远程调用 OpenFeign 服务之间 HTTP 调用 声明式调用,简洁易维护
网关路由 Spring Cloud Gateway 统一入口、路由转发 性能优于 Zuul,支持动态路由
熔断限流 Sentinel 流量控制、熔断降级 阿里生态,实时监控,配置简单
分布式事务 Seata 跨服务事务一致性 轻量级,AT 模式易接入
链路追踪 SkyWalking 调用链路监控、性能分析 无侵入 agent,轻量高效
日志收集 Filebeat+Logstash+ES+Kibana 分布式日志检索 集中收集日志,按 TraceId 排查
服务监控 SpringBoot Actuator 应用健康指标监控 内置端点,快速对接监控平台
配置文件 bootstrap.yml+application.yml 优先级配置加载 区分启动配置与业务配置
环境隔离 Nacos Namespace 开发 / 测试 / 生产环境隔离 一键切换环境配置
服务名称 域名 端口 核心职责 依赖组件
认证授权中心 auth.tuling.com 9999 登录、令牌发放、权限校验 Nacos、OpenFeign、Gateway
网关服务 gateway.tuling.com 8888 路由转发、限流、鉴权、跨域 Gateway、Nacos、Sentinel
用户服务 member.tuling.com 8877 用户信息、会员等级、收货地址 Nacos、Feign、MySQL
商品服务 product.tuling.com 8866 商品上架、分类、库存、详情 Nacos、Feign、Redis
优惠券服务 coupons.tuling.com 8855 优惠券发放、领取、核销 Nacos、Feign
订单服务 order.tuling.com 8844 下单、订单状态、支付回调 Nacos、Feign、Seata
前台门户服务 - 8887 页面聚合、前端接口适配 Gateway 转发
数据库 tlshopdb.com 3306 业务数据存储 MySQL 分库设计
Nacos 中心 tlshop.com 8848 注册 + 配置统一管理 全局依赖
Nacos 注册中心搭建流程
部署 Nacos 服务端 → 新建命名空间区分环境
微服务引入nacos-discovery依赖
yml 配置服务名 + Nacos 地址 + 命名空间
启动服务,Nacos 控制台查看服务在线状态
2. Nacos 配置中心流程
引入nacos-config依赖
新建bootstrap.yml优先加载配置中心
配置共享公共配置(数据库、Redis、Mybatis)
按服务名 + 环境创建私有配置
实现配置动态刷新,无需重启服务
3. OpenFeign 远程调用流程
引入 Feign 依赖
启动类加@EnableFeignClients
编写 Feign 调用接口绑定目标服务
业务层注入接口调用远程方法
开启 Feign 全量日志,调试接口传参
4. Gateway 网关搭建流程
引入 Gateway 依赖排除 webmvc
配置路由规则:路径匹配转发至对应服务
开启服务发现自动路由
网关接入 Nacos 注册 + 配置中心
网关统一拦截鉴权、限流、跨域处理
5. SkyWalking 链路追踪流程
部署 SkyWalking OAP 服务 + UI 界面
所有微服务启动配置 JavaAgent 参数
引入日志埋点依赖,日志输出traceId
查看调用链路、接口耗时、异常节点
定位慢接口、服务调用阻塞问题
6. ELK 日志整合流程
Filebeat 采集服务器本地微服务日志
推送日志至 Logstash
Logstash 正则提取traceId、日志级别、时间
结构化数据存入 Elasticsearch
Kibana 可视化检索,通过 traceId 串联全链路日志

父工程搭建:统一锁定 Boot、Cloud、Alibaba 版本
公共模块抽取:统一返回结果、常量、工具类、异常
环境规划:Nacos 创建 dev/test/prod 命名空间
基础设施部署:Nacos、SkyWalking、ELK、MySQL
基础服务优先开发:网关→认证中心→基础业务服务
服务注册接入:所有服务统一注册 Nacos
远程调用调试:Feign 完成跨服务接口联调
网关统一收口:所有请求统一走网关入口
链路日志整合:接入 SkyWalking+ELK 线上排错
熔断事务完善:Sentinel 限流、Seata 分布式事务

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐