如何优雅的实现接口统一调用
耦合问题
有些时候我们在进行接口调用的时候,比如说一个push推送接口,有可能会涉及到不同渠道的推送,以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算单类型,如果每一个种类型的结算单都去暴露一个contoller接口给前端提供,而且其实对接第三方的接口,有些接口是共通的;
前端涉及到的问题
- 需要调用后端多个controller,不同接口不同的传参数,如果遇到后端接口修改,会涉及到多个页面的修改,耦合度很高;
- 需要对多个按钮设置权限配置;
后端涉及到的问题
- 需要每个业务接口,都去写一个对接第三方接口的push推送方法,无形中增加很多重复的代码,耦合度也很高;
- 如果涉及到第三方服务接口改造,后端接口也需要进行更改,会修改大量代码;
如何解决
- 创建对接第三方服务的微服务,站定为tps服务,该服务只作为一个后端微服务,与第三方服务进行对接,并且合理封装调用参数,将公共参数提出进行封装;
- 后端其余业务系统对接这个独立的微服务,比如订单、结算、供应商系统对接这个服务,由tps服务统一提供对接接口,其余服务实现这个tps提供的feign接口;
- 业务系统只需要关注service层业务的实现,无需处理对接的业务逻辑;
大致的流程图就是这样的
具体实现
Tps服务
Tps服务暴露feign接口,前端统一通过Tps提供的接口进行调用
//对接第三方服务接口
public interface IKingdeeManagementService {Boolean push(KingdeePushCO.Request request);
}
Feign接口实现类
@Slf4j
@Service
public class KingdeeManagementServiceImpl implements IKingdeeManagementService {@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate KingdeeThirdSettingService kingdeeThirdSettingService;@Overridepublic 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.class,KingdeeBusinessTypeConstant.RECEIPT_VOUCHER, KingdeeSettingEnum.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推送方法;

总结
这是我之前设计的关于接口统一调用的流程,当然其实还是包括对接第三方重复调用的问题、调用结果缓存、调用超时解决、失败降级的一些策略,如果还有更好的接口统一调用方式欢迎大家评论区留言讨论;
相关文章:
如何优雅的实现接口统一调用
耦合问题 有些时候我们在进行接口调用的时候,比如说一个push推送接口,有可能会涉及到不同渠道的推送,以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算…...
tomcat、nginx实现四层转发+七层代理+动静分离实验
实验环境: nginx1——20.0.0.11——客户端 静态页面: nginx2——20.0.0.21——代理服务器1 nginx3——20.0.0.31——代理服务器2 动态页面: tomcat1——20.0.0.12——后端服务器1 tomcat2——20.0.0.22——后端服务器2 实验步骤&…...
交通目标检测-行人车辆检测流量计数 - 计算机竞赛
文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…...
Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】
Java Excel转PDF itextpdf,即取即用 工具方法一、使用方式1、本地转换2、网络下载 二、pom依赖引入三、工具方法三、引文 本篇主要为工具方法整理,参考学习其他博主文章做了整理,方便使用。 工具方法 一、使用方式 1、本地转换 导入依赖创…...
重生奇迹mu宠物带来不一样的体验
重生奇迹mu宠物有什么作用? 全新版本中更是推出了各种宠物,在玩游戏时还可以带着宠物,一起疯狂的刷怪等等,可以为玩家带来非常不错的游戏体验,那么下面就来给大家说说各种宠物适合做什么事情。 1、强化恶魔适合刷怪 …...
【C++笔记】多态的原理、单继承和多继承关系的虚函数表、 override 和 final、抽象类、重载、覆盖(重写)、隐藏(重定义)的对比
1.final关键字 引出:设计一个不能被继承的类。有如下方法: class A { private:A(int a0):_a(a){} public:static A CreateOBj(int a0){return A(a);} protected:int _a; } //简介限制,子类构成函数无法调用父类构造函数初始化 //子类的构造…...
安装thinkphp6并使用多应用模式,解决提示路由不存在解决办法
1. 安装稳定版tp框架 composer create-project topthink/think tptp是安装完成的目录名称 ,可以根据自己需要修改。 如果你之前已经安装过,那么切换到你的应用根目录下面,然后执行下面的命令进行更新: composer update topthin…...
FPGA笔试
1、FPGA结构一般分为三部分:可编程逻辑块(CLB)、可编程I/O模块和可编程内部连线。 2 CPLD的内部连线为连续式布线互连结构,任意一对输入、输出端之间的延时是固定 ;FPGA的内部连线为分段式布线互连结构,各…...
Pytorch:cat、stack、squeeze、unsqueeze的用法
Pytorch:cat、stack、squeeze、unsqueeze的用法 torch.cat 在指定原有维度上链接传入的张量,所有传入的张量都必须是相同形状 torch.cat(tensors, dim0, *, outNone) → Tensor tensor:相同形状的tensor dim:链接张量的维度,不能超过传入张…...
聊聊HttpClient的RedirectStrategy
序 本文主要研究一下HttpClient的RedirectStrategy RedirectStrategy org/apache/http/client/RedirectStrategy.java public interface RedirectStrategy {/*** Determines if a request should be redirected to a new location* given the response from the target ser…...
【1day】复现宏景OA KhFieldTree接口 SQL注入漏洞
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、资产测绘 三、漏洞复现 四、漏洞修复 一、漏洞描述 宏景OA是一款基于...
同为科技TOWE智能PDU引领数据中心机房远控用电安全高效
随着数据中心的环境变得更加动态和复杂,许多数据中心都在对数据中心管理人员施加压力,要求提高可用性,同时降低成本,提升效率。新一代高密度服务器和网络设备的投入使用,增加了对更高密度机架的需求,并对整…...
支付成功后给指定人员发送微信公众号消息
支付成功后给指定人员(导购)发送微信公众号消息 微信openid已录入数据库表 调用后台接口发送消息接口调用代码如下: //----add by grj 20231017 start //订单支付成功发送微信公众号消息$.ajax({url:http://www.menggu100.com:7077/strutsJsp…...
漏洞复现--安恒明御安全网关文件上传
免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...
简单的对称加密
异或 异或算法的好处便是数A和数B异或后,把结果再和数A异或便可得到B,或者和数B异或可重新得到数据A。利用异或的这个特性可简单实现数据的加密和解密算法。 恺撒密码 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明…...
vue源码笔记之——响应系统
vue是一种声明式范式编程,使用vue者只需要告诉其想要什么结果,无需关心具体实现(vue内部做了,底层是利用命令式范式) 1. reactive为什么只能操作对象,对于基本数据类型,需要用ref? …...
Android Studio Giraffe | 2022.3.1
Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件 (AGP) 添加了几项专用于构建 Android 应用的功能。下表列出了各个 Android Studio 版本所需的 AGP 版本。 如果您的项目不受某个特定版本的 Andr…...
Spring Boot 3.0 已经就绪,您准备好了么?
Java 微服务开发框架王者 Spring 2014 年的 4 月,Spring Boot 1.0.0 正式发布。距离 1.0 版本的发布已经过去了 9 年多的时间,如今 Spring Boot 已经被 Java 开发者广泛使用,正如 JRebel 的 2022 年开发者生产力报告中提到的那样,…...
5+非肿瘤分析,分型+WGCNA+机器学习筛选相关基因
今天给同学们分享一篇非肿瘤分型机器学习WGCNA实验的生信文章“Identification of diagnostic markers related to oxidative stress and inflammatory response in diabetic kidney disease by machine learning algorithms: Evidence from human transcriptomic data and mou…...
算法课作业2 OJ for Divide and Conquer
https://vjudge.net/contest/581947 A - Ultra-QuickSort 题意 每次给n个无序的数,互不重复,问最少需要多少次必要的交换操作使n个数有序。 思路 看一眼想到逆序数,然后验证了逆序数的个数符合样例,但想了一个3 2 1的话实际上…...
死信队列与补偿作业
Skeyevss FAQ:死信队列与补偿作业 试用安装包下载 | SMS | 在线演示 项目地址:https://github.com/openskeye/go-vss 1. 什么是死信(DLQ) 消息在 最大重试次数 后仍失败,进入 死信队列 或 失败表,避免无…...
如何让老旧游戏手柄重获新生:XOutput输入转换器完整指南
如何让老旧游戏手柄重获新生:XOutput输入转换器完整指南 【免费下载链接】XOutput DirectInput to XInput wrapper 项目地址: https://gitcode.com/gh_mirrors/xo/XOutput 你是否拥有一些老旧但质量优秀的游戏手柄、摇杆或方向盘,却发现在现代游戏…...
别再复制粘贴了!保姆级教程:在CentOS 7上用三台虚拟机搞定Hadoop 3.1.3完全分布式集群
从零构建Hadoop 3.1.3完全分布式集群:原理剖析与避坑实战 当你在搜索引擎里输入"Hadoop完全分布式安装"时,是否曾被各种教程中机械复制的命令列表搞得一头雾水?作为曾经同样困惑的实践者,我深刻理解新手面对那些看似简单…...
Sourcetree新手指南:从零配置到高效版本控制
1. Sourcetree入门:为什么选择图形化Git工具 第一次接触版本控制时,我对着黑漆漆的命令行窗口敲git命令的手都在发抖。直到发现了Sourcetree这个神器,才真正体会到什么叫"可视化操作"。作为Atlassian公司出品的免费工具࿰…...
告别网络限制!手把手教你离线安装ModHeader插件(附最新4.3.8版本下载)
开发者必备:ModHeader插件安全离线安装全指南 对于经常需要调试API接口的开发者来说,能够自由修改HTTP请求头是刚需。ModHeader作为Chrome浏览器上最受欢迎的请求头管理工具之一,却因为网络访问限制让不少国内开发者望而却步。本文将为你彻底…...
别再死记硬背了!用LabVIEW玩转模拟输出,从单点控制到连续波形生成的保姆级避坑指南
别再死记硬背了!用LabVIEW玩转模拟输出,从单点控制到连续波形生成的保姆级避坑指南 在工业自动化和测试测量领域,LabVIEW作为图形化编程的标杆工具,其模拟输出功能是数据采集系统的核心模块。许多初学者面对"单点生成"、…...
Kafka基础篇
Kafaka安装和使用以及整和一、 安装(docker)1)创建docker-compose.yml文件2)测试二、 kafaka基础知识1)kafaka核心架构2) 工作流程三、Spring Boot 整合Kafka1. 导入依赖 ,配置yml文件2. API讲解2.1&#x…...
Day33-1: Serilog(日志中间件)VS OperLogHelper(操作日志帮助类)
一、一句话分清它们的作用 1. Serilog(日志中间件) 作用:记录系统运行日志 → 给程序员看的 控制台打印文件保存报错、异常、请求信息用于排查问题、调试、监控 2. OperLogHelper(操作日志帮助类) 作用࿱…...
《字节码到JVM:Java基础核心知识点全解析(小林八股·上)》
🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...
别再让电机‘刹不住车’:用ADRC的TD模块实现位置精准无超调控制(附STM32代码)
电机控制中的精准停车艺术:ADRC-TD模块实战解析与STM32实现 引言 在机器人关节控制、无人机云台稳定、CNC机床定位等场景中,工程师们经常面临一个看似简单却极具挑战的问题——如何让电机在到达目标位置时完美停下,不产生丝毫超调?…...
