如何直接用jsp做网站不写servlet,微信公众号小程序怎么开发,工业和信息化部官网,互联网创业项目app耦合问题
有些时候我们在进行接口调用的时候#xff0c;比如说一个push推送接口#xff0c;有可能会涉及到不同渠道的推送#xff0c;以我目前业务场景为例#xff0c;我做结算后端服务的#xff0c;会与金蝶财务系统进行交互#xff0c;那么我结算后端会涉及到多个结算…耦合问题
有些时候我们在进行接口调用的时候比如说一个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(当前类型暂未实现,请联系开发);}RBoolean 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推送方法 总结
这是我之前设计的关于接口统一调用的流程当然其实还是包括对接第三方重复调用的问题、调用结果缓存、调用超时解决、失败降级的一些策略如果还有更好的接口统一调用方式欢迎大家评论区留言讨论