论面向服务的架构设计 原文

返回主题详情 背诵模式

原文文件:论面向服务的架构设计-线上商品交易与运营平台.md

# 论面向服务的架构设计

## 摘要

2024 年 3 月,我参与了某互联网公司线上商品交易与运营平台的建设工作。该平台围绕公司线上交易业务的统一运营需要,实现了商品交易、库存协同和经营分析等工作的集中支撑。在该项目中,我担任系统架构设计师,主要负责总体架构设计、关键技术选型、模块划分、接口规范制定和核心方案评审工作。本文以该系统为例,主要论述面向服务的架构设计在项目中的具体应用。结合本项目业务变化较快、交易链路集中、外部接口较多和后期维护要求较高等特点,我们主要从服务提供者、服务注册中心和服务请求者三个方面进行了设计和实施。实践证明,上述设计较好地降低了系统耦合度,提高了业务能力复用水平和系统运行稳定性,保证了项目顺利上线运行。

## 正文

随着公司线上经营规模不断扩大,业务活动从单一的商品展示和订单处理,逐步延伸到活动运营、库存协同、售后服务和经营分析等多个环节,各项业务对信息系统连续、稳定支撑的要求也越来越高。该项目建设前,公司线上交易业务主要依靠原有单体系统和若干后台工具支撑,虽然能够满足早期业务需要,但随着活动数量、用户访问量和订单处理量持续增加,原系统在业务协同和运行效率方面逐渐难以适应发展要求。特别是在活动高峰期,交易请求集中到达,订单生成、支付确认、库存处理和状态查询等环节相互依赖,容易出现响应延迟和状态不一致的情况;运营人员也需要在多个后台之间反复核对活动配置和交易数据,影响了业务处理效率。为了提高线上交易处理效率,规范商品和订单管理流程,降低后续系统维护成本,公司决定建设统一的线上商品交易与运营平台。

本项目于 2024 年 3 月启动,历时 10 个月完成核心功能建设并上线运行,项目组共 21 人。系统采用前后端分离方式建设,服务端以 Java 技术体系为主,并结合网关、缓存、数据库、消息队列和定时任务等技术组件完成系统支撑。平台上线后,用户侧交易流程由统一入口承载,运营人员也可以通过后台集中维护商品活动信息,并统一监控交易和对账情况。我在项目中担任系统架构设计师,主要负责总体架构设计、关键技术选型、模块划分、接口规范制定和核心方案评审,历时 4 个月完成主要架构设计工作。结合该平台业务能力复用、系统协作和接口治理等方面的要求,我在架构设计中重点采用了面向服务的设计思想。

在架构设计工作开始阶段,我认识到,面向服务的架构设计是进行系统建设和企业应用集成时需要重点考虑的内容。面向服务架构是一种粗粒度、松耦合的服务架构,它通过标准化接口把业务能力封装为可复用服务,使服务提供者和服务请求者能够在相对独立的情况下完成协作。常见的面向服务架构相关方法包括服务提供者、服务请求者、服务注册中心、标准化服务接口和企业服务总线等。本项目主要采用了服务提供者、服务注册中心和服务请求者三个角色组织系统。其中,服务提供者负责把稳定业务能力封装成可被调用的服务;服务注册中心负责服务发布、发现和状态管理;服务请求者负责按业务流程调用服务并完成业务协同。以下正文将重点描述这些措施的实施过程和应用效果。

在业务能力封装方面,我们将商品、订单、库存、支付和运营等核心能力设计为服务提供者,以满足业务能力复用、接口统一和系统松耦合的要求。原有系统中,商品活动规则、订单状态处理和库存扣减逻辑混杂在单体应用内部,如果继续沿用这种方式,活动规则调整时容易牵动多个功能模块,开发人员也难以判断修改范围。为解决这一问题,我组织项目组按照业务职责划分服务边界,将稳定、可复用的业务能力封装为相对独立的服务,并对外提供统一接口。具体实现时,我们为各服务制定接口命名、请求参数、返回码和异常信息规范,服务内部可以使用 MySQL、Redis 等组件处理数据和缓存,但这些实现细节不暴露给调用方。以用户提交订单为例,订单服务不直接维护商品详情和库存明细,而是通过标准接口获取商品状态、活动价格和库存可用性,再完成订单创建和状态记录。通过这种服务提供者设计,各业务能力的职责更加清晰,调用方只依赖稳定的服务契约,后续新增运营活动或调整库存策略时,可以主要在相关服务内部完成修改,减少对其他业务环节的影响。

