解决springboot或(SpirngCloud)AOP日志记录多次问题

是的,我又来了,来继续填同事留下的坑,本节说一下问题是这样的,我们的接口访问日志是用AOP环绕方式记录的,但是我们有网关么,有多个微服务被它路由,所以同事就把AOP放入到了网关里记录,然后每一次访问都记录了四次,但是啊但是这个项目半年过去了,我不相信是没发现哈,愣是没改,所以修改这个问题在现在分配到我身上了,硬着头皮想招把。

首先咱们来想它是放入到了SpringCloud里了,那么我接口访问的是网关,但是网关路由到我其它的微服务(也就是转发到其他微服务访问接口了)上你觉得AOP能监听到这个接口么?并且以下图片是他在SpringCloud的微服务里配置的匹配所有接口方式,你一定思考一下,到底AOP会不会执行方法。

答案是不会的,AOP不会监测到的,那你一定会说那前面你说记录了四次是怎么回事?其实是这样的,我们这个之所以能记录到是因为SpringCloud加了ZuulFilter拦截器,能进入到AOP方法都是因为加了拦截器的原因,那么为什么他配置的是所有接口还记录不了呢?  是因为它匹配所有的接口也只是匹配SpringCloud当前微服务的方法啊,肯定是不能匹配其他微服务的接口啊

那么既然是拦截器我就查看为什么多访问了3次,进入拦截器方法打断点,发现走到这里的时候就去走了aop(其实这里就多记录了一次),为什么?为什么?终于想出来了,走到这里他就调用其他方法了,然后在第一个图,他配置的是访问所有的接口哦,不是只监测controller,说明调用service他也会进入AOP了,大家伙们配置的时候要注意,这里一定不要这样匹配。正常应该这样匹配  @Pointcut("execution(public * gsa.*.*.controller..*.*(..))")

 
 

那么既然是调用service的问题,那我屏蔽掉这个Service类把!

好,在测试一下发现可以了,但是走到这里又是这样,又被记录了一次,不能忍了,既然这样就把SpringCloud里不需要的都屏蔽掉把(图二),

终于世界清净了,只记录一次了

@Pointcut("execution(public * gsa.*.*.*..*.*(..)) && " +
            " ! execution(public * gsa.geographic.gateway.service.GsaMartUserServiceImpl.checkToken(..))  && " +
            " ! execution(public * gsa.geographic.gateway.util..*(..)) " +
            " ! execution(public * gsa.geographic.gateway.entity..*(..))" +
            " ! execution(public * gsa.geographic.gateway.config..*(..))" +
            " ! execution(public * gsa.geographic.gateway.model..*(..))")

其实AOP记录多次的问题,应该多打断点走走看看是到哪一步多走了,或者是不是aop匹配的问题出错了,然后对症下药。

以上就是这些内容!希望对你有帮助

猜你喜欢

转载自blog.csdn.net/dfBeautifulLive/article/details/105730836