| 题源类型 | 押题 |
| 年份/批次 | |
| 适用项目 | 某互联网公司线上商品交易与运营平台 |
| 主题概念 | 微服务架构通过把庞大的单体应用分解为一组围绕业务能力组织的服务,使每个服务能够相对独立地开发、部署、配置和扩展,并通过标准接口进行协作 |
| 常见方法 | 服务拆分、服务注册与发现、API 网关、REST 接口、消息队列和链路监控等 |
| 已选论文点 | 业务能力拆分 / 服务注册与网关治理 / 异步消息协作 |
| 项目位置/技术/需求 | 在业务架构划分方面,我们采用按业务能力拆分服务的方式来解决原有单体系统复杂度高、修改影响范围大的问题 |
| 解决的问题 | 平台涉及商品运营、订单交易、库存处理、支付确认、消息通知和经营对账等业务,如果继续把这些逻辑放在同一个应用中,活动规则调整、库存策略变化和订单流程优化都会牵动大量代码,开发人员也难以判断修改边界 |
| 解决的方法 | 为解决这一问题,我组织项目组以业务职责和数据归属为依据,将系统拆分为用户、商品、订单、库存、支付、运营和对账等服务,并明确每个服务的职责范围和对外接口 |
| 具体的实现 | 具体实现时,服务端采用 Spring Cloud Alibaba 技术体系,各核心服务独立维护自身业务逻辑,MySQL 保存交易主数据,Redis 支撑热点商品和库存快照 |
| 例子 | 以用户提交订单为例,订单服务负责订单创建和状态流转,不直接维护商品详情和库存明细,而是通过标准接口获取商品状态和库存可用性 |
| 效果 | 通过这种拆分方式,系统从一个庞大的应用转变为多个职责清晰的服务,后续新增活动规则或调整库存策略时,可以主要在相关服务内部完成修改 |
| 项目位置/技术/需求 | 在服务访问和调用治理方面,我们采用服务注册与网关治理来满足多入口访问、动态部署和接口统一管理的要求 |
| 解决的问题 | 微服务拆分后,服务数量增加,如果调用方直接配置各服务地址,不但会导致地址维护困难,也会使认证、限流和接口版本管理分散到各个业务模块中 |
| 解决的方法 | 为解决这一问题,项目组引入 Nacos 作为服务注册和配置管理组件,各业务服务启动后自动注册服务实例,调用方通过 Dubbo 完成服务发现和远程调用;对外访问则统一经过 Spring Cloud Gateway,由网关集中完成身份校验、访问限流、请求路由和日志记录 |
| 具体的实现 | 具体运行时,用户和运营后台请求先进入网关,再根据接口规则转发到相应业务服务,内部服务之间通过注册中心获取可用实例 |
| 例子 | 以客服查询订单为例,请求经过网关完成登录校验后转入订单相关服务,再根据需要读取支付、库存和消息处理状态 |
| 效果 | 通过服务注册与网关治理,项目组能够较好地控制服务调用关系,服务扩容、发布和故障摘除也更加灵活 |
| 项目位置/技术/需求 | 在跨服务业务流程处理方面,我们采用异步消息协作来降低服务之间的耦合度,缓解活动高峰期的处理压力 |
| 解决的问题 | 线上交易从下单到完成,需要经历订单创建、库存处理、支付确认、消息通知、超时关闭和对账处理等多个环节,如果所有服务都采用同步调用,某个环节响应变慢就会影响用户主流程,也会放大外部支付渠道波动带来的影响 |
| 解决的方法 | 为解决这一问题,项目组使用 RocketMQ 作为消息中间件,将订单状态变化、支付结果确认、库存释放和通知发送等过程通过消息方式衔接,xxl-job 用于定时处理超时订单和补偿任务 |
| 具体的实现 | 实际运行中,用户提交订单后,订单服务只完成必要的订单记录和状态处理,库存、消息和对账等后续工作由相关服务根据消息异步处理 |
| 例子 | 以未支付订单关闭为例,定时任务发现订单超过支付时限后触发关闭处理,库存服务收到通知后释放占用库存,消息服务再提醒用户订单状态变化 |
| 效果 | 通过异步消息协作,各服务只关注自身职责,高峰期可以利用消息队列削峰填谷,外部接口短暂异常时也不会直接阻塞下单主流程 |