SpringCloud服务之间的调用都是通过Feign 完成、怎么用,网上一大把教程。导入依赖,启动类添加注解。新增Client类并把@FeignClient注上去。那么问题来了,这个类应该放哪里。假如现在有B,A服务。B需要调用A。我的做法是将要生成的AClient类放置在A工程。
AccApi:
AcctClient:
例如这样。但启动项目会报错:Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.jjm.acct.AcctClient' method
原因很简单,注入了两个一样的Bean。因为AcctApi有两个实现、AcctClient和实际的业务控制层。
解决方法:
在AcctApi加@RequestMapping区分开业务控制层
value里的值唯一就行。然后启动A服务。正常,启动B服务,调用也正常。但我预想的是B调用应该会路径错误,调用失败。因为同样的注解。子类的优先级会更高,然后再网上搜了半天没有什么结果。只好自己调试Feign源码看是怎么拼接路径。发现Feign是在BaseContract.parseAndValidateMetadata方法去解析注解。并且解析的父接口。一下明白了、弄了半天。值了
此文仅在记录。可能有更好的解决方案。