问题描述
需求背景:有时候我们在一个微服务,需要对外提供多个Feign以供其他微服务远程调用
需求如下:
常规的方法新建Feign、然后运行服务这种方式是无法满足上面的需求的,因为就算创建了多个Feign,服务启动以后也只有一个能使用,如果尝试调用其他Feign接口,就会报错,提示无法找到可用会微服务,报错如下:
那么出现这种情况的时候,应该如何解决呢?
解决办法
spring:
application:
main:
allow-bean-definition-overriding: true ##允许统一微服务多个远程调用接口
IFeignArticleController.java配置(第一个Feign文件):
// name 远程调用微服务名字; contextId: 一个微服务提供多个Feign接口时使用这个区别(相当于远程接口的id); path : 请求路径
@Component
@FeignClient(name = 'article-server',contextId = 'article-server',path = '/article')
public interface IFeignArticleController {
@ApiOperation('根据用户名获取用户的博客数据')
@GetMapping('/api/feign/userBlogInfo/{userId}')
List
IFeignColumnController.java配置(第二个Feign文件):
//警告: 在同一个微服务里面,无论有多少个Feign文件,@FeignClient注解里面的name、path两个属性的必须保持一致,contextId 不能重复,否则其他微服务调用的时候必然会出现问题
@Component
@FeignClient(name = 'article-server',contextId = 'column-server', path = '/article')
public interface IFeignColumnController {
@ApiOperation('根据分栏id查询分栏详情')
@GetMapping('api/feign/column/{columnId}')
Column view(@PathVariable('columnId') String columnId);
}
具体方法实现上面只是定义了两个接口而已,还没有实现具体的方法,接下来请看如何实现:
@Api(value = 'Feign-被远程调用的分栏微服务接口', tags = 'Feign-被远程调用的分栏微服务接口')
@RestController
public class FeignColumnController implements IFeignColumnController {
private final IColumnService columnService;
public FeignColumnController(IColumnService columnService) {
this.columnService = columnService;
}
@Override
public Column view(String columnId) {
return columnService.getById(columnId);
}
}
经过上面的配置,就可以满足一个微服务提供多个Feign接口这个需求
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点