单体到微服务的思考
·
目录
将单体 SpringBoot 项目拆分为SpringCloud Alibaba 微服务时,结合无人售货柜业务特性,重点关注以下核心注意事项和思考点:
一、业务域边界划分
-
基于 DDD 思想拆分
- 以 “限界上下文” 为核心划分服务,例如无人售货柜的 “用户域”“设备域”“订单域” 需清晰隔离,避免因边界模糊导致服务耦合。
- 避免按技术层拆分(如 “数据库服务”“缓存服务”),应围绕业务能力拆分(如 “设备管理”“订单履约”)。
-
粒度控制
- 初期不宜过细:无人售货柜核心场景集中在 “设备 - 订单 - 商品” 链路,初期可先拆分为 3-5 个核心服务(如用户、设备、商品、订单、支付),后续根据业务复杂度细化(如拆分出 “设备监控服务”“营销服务”)。
- 避免 “微服务地狱”:若两个服务间调用频率极高(如订单与商品服务),可考虑合并或通过本地缓存减少依赖。
二、数据一致性与存储设计
-
数据库拆分策略
- 垂直拆分:按业务域拆分数据库(用户库、设备库、订单库),避免跨库联表查询。
- 水平拆分:订单表按时间 / 设备 ID 分库分表(无人售货柜订单量随设备规模增长,需提前规划)。
- 数据冗余:允许核心数据冗余(如订单表冗余商品名称 / 价格),减少服务间依赖。
-
一致性保障
- 强一致性场景:订单创建 + 库存扣减需通过 Seata 保证原子性(如售货柜出货必须扣减库存)。
- 最终一致性场景:设备状态变更、营销返利等通过 RocketMQ 异步通知,保证最终一致。
- 离线场景兼容:无人售货柜离线交易时,本地存储订单,联网后通过补偿机制同步至服务端,避免数据丢失。
三、服务间通信与依赖
-
通信方式选择
- 同步通信:核心链路(如创建订单、查询设备状态)用 Feign+RestTemplate,保证实时性。
- 异步通信:非核心链路(如设备日志上报、订单状态通知)用 RocketMQ,削峰填谷,提高容错性。
- 设备通信适配:售货柜设备通过 MQTT/CoAP 协议与设备服务通信,需在设备服务层做协议转换。
-
依赖治理
- 避免循环依赖:例如 “订单服务依赖商品服务,商品服务又依赖订单服务”,需通过事件通知解耦。
- 接口稳定性:定义 API 版本(如
/v1/order/create),使用 Swagger 规范接口文档,避免频繁变更影响调用方。
四、业务特性适配
-
设备端与服务端协同
- 双端一致性:设备本地缓存商品 / 价格信息,支持离线下单,联网后自动同步;服务端通过定时任务校验设备端数据一致性。
- 故障容错:设备断网时,服务端需标记设备状态,恢复后触发数据补传;订单支付超时自动取消,释放库存。
-
高可用设计
- 服务降级:设备服务不可用时,网关返回 “设备维护中”,避免级联故障。
- 熔断限流:Sentinel 保护核心接口(如订单创建),设置 QPS 阈值,防止设备批量上报导致服务雪崩。
- 缓存策略:热点数据(如商品信息、设备配置)用 Redis 缓存,减轻数据库压力。
五、技术架构选型与风险
-
组件适配性
- 注册中心:Nacos 同时满足服务发现 + 配置管理,减少组件依赖,适合中小型微服务架构。
- 消息队列:无人售货柜设备状态上报高频且量大,RocketMQ 的高吞吐更适配(优于 RabbitMQ)。
- 设备协议:优先选择 MQTT(轻量级、低带宽)适配售货柜硬件,避免 HTTP 协议的高开销。
-
技术债务规避
- 公共组件复用:抽取
common模块(工具类、异常处理、通用 DTO),避免重复开发。 - 配置统一管理:Nacos 区分开发 / 测试 / 生产环境配置,禁止硬编码敏感信息(如设备通信密钥)。
- 公共组件复用:抽取
六、运维与监控
-
可观测性建设
- 链路追踪:SkyWalking 监控服务间调用链路,定位设备 - 服务端通信瓶颈。
- 业务监控:监控设备在线率、订单支付成功率、库存差异率等核心指标,异常时触发告警。
- 日志治理:统一日志格式,Elasticsearch 存储设备日志 / 业务日志,支持故障回溯。
-
部署策略
- 灰度发布:新功能先部署到部分设备 / 服务节点,验证无误后全量发布。
- 容灾设计:核心服务多实例部署,数据库主从分离,避免单点故障。
七、成本与资源考量
- 硬件适配:无人售货柜硬件性能有限,服务端接口需轻量化(如 JSON 序列化优化、减少响应数据量)。
- 网络成本:设备与服务端通信需控制流量(如压缩上报数据、批量传输),降低物联网卡资费成本。
总结
拆分的核心是 **“业务驱动、循序渐进”**:先保证核心链路的稳定性,再逐步优化非核心场景;同时需紧扣无人售货柜的 “离线可用、设备协同、实时性” 特性,平衡微服务架构的灵活性与业务场景的特殊性。
更多推荐
所有评论(0)