前言

前两天隔壁团队的一位开发人员说,我的一个接口在测试环境突然报错了。

整得我有点懵,这个接口很久都没有改过了,怎么会突然报错呢?我心想。

但只能硬着头皮查一下了。

到底怎么回事呢?

还原事故现场

我之前提供了一个公共的创建商品接口,隔壁组通过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包依赖的方式。

这样就能解决接口调用的问题,同时又能避免双向依赖的问题。

最后修改:2026 年 06 月 06 日
如果觉得我的文章对你有用,请随意赞赏