在服务发布和运行管理方面,我们采用服务注册中心来解决服务发布、查找和运行状态管理不统一的问题。平台拆分为多个服务后,如果各服务调用方直接维护对方地址、端口和版本信息,一旦发生扩容、迁移或故障切换,就需要频繁修改配置,容易形成新的维护负担。为解决这一问题,我们使用 Nacos 作为服务注册中心,各服务启动后自动登记服务名称、实例地址、版本标识和健康状态,调用方按照服务名称查找可用实例,并由注册中心剔除异常节点。对外访问则由 Spring Cloud Gateway 统一接入,负责把外部请求路由到已经注册的后端服务。以运营后台查询订单处理情况为例,请求先经过网关进入订单相关服务,再由订单服务通过注册中心发现商品、支付等服务并获取必要信息。通过服务注册中心,服务的发布、发现和状态管理形成统一机制,调用方不再关心具体部署位置,系统扩容、灰度发布和故障摘除都可以在较小范围内完成,增强了平台的运行弹性和可维护性。

在跨服务业务协同方面,我们将订单、库存、支付、消息和对账等模块设计为服务请求者,使其按照业务流程调用相关服务,满足交易链路清晰和服务协作可控的要求。线上交易流程涉及多个业务环节,如果全部写在一个服务中,会导致服务职责过重;如果各服务之间随意相互调用,又会造成调用关系混乱,异常定位困难。为解决这一问题,我们明确了服务请求者的调用边界:交易主流程中必须立即返回结果的环节采用同步服务调用,支付回调、消息通知、超时关闭和对账处理等后续工作通过 RocketMQ、xxl-job 等机制异步衔接,并保留接口日志用于问题追踪。以用户下单并完成支付为例,订单创建时作为服务请求者调用商品和库存能力完成必要校验,支付结果返回后再驱动订单状态变更,并通知消息和对账相关模块继续处理。对于支付结果延迟或外部接口短暂异常的情况,系统通过定时补偿和接口日志进行恢复。通过这种服务请求者设计,各服务既能围绕统一业务流程协作,又能保持相对独立,降低了交易链路的耦合度,提高了系统对业务高峰和异常情况的适应能力。

整个项目于 2025 年 1 月完成核心功能上线,并在公司主要业务线推广使用。系统上线后,先后支撑了多次业务活动和交易高峰,整体运行情况较为平稳,核心业务流程能够正常开展,运营和客服人员也能够通过统一平台完成日常处理工作。上线运行期间,系统未发生重大生产事故,少量异常数据能够通过补偿任务和人工复核及时处理,维护工作量处于可控范围。经过一段时间运行,该平台基本满足了公司线上交易和运营管理的需要,提高了业务处理效率,减少了运营人员的重复操作,并得到了业务部门的认可。实践证明,面向服务的架构设计对于本项目中业务能力复用、服务协同和后续维护起到了较好的支撑作用。

在总结项目经验的同时,我也看到本项目仍然存在一些不足。第一,活动高峰期部分热门商品访问较为集中,个别页面和查询接口在峰值情况下响应时间仍有波动;第二,部分运营报表在上线初期还不够完善,部分统计指标需要人工核对后才能使用。针对第一类问题,后续我们计划继续优化热点数据缓存、查询索引和资源扩容策略;针对第二类问题,我们将进一步完善报表统计口径和数据校验规则,减少人工核对工作。通过本项目实践,我认识到,面向服务的架构设计不能停留在服务拆分的形式上,更重要的是结合业务流程、接口标准和运行治理进行整体设计。只有合理划分服务边界,规范服务发布和调用方式,并持续完善服务治理机制,才能使系统长期稳定地支撑业务发展。