@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FeignClient(name = "${api.b-gateway}", contextId = "api.b-gateway", configuration = BFeignConfiguration.class)
public @interface BGatewayClient {
String path() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@FeignClient(name = "${api.b-gateway}", contextId = "api.b-gateway", configuration = BRetailerConfiguration.class)
public @interface BRetailerGatewayClient {
String path() default "";
}
在另外一个服务调用BRetailerGatewayClient接口时,执行的配置类却是BFeignConfiguration类而不是BRetailerConfiguration
问题背景
A服务在调用B服务时需要经过intergeation网关服务进行转发,在转发的过程中,将信息的header模板通过feign调用中的configuration来进行配置。因为本次需求调用B侧的接口需要接入和之前不一样的token,所以不能复用之前的配置类。故新建了不同的注解和配置类。但是发生了这样的问题:在本地调用时没有任何问题,调用了新的feignClinet并执行了新配置类中的方法,取到新token值。但是在测试环境,却执行旧的feignClient取到原配置类的token
问题分析
- 可能是因为测试环境缓存导致取不到最新的配置token,清空缓存后执行,仍然错误
- 可能是因为Jenkins在构建的时候工作空间没有将最新的sdk打包,但是经过排查,工作空间中的jar包均为最新
- 可能是因为FeignClient配置中有冲突的地方。经过排查,锁定contextId一致导致的问题
问题解决
经过分析,认为是在FeignClient注解配置中的contextId一致导致执行出错。修改了contextId后在测试环境中成功执行新的配置类获取新的token值。
问题总结
在调用Client接口的时候,Feign会根据@EnableFeignClients注解中basePackages或basePackageClasses属性所指定的包路径或类路径,扫描所有FeignClient注解所标注的接口。而在扫描时会存在多个注解所标注的接口都指向同一个服务的情况。此时Feign通过name属性来指定具体的服务名称,并通过contextId属性来区分同一个服务下不同类型的FeignClient。因此,需要为不同的FeignClient指定不同的contextId来避免混淆。