前言
前两天隔壁团队的一位开发人员说,我的一个接口在测试环境突然报错了。
整得我有点懵,这个接口很久都没有改过了,怎么会突然报错呢?我心想。
但只能硬着头皮查一下了。
到底怎么回事呢?
还原事故现场
我之前提供了一个公共的创建商品接口,隔壁组通过fegin调用该接口时,报错了。
那位同事,给我发了一个trace_id。
根据该trace_id,我很快到grafana上查到了相关的错误日志。
原因是在SDK中有一个NscfAOP(敏感词校验的拦截器),调用中台的接口校验敏感词时报了400异常。
这个NscfAOP敏感词拦截器,比我Spring MVC的接口方法先执行。
出现这个问题时,根本还没调用我的创建商品接口。
分析原因
调用接口时出现4开头的异常,一般是客户端的问题,比如请求的url不对,请求方式不对,或者请求参数的格式不对等等。
这个NscfAOP是通过FeginClient调用中台的校验敏感词接口,一眼看起来好像没得什么问题。
但仔细看fegin接口的路径,在SDK自己的工程中,根本不是调用的中台接口的fegin接口。
有位同事在SDK中,自己定义了一个校验敏感词信息的fegin接口。
为什么要这样设计呢?
为什么要在SDK中自己定义fegin接口,而不是直接使用中台的fegin接口呢?
我简单思考了一下。
猜测原因可能是这样的:
SDK中包含了项目中公共的类和jar包,在业务项目中会引入相关的jar包,就能使用它提供的很多功能了。
业务项目依赖于SDK。
如果SDK中再引用中台项目的fegin接口,不就变成了SDK又依赖于业务项目,变成了双向依赖了吗?
为了解决双向依赖,所有在SDK中自己定义fegin接口。
既然NscfAOP调用该fegin接口报了400,说明该fegin接口的实现类有问题。
果然,在中台项目中,已经找不到该fegin接口的实现类了。
也就是,在NscfAOP中通过FeginClient调用敏感词校验接口调了个寂寞。
但我记得这个功能之前一直都是OK的。
怎么会接口都没了?
原因中台组的一个同事把敏感词校验接口,迁移到了另外一个tech-api项目中了。
由于他当时并不知道,在SDK中还自定义了一个敏感词校验的fegin接口,因此,他当时没有改到这里,导致了现在的问题。
如何解决问题
知道了原因,想要解决这个问题就变成非常简单了。
将NscfAOP中调用的那个fegin接口,改成调用tech-api中提供的fegin接口,不直接使用自己定义的fegin接口。
但是这样做其实也有一些隐患:变成双向依赖了,tech-api依赖于SDK,SDK又依赖于tech-api。
那么如何解决这个问题呢?
其实我们可以直接在SDK中使用RestTemplate通过url直接调用,tech-api的敏感词校验接口,不走jar包依赖的方式。
这样就能解决接口调用的问题,同时又能避免双向依赖的问题。