当前位置: 欣欣网 > 码农

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

2024-04-22码农

推荐关注

扫码关注 后端架构师 」,选择 星标 公众号

重磅干货,第一时间送达!

责编:架构君 | 来源:juejin.cn/post/7276261829726191676

上一篇好文:

正文

大家好,我是后端架构师。

一、耦合问题


有些时候我们在进行接口调用的时候,比如说一个 push 推送接口,有可能会涉及到不同渠道的推送。


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

前端涉及到的问题

  • 需要调用后端多个 controller,不同接口传不同的参数,如果遇到后端接口修改,会涉及到多个页面的修改, 耦合度 很高;

  • 需要对多个按钮设置权限配置。

  • 后端涉及到的问题

  • 需要每个业务接口,都去写一个对接第三方接口的 push 推送方法,无形中增加很多重复的代码,耦合度也很高;

  • 如果涉及到第三方服务接口改造,后端接口也需要进行更改,会修改大量代码。


  • 二、如何解决

  • 创建对接第三方服务的微服务,暂定为 tps 服务,该服务只作为一个后端微服务,与第三方服务进行对接,并且合理封装调用参数,将公共参数提出进行封装;

  • 后端其余业务系统对接这个独立的微服务,比如订单、结算、供应商系统对接这个服务,由 tps 服务统一提供对接接口,其余服务实现这个 tps 提供的 feign 接口;

  • 业务系统只需要关注 service 层业务的实现,无需处理对接的业务逻辑。

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



    三、具体实现

    Tps 服务

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

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

    Feign 接口实现类:

    @Slf4j
    @Service
    public classKingdeeManagementServiceImplimplementsIKingdeeManagementService{
    @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("当前类型暂未实现,请联系开发");
    thrownew ServiceException("当前类型暂未实现,请联系开发");
    }
    R<Boolean> result = null;
    result = kingdeePushService.pushKingdee(request);

    returntrue;
    }
    }



    枚举类定义:

    publicenum 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、interFace Name 属性

  • clazz 定义为 feign 接口,业务系统提供的服务接口;

  • type 代表前端需要传的参数,不同的 Integer 值代表不同的 feign 接口映射;

  • interFaceName 第三方接口枚举,表示需要具体调用哪个第三方接口。

  • 业务系统

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

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

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

    JaKingdeeServiceFactory 是个接口,提供方法:

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


    四、总结


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

    你还有什么想要补充的吗?

    最后,再次推荐下我们的AI星

    为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:ChartGPT与副业。想带着大家一起探索 ChatGPT和新的AI时代

    有很多小伙伴搞不定ChatGPT账号,于是我们决定,凡是这三天之内加入ChatPGT的小伙伴,我们直接送一个正常可用的永久ChatGPT独立账户。

    不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了 8个专栏、18个副业项目

    简单说下这个星球能给大家提供什么:

    1、不断分享如何使用ChatGPT来完成各种任务,让你更高效地使用ChatGPT,以及副业思考、变现思路、创业案例、落地案例分享。

    2、分享ChatGPT的使用方法、最新资讯、商业价值。

    3、探讨未来关于ChatGPT的机遇,共同成长。

    4、帮助大家解决ChatGPT遇到的问题。

    5、 提供一整年的售后服务,一起搞副业

    星球福利:

    1、加入星球4天后,就送ChatGPT独立账号。

    2、邀请你加入ChatGPT会员交流群。

    3、赠送一份完整的ChatGPT手册和66个ChatGPT副业赚钱手册。

    其它福利还在筹划中... 不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !

    本星球第一期原价 399 ,目前属于试运营,早鸟价 139 ,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以 更高价格加入了 。。

    早就是优势。 建议大家尽早以便宜的价格加入!

    欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️

    在 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!

    PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。

    最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:「面试」获取。

    版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

    END

    最近面试BAT,整理一份面试资料【Java面试BAT通关手册】,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。

    别找了,想获取史上最全的Java大厂面试题学习资料

    扫下方二维码回复面试就好了

    历史好文:

    扫码关注后端架构师」,选择星标公众号

    重磅干货,第一时间送达

    ,你在看吗?