Redian新闻
>
如何优雅地实现接口统一调用

如何优雅地实现接口统一调用

公众号新闻

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7276261829726191676


一、耦合问题

有些时候我们在进行接口调用的时候,比如说一个 push 推送接口,有可能会涉及到不同渠道的推送。以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算单类型,如果每一个种类型的结算单都去暴露一个 contoller 接口给前端提供,而且其实对接第三方的接口,有些接口是共通的。

前端涉及到的问题
  • 需要调用后端多个 controller,不同接口传不同的参数,如果遇到后端接口修改,会涉及到多个页面的修改,耦合度很高;
  • 需要对多个按钮设置权限配置。
后端涉及到的问题
  • 需要每个业务接口,都去写一个对接第三方接口的 push 推送方法,无形中增加很多重复的代码,耦合度也很高;
  • 如果涉及到第三方服务接口改造,后端接口也需要进行更改,会修改大量代码。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二、如何解决

  1. 创建对接第三方服务的微服务,暂定为 tps 服务,该服务只作为一个后端微服务,与第三方服务进行对接,并且合理封装调用参数,将公共参数提出进行封装;
  2. 后端其余业务系统对接这个独立的微服务,比如订单、结算、供应商系统对接这个服务,由 tps 服务统一提供对接接口,其余服务实现这个 tps 提供的 feign 接口;
  3. 业务系统只需要关注 service 层业务的实现,无需处理对接的业务逻辑。

大致的流程图就是这样的:

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

三、具体实现

Tps 服务

Tps 服务暴露为 feign 接口,前端统一通过 Tps 提供的接口进行调用。

//对接第三方服务接口
public interface IKingdeeManagementService {
    Boolean push(KingdeePushCO.Request request);
}

Feign 接口实现类:

@Slf4j
@Service
public class KingdeeManagementServiceImpl implements IKingdeeManagementService {

    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private KingdeeThirdSettingService kingdeeThirdSettingService;

    @Override
    public Boolean push(KingdeePushCO.Request request) {

        KingdeeBusinessPushServiceEnum kingdeePushServiceEnum = KingdeeBusinessPushServiceEnum.getKingdeePushServiceEnumByType(request.getBusinessType());

        IKingdeeBusinessPushService kingdeePushService = null;
        try {
            kingdeePushService = (IKingdeeBusinessPushService) applicationContext.getBean(kingdeePushServiceEnum.getClazz());
        } catch (BeansException e) {
            log.error("当前类型暂未实现,请联系开发");
            throw new ServiceException("当前类型暂未实现,请联系开发");
        }
            R<Boolean> result = null;
            result = kingdeePushService.pushKingdee(request);


        return true;
    }
}

枚举类定义:

public enum KingdeeBusinessPushServiceEnum {

    private Class clazz;

    private Integer type;

    private String interFaceName;

    KingdeeBusinessPushServiceEnum(Class clazz, Integer type, String interFaceName) {
        this.clazz = clazz;
        this.type = type;
        this.interFaceName = interFaceName;
    }
    RECEIPT_VOUCHER(IJaKingdeeBillClient.classKingdeeBusinessTypeConstant.RECEIPT_VOUCHERKingdeeSettingEnum.INTERFACE_TYPE_JA_RECEIPT_VOUCHER.getCode()), ;
}

分别有 clazz、type、interFaceName 属性,

  • clazz 定义为 feign 接口,业务系统提供的服务接口;
  • type 代表前端需要传的参数,不同的 Integer 值代表不同的 feign 接口映射;
  • interFaceName 第三方接口枚举,表示需要具体调用哪个第三方接口。
业务系统

拿 bms 服务举例说明:继承 Tps 服务的 feign 接口,重写 push 方法;

Feign 接口实现,通过 factory 工厂类初始化,不同的 service 实现类;

JaKingdeeFactoryUtil 工厂工具类,获取工厂实例,这里其实也可以使用枚举映射,避免以后接口太多,需要写很多 case when。

JaKingdeeServiceFactory 是个接口,提供方法:

实现上面的接口,通过单例工厂的模式 double check 的模式实现,并且加悲观锁,避免一个工作线程多次创建工厂实例,SpringContextUtils/getBean/ 获取 servcie 实例,业务层只需要实现 service 接口,实现不同业务逻辑的 push 推送方法。

四、总结

这是我之前设计的关于接口统一调用的流程,当然其实还是包括对接第三方重复调用的问题、调用结果缓存、调用超时解决、失败降级的一些策略,作为抛砖引玉。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
脑机接口迎新突破,马斯克宣布人类首次植入脑机接口芯片|亮马桥小纪严选四肢瘫痪患者3个月实现自主脑控喝水,国内脑机接口获突破性进展!什么是系统调用机制?结合Linux0.12源码图解五一调休再上热搜!被网友骂“放不起别放”,央媒怒斥不忍直视科普 | 脑机接口设备植入人体大脑,什么原理?前景如何?传微软OpenAI领投人形机器人;OpenAI一键调用GPTs功能上线;年度大模型评测榜单公布丨AIGC大事日报(古詩英譯)锦瑟 - 李商隐智能音频能力移动端落地实践「青年内地实习资助计划」:有电竞、APP设计等有趣行业,也有专业行业如戴德梁行、kmpg会计师事务所!隐忍20年,离婚时才懂得:优雅地愤怒,是女性的一种高级力量如何通过内网穿透实现外部网络对 SpringBoot 接口的 HTTP 监听和调试?微软亚研院新作:让大模型一口气调用数百万个API!这一代大学生已经知道如何做一个优雅的人台军将在金门本岛等地实弹射击?国台办回应!四肢瘫痪患者实现自主喝水!脑机接口技术重大突破→美股基本面 - 2024_01_23 * 晨报 * “一月效应”或再次应验!降息预期降温背景下美股马斯克的脑机接口,如何让盲人重见「光明」?OpenAI一键调用GPTs功能上线;Alphabet CEO皮查伊:Gemini Ultra AI模型将很快面世丨AIGC日报朝鲜表示北南永远无法实现统一,中方回应前端接口防止重复请求实现方案AI成功改写人类DNA:全球首个基因编辑器开源;浙江大学首次实现汉字书写脑机接口,“意念写字”成现实丨AIGC日报Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态(古詩英譯) 次北固山下 - 王湾开源“靓仔”头像生成器:纯前端本地实现、完全随机绘制——保证独一无二!清华官宣:首例无线微创脑机接口临床试验成功!实现自主喝水等脑控功能,手术后10天就出院!专家:有望比马斯克先“落地”视觉特征在语言空间中如何分布?武大、上海交大提出统一多模态自回归建模框架一锅、两锅都不够吃!很解馋的小玩意儿,还能把脾胃调一调显贵但不贵!玉石玛瑙翡翠和天然珍珠的优雅结合,既有国风玉石之美,又优雅百搭,69元起~【安全】双倍扣分又来了! 复活节假期全澳多地实施, 明天起严查这些行为微服务之间调用的异常应该如何处理?蚂蚁智能可观测 Mpilot Al 助手落地实践谷歌、阿里、字节、科大讯飞、月之暗面、智谱等大模型落地实践案例集结完毕|AICon 北京 2024 议程上线28、长篇家庭伦理小说《嫁接》第七章 非法打工(2)两轮游日本 - 我的所见,所闻和所想 回首大阪阑珊处,有位佳人,在水一方易点天下:从0到1精益创新-AIGC产品应用及商业化落地实践报告
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。