本文目录导读:

- 业务能力维度(最推荐,最自然)
- 子域维度(DDD 领域驱动设计)
- 数据存储与事务维度
- 团队与组织结构维度(康威定律)
- 非功能性需求维度(性能、安全、扩展性)
- 内部通用功能拆分(公共服务)
- 实操:Laravel 微服务拆分四步 checklist
- 常见坑 & 建议
- 总结:最佳实践路径(渐进式)
Laravel 微服务拆分的核心原则是“高内聚、低耦合”,即每个服务内部功能高度相关,服务之间通过轻量级通信(如 HTTP API、消息队列)交互。
没有绝对正确的维度,只有适合你业务和技术场景的维度,以下是 Laravel 微服务最常见的拆分维度及具体实操建议:
业务能力维度(最推荐,最自然)
根据公司或系统的核心业务域进行拆分,这是 Martin Fowler 提出的微服务设计核心思想。
- 做法:识别独立的业务单元,每个单元负责完整的业务生命周期。
- Laravel 例子:
- 用户服务:注册、登录、权限、个人资料、积分。
- 订单服务:购物车、下单、订单状态、退款。
- 商品服务:SKU/SPU、库存、分类、价格管理。
- 支付服务:对接支付宝/微信、账单、支付回调。
- 通知服务:邮件、短信、App Push、站内信。
- 优点:业务边界清晰,团队组织可以直接对齐业务线,易于理解和维护。
- 缺点:需要深入理解业务领域,初期容易拆得不够准。
子域维度(DDD 领域驱动设计)
对于复杂业务,可以用 DDD 中的限界上下文来划分。
- 做法:找出核心域、支撑域、通用域,按上下文边界拆分。
- 例子:
- 核心域:电商的“订单履约服务”(最核心,投入最多资源)。
- 通用域:用户认证、短信通知(可直接采购或复用开源)。
- 优点:能处理复杂业务,聚焦核心价值。
数据存储与事务维度
Laravel 的单体应用通常依赖 MySQL 外键和事务,拆分后,每个服务应有自己的数据库。
- 做法:找出数据访问的“热点”和“隔离性”,哪些数据经常一起变更(强一致性)?哪些可以最终一致?
- 例子:
- 需要强事务的(如:下单减库存,订单创建和支付扣款)通常应放在同一个服务内,或使用 Saga 模式处理,而不是强行拆分。
- 独立的数据表:订单表、用户表、商品表,天然属于不同的服务数据库。
- 关键点:杜绝跨服务调用数据库,服务间只能通过 API 或消息队列交换数据。
团队与组织结构维度(康威定律)
微服务拆分要匹配团队的组织结构。
- 做法:按照团队职责划分,一个团队负责一个或多个微服务,拥有从开发到运维的完整所有权。
- 例子:
- “用户增长团队”维护“用户服务”和“营销服务”。
- “交易团队”维护“订单服务”、“支付服务”、“物流服务”。
- 好处:减少跨团队沟通成本,提升迭代速度。
非功能性需求维度(性能、安全、扩展性)
- 按性能要求拆分:
- 高频访问服务:如“商品搜索服务”需要高并发、低延迟,可单独拆分部署,并为其配置缓存和弹性伸缩。
- 低频计算服务:如“报表服务”或“大数据分析服务”,可独立部署,不影响核心业务。
- 按安全性拆分:
- 高风险服务:如“支付服务”、“用户隐私服务”,将其隔离,加强安全审计和权限控制。
- 按变更频率拆分:
- 稳定服务:如“基础字典服务”、“配置服务”。
- 快速迭代服务:如“活动营销服务”、“推荐服务”,将其拆分,避免频繁发版影响整个系统。
内部通用功能拆分(公共服务)
- 做法:识别出被多个业务服务调用的通用模块,独立成服务。
- 例子:
- 认证鉴权服务:统一处理 OAuth、JWT、SSO。
- 文件/对象存储服务:负责图片上传、CDN 处理。
- 消息/事件中心:负责服务间异步通信(通常基于 RabbitMQ / Redis / Kafka)。
- 搜索/索引服务:封装 Elasticsearch 或 Meilisearch。
实操:Laravel 微服务拆分四步 checklist
- 从“最痛的”开始:不要全量拆分,挑出系统中最卡、最频繁变更、最独立的部分(如“通知”,或“商品搜索”)先行拆分。
- 数据先行分离:将对应业务的数据表迁移到独立的数据库,通过 API 访问。
- 定义通信契约:
- 同步:RESTful API(推荐
laravel/sanctum做认证)或 GraphQL。 - 异步:消息队列(推荐 Laravel Horizon + Redis / RabbitMQ)。
- 同步:RESTful API(推荐
- 服务间解耦:使用 Saga 或 TCC 处理分布式事务,避免强一致。
常见坑 & 建议
- 不要一开始就追求完美:微服务拆分是演进式的,可以先从 Monolith First (先做好单体,再根据痛点拆分) 开始。
- Laravel 不适合太碎:Laravel 提供的 Eloquent ORM、Artisan 等较重,不适合拆成几十个超小服务,建议每个服务是一个完整的 Laravel 项目,包含自己的路由、控制器、模型、Migration。
- 重视监控与日志:拆分后日志分散,必须统一收集(如 ELK 或 Laravel Telescope),必须建立服务健康检查、链路追踪(如 OpenTelemetry / Zipkin)。
- 共享库:将 DTO、事件定义、API 客户端等公用的 PHP 类打包成 Composer 私有包,减少重复代码。
最佳实践路径(渐进式)
阶段 1:单体应用 -> 阶段 2:拆出公共服务 (通知、文件、认证) -> 阶段 3:按业务域拆分最核心、最独立的部分 (如订单、支付) -> 阶段 4:逐步拆分其他非核心业务
一句话建议:按业务能力拆,从通知服务这种“副作用”强、边界清晰的服务开始,逐步演进,不要一刀切。