原系统架构分析:理解现有系统接口的组成与调用方式

做系统迁移,第一件事不是写代码,而是先把老系统的接口"扒干净"。我个人习惯先画一张接口全景图,把所有对外暴露的入口标出来。你想想看,如果连自己家里有几扇门都不清楚,怎么敢动墙?

咱们这一章的目标很直接:搞清原系统接口到底长什么样。包括它用了什么协议、数据怎么包装、调用方怎么连上来、有没有认证鉴权。把这些要素拆开看,迁移时才能做到"换内芯不换接口"。

接口的四个基本组成要素

我经手过的遗留系统,接口设计五花八门。但不管多乱,底层都离不开这四个东西:

  1. 传输协议 - HTTP/HTTPS、gRPC、Dubbo、AMQP 等等。决定了数据怎么"跑"到对方手里。
  2. 接口端点(Endpoint) - 也就是 URI 或队列名。比如 /api/v1/order/create ,或者 queue://trade.settle 。
  3. 数据格式与契约 - JSON、XML、Protobuf,以及对应的 Schema 或 IDL。迁移时最头疼的就是这个。
  4. 认证与鉴权 - 、JWT、OAuth2、或者是简单的 IP 白名单。我碰上过完全没有认证的系统,迁移时反而要补安全层。
一个小提醒: 不要只看代码里的接口定义。我曾经发现一个系统,代码里是 RESTful 风格,但实际生产环境通过 Nginx 把 POST 转成了 GET,参数塞到了 Header 里。所以一定要抓真实流量验证。

调用方式:同步?异步?混着来?

先别说迁移,你连调用模式都搞混,后面必然出事。我见过最典型的坑:开发说"我们全是同步调用",结果线上有个 MQ 消费者在后台悄悄跑。那迁移时就漏了。

常见调用方式有三大类:

类型 典型实现 超时处理 迁移注意点
同步请求-响应 REST / gRPC / Thrift 连接超时、读取超时 SDK 迁移必须保持相同的超时语义,否则上游会雪崩
异步回调 Webhook / 长轮询 回调超时、重试策略 新 SDK 必须保证回调地址和签名算法与原系统兼容
消息队列 Kafka / RabbitMQ / RocketMQ 消息 TTL、重试次数 主题命名、消息格式、序列化方式不能变

说白了,调用方式决定了你 SDK 的线程模型和阻塞策略。迁移时不光要模拟接口,还要模拟它的"行为特征"。

接口文档与契约:你的救命稻草

老系统有文档吗?有,但多半是过时的。我习惯先跑一次全链路抓包,然后用工具自动生成 OpenAPI 规范。举个例子,假设原系统有个创建订单的接口:

POST /api/order
Content-Type: application/json
Authorization: Bearer <>

{
  "userId": 12345,
  "items": [
    {"sku": "A001", "quantity": 2}
  ],
  "couponCode": "SAVE10"
}

返回:

HTTP/1.1 201 Created
{
  "orderId": "ORD20250321001",
  "totalAmount": 199.80,
  "status": "pending"
}

注意这里的 status 字段值 pending,不是 PENDING 也不是 0。这种细节很容易被忽略,但在迁移里一个字母大小写差异就能造成线上事故。

避坑指南: 我曾经因为接口返回字段名从 orderId 变成了 order_id,导致调用方 Java 对象反序列化失败。最后回溯发现是原系统在某个版本改过命名风格,但没通知下游。迁移时务必用 契约测试 锁死字段名和类型。

画出你的接口架构图

好了,上面分析了一堆要素。现在把它们放到一张图里,你就能看清全貌。下面这个 SVG 图展示了原系统接口的典型组成与调用关系。

原系统接口组成与调用方式关系图 原系统接口全景:组成要素与调用方式 传输协议 接口端点 数据格式 认证鉴权 同步 REST/gRPC/Thrift 异步回调 Webhook/长轮询 消息队列 Kafka/RabbitMQ 迁移关键点 ▶ 协议版本兼容:HTTP/1.1 vs HTTP/2,TLS 版本 ▶ 端点映射:新旧 URI 保持同一语义,避免破坏 RESTful 设计 ▶ 序列化兼容:字段名大小写、默认值、空值处理必须对齐 图:原系统接口四要素与三种调用方式的关系全景

归纳总结:一张接口清单就够了

分析到最后,你应该输出一张表格。我把自己的检查清单分享给你:

检查项 具体内容 常见风险
协议 HTTP、gRPC、Dubbo、MQ 协议 协议版本不匹配、TLS 证书过期
端点 URI 模板、队列名、Topic 名 迁移后路径改变导致 404
请求方法 GET/POST/PUT/DELETE 或 RPC 方法 误把 POST 改成 GET 导致幂等问题
请求头 Content-Type、Authorization、TraceId 缺少必要 Header 被网关拒绝
请求体 JSON 字段、Protobuf 字段、XML 命名空间 字段类型变化(int→string)反序列化异常
响应状态码 200、201、400、500 等 调用方硬编码状态码导致逻辑错误
错误格式 统一 errorCode + message 结构 新 SDK 错误字段名不同,调用方无法解析
认证方式 、JWT、OAuth2、IP 白名单 密钥不同、签名算法不一致
超时设置 连接超时、读取超时、总超时 超时太短导致重试风暴

我的经验之谈: 拿这张表去跟老系统实际跑一次全量回归测试。每个接口的请求和响应都抓下来,写成契约文件。后面迁移 SDK 时,只要用这个契约跑通过,99% 的问题都能提前发现。别忘了,遗留系统往往还有你不知道的"隐藏接口"——比如内部监控用的 /health,或者调试用的 /dump。把这些也列进来,迁移时才不会漏掉。