首先说一下:这个问题是feign和hystrix结合时的一个坑,也可以是这两者结合使用的一个bug;
问题描述:
在启动User-Consumer时,接口中的方法被重复注册了
启动User-Consumer时,具体的报错信息,如下图所示:
话不多说,上代码:
接口模块:User-API(需要对外发布的接口内容)
@RequestMapping("/user")
public interface UserAPI {
@RequestMapping("/alive")
public String alive();
}
User-Provider中实现User-API接口:
@RestController
public class UserController implements UserAPI{
@Value("${server.port}")
String port;
@Override
public String alive() {
//具体的业务逻辑
return "我是User-API接口模块中的alive接口,由user-provider模块实现!";
}
}
在User-Consumer中使用Feign做远程调用,并用Hystrix做服务的降级:
一、在配置文件中修改添加: feign.hystrix.enabled=true (开启 feign在做远程服务调用的时候 由hystrix进行包装;feign在做远程服务调用的时候,如果出错就会进入hystrix定义的回调方法)
二、定义一个接口实现,继承UserAPI接口类:
@FeignClient(name="user-provider", fallback = UserProviderBack.class)
public interface ConsumerApiForInterface extends UserAPI{
// 这里什么都不需要写
}
三、定义UserProviderBack.java类,并实现ConsumerApiForInterface 接口:
@Component
public class UserProviderBack implements ConsumerApiForInterface{
// 这里实现的是UserAPI接口中的方法
@Override
public String alive() {
return "服务降级了";
}
}
四、配置完成之后,启动User-Consumer,在启动时会发现这个模块启动不起来,而且会报文章开头提到的错误;
重点
经过查找原因,可以发现,这个错误并不是我们在写代码的时候由于逻辑或其他 我们自身的原因造成,是由于feign和hystrix结合使用时所出现的错误,这个错误在User-API中的接口里面:
我们保要稍加改动,便可正常运行,只需要将类中加的@RequestMapping("/user")去掉,将 @RequestMapping("/alive")改为: @RequestMapping("/user/alive")
再次启动User-Consumer,即可正常启动!
原因在于:feign和hystrix结合使用的时候,会在方法中的@RequestMapping("/alive")的路径中加上“/user”,此时就变成了@RequestMapping("/user/alive"),但是这个方法在User-Provider中已经被注册过了所以会报重复“There is already ‘XXXX’ bean method”的错误!
这是feign和hystrix结合使用时的一个坑,注意一下!