一场404引发的血案

173 阅读2分钟

血案背景

事情是这样的,公司近日在做灾备,以前用的某欧美国家提供的云产品,公司处于长远战略考虑,决定同步部署一套国产厂商提供的云产品,为了便于讲解说明,一下以消息队列为例来说明,欧美国家提供的产品统一叫做A公司,国产厂商提供的统一叫做B公司。

问题出现

在将对应灾备code完成之后,就准备测试,但是发现调用所有接口都404

排查思路

在发现上述问题的时候,首先想到了可能是灾备新加入的东西影响了加载流程,导致在服务启动的时候跳过了SpringMvc的控制器加载,从而请求进来才会找不到然后报404,于是就将新加的东西进行review,然后就发现了一个注解@EnableQueue,我们公司内部提供的queue-starter对两家公司的queue都做了封装,同时加了一个注解@EnableQueue,而在这个注解上面,加了一个@ComponentScan,里面的值填写的是cn.xxx.queue,目的是为了扫描队列starter里面指定的包,然后,我们公司引用队列starter的项目,包结构都采用的是cn.xxx.xx,而在引进starter的项目中,需要在启动类上面加上@EnableQueue,而由于启动类的@SpringBootApplication默认作用域是当前包及其子包cn.xxx.xx,和@EnableQueue中的作用域不一致,加之由于个人的操作习惯,因为这个注解的长度比较短,所以就放在了@SpringBootApplication的上方,而对应的启动类的package刚好位于cn.xxx.xx,这就导致了SpringBoot的加载顺序出了问题。(PS:这块的详细原因我也不太清楚,希望有大佬能指出给点意见)

解决思路

发现了这个问题之后,首先想到直接修改@EnableQueue@ComponentScan的作用域为cn.xxx,经过测试之后确实可以,但是后面又想到,试试改变@EnableQueue@SpringBootApplication的顺序,结果试了之后居然测试也可以(PS:这块的详细原因也不是很清楚),最终,因为毕竟不能去控制每个人加注解的位置,所以仍然采用的方案一,修改其作用域