1. 立项背景和目标
公司同时使用云之家 OA(审批工作流)和纷享销客 CRM(客户/业务对象)两套系统,审批环节产生的业务数据(如订单审批、出差申请、报销流程等)需要回写到纷享销客对应的业务对象,原生云之家无法直接对接纷享销客的 OpenAPI,且双方系统在数据格式、鉴权方式、加密机制上完全不同(云之家采用 AES/ECB/PKCS5Padding 加密推送,纷享销客采用 OAuth2.0 + Bearer Token 鉴权)。本项目(mlxcl-middle)作为云之家与纷享销客之间的轻量级中间服务,承接云之家审批推送、解密、解析、调用纷享 OpenAPI 回写等完整链路,实现审批数据从 OA 到 CRM 的自动化流转。
2. 软件功能、核心功能模块介绍
服务基于 Spring Boot 3.3.5 构建,按职责划分为四大模块:
云之家推送接入(POST /middle/yunzhijia/testapi):负责接收云之家 CloudFlow 推送的加密数据,使用 cloudflow-key(16 字节 AES 密钥)进行 AES/ECB/PKCS5Padding 解密,还原成明文 JSON 后进入业务处理链路;解密失败立即返回 error 避免阻塞云之家重试。
纷享销客 API 代理(POST /middle/fxiaoke/testapi):作为纷享销客 OpenAPI 的统一入口,对外屏蔽鉴权细节,接收 dataObjectApiName + objectDataId 后自动识别预制对象(如 PersonnelObj)和自定义对象(ApiName 以 __c 结尾),分别路由到 /cgi/crm/v2/data/get 或 /cgi/crm/custom/v2/data/get 接口查询详情,并自动注入 x-fs-userid、x-fs-ea 等业务 Header。
通用数据处理中台(POST /api/process):以 bizType 为路由键的策略模式分发器(TYPE_A / TYPE_B / Default),便于后续按业务类型扩展新的对接流程,无需改动主流程。
基础设施:统一响应封装 ApiResult(code/message/data)、@Valid + @NotBlank 参数校验、Spring Boot Actuator 健康检查(/actuator/health)、/api/health 业务探活、WebMvcConfig 跨域配置。
3. 业务流程、功能路径描述
云之家→纷享审批数据流转(核心链路):云之家工作流节点触发推送 → 调用 POST /middle/yunzhijia/testapi 传入加密报文 → 服务 AES 解密得到明文 → 落库/记录 → 立即返回 success 释放连接 → @Asy
1. 整体架构和设计思路,不同模块使用的技术栈
整体架构:采用经典 三层架构 + 异步解耦 的轻量中间服务设计。Controller 层负责协议适配和加解密;Service 层封装业务逻辑(FXiaokeApiService + FXiaokeTokenService + YunZhiJiaService + YunZhiJiaAsyncProcessor);Config + Util 层负责配置注入与工具能力。云之家推送链路采用同步接收 + 异步处理模式(@EnableAsync + @Async),保证 OA 侧 3 秒内拿到响应,避免触发云之家重试风暴。
技术栈:
运行时:Java 21 + Spring Boot 3.3.5
Web:spring-boot-starter-web(内嵌 Tomcat,监听 43686 端口)
能力:spring-boot-starter-validation、spring-boot-starter-actuator、spring-boot-starter-async
JSON:Fastjson2 2.0.53(性能优于 Jackson,纷享 API 报文高频解析)
工具库:Hutool 5.8.34(简化集合/日期/字符串处理)
HTTP 客户端:RestTemplate(封装于 RestTemplateConfig)
加解密:JDK 自带 javax.crypto(AES/ECB/PKCS5Padding)
简化代码:Lombok(@Data / @Slf4j / @RequiredArgsConstructor)
2. “我” 的负责模块和结果(尽可能量化)
我独立完成该中间服务从需求拆解、架构设计到编码落地的全部工作,核心成果:
21 个 Java 类文件,按职责拆为 3 个 Controller、5 个 Service、3 个 Config、1 个 Util、4 个 DTO/Model,分层清晰。
6+ 个核心 REST 端点(云之家推送、纷享对象查询、通用数据处理、健康检查等),覆盖云之家→纷享、纷享→上游两个方向的数据交互。
Token 缓存双层机制:内存级缓存(ReentrantLock + 双重检查锁 DCL)+ 提前 600 秒 主动刷新策略,将高频调用场景下 /oauth2.0/token 的实际请求量降低到原来的 1/12 以下(Token 默认有效期 7200s)。
对象路由自适应:单接口同时支持纷享预制对象与自定义对象,根据 dataObjectApiName 是否以 __c 结尾自动选择 /cgi/crm/v2/data/* 或 /cgi/crm/custom/v2/data/*。
双鉴权模式兼容:既支持 accessToken 注入 Body 的传统接口,也支持 Authoriza