什么时候该从单体走向微服务

单体应用在团队小、业务简单的时候其实很高效:一个工程、一个部署、一个数据库,跑起来轻快。但当业务涨大、团队变多,一次改动要全量发布、模块之间互相牵扯,拆分的价值才开始显现。

微服务不是目标本身,而是当单体的协作和交付成本高到一定程度时,用来换取独立演进能力的一种手段。为拆而拆,往往得不偿失。

微服务解决的是「组织如何独立演进」的问题,而不是让架构看起来更时髦。
本文核心知识点
  • 按边界拆围绕业务能力拆服务,而不是按技术层切。
  • 注册发现服务启动自动登记,调用方动态找得到。
  • 配置中心配置集中管理、动态下发,不写死。
  • 网关容错统一入口,挡住雪崩与级联故障。
  • 渐进演进先拆最痛的一块,别一步到位。
微服务示意:蓝色渐变背景中央一个发光注册中心枢纽圆点,向外辐射连线连接周围多个半透明服务节点方块,旁悬浮配置齿轮与网关节点,扁平科技插画
服务拆分后,枢纽负责注册发现与配置,各服务围绕业务边界独立演进。

服务拆分:按业务边界,不是按技术层

最常见的错误,是照着技术层拆:用户服务、订单服务、商品服务……听起来整齐,实际边界却经常交叉。更稳的做法是围绕业务能力和限界上下文来拆,一个服务负责一块内聚的业务。

拆分方式问题更稳的思路
按技术层切边界交叉,改动要跨多个服务按业务能力拆,一块职责一个服务
一上来拆很碎调用链太长,运维复杂先拆最痛的核心域,逐步细化
多个服务共用一个库数据边界糊在一起服务自己管自己的数据
# 判断边界是否合理的一个问题
- 这个服务能不能由一个小团队独立开发、独立部署?
# 能,说明边界切对了;不能,往往还需要重新划分。

好的拆分让每个服务职责清晰、数据自治,团队之间的协作摩擦自然下降。

注册与发现:服务怎么找到彼此

拆成多个服务后,调用方不能再写死对方地址——服务会扩缩容、会换机器。注册发现就是让服务启动时把自己登记到注册中心,调用方再从注册中心动态拿到可用地址。

  • 服务启动:把自己的地址上报到注册中心。
  • 服务下线:注册中心及时摘除不可用节点。
  • 调用方:按需拉取可用实例列表,而不是硬编码。
# 注册发现解决的核心问题
调用方问注册中心:「订单服务现在有哪些可用地址?」
注册中心返回一组健康实例
调用方选一个发起调用,并在失败时切换其他实例
# 地址不再写死,扩缩容对调用方透明。

有了注册发现,服务的增删和扩缩容才不会牵动一大堆配置改动。

配置中心:别把配置写死在代码里

几十个服务、每个都带一堆环境配置,散在代码和部署脚本里,改一项就要重新发版,既慢又易错。配置中心把这些配置集中存放、统一管理、动态下发。

做法问题配置中心的改进
配置写进代码改配置要重新发版配置集中,改完动态生效
各服务各管各的同类配置互相不一致统一来源、统一版本
敏感配置明文存放泄漏风险高支持加密与访问控制

配置中心让「改一个开关、调一个地址」变成随时可做的事,而不是一次全员发版。