一、问题描述
需求背景: 有时候我们在一个微服务,需要对外提供多个
Feign
以供其他微服务远程调用
需求如下图:
常规的方法新建 Feign
、然后运行服务这种方式是无法满足上面的需求的,因为就算创建了多个 Feign
,服务启动以后也只有一个能使用,如果尝试调用其他Feign接口,就会报错,提示无法找到可用会微服务,报错如下:
那么出现这种情况的时候,应该如何解决呢?
二、解决办法
applicant.yml
配置:
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<Map<String, Object>> userBlogInfo(@PathVariable("userId") String userId);
}
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);
}
- 具体方法实现
上面只是定义了两个接口而已,还没有实现具体的方法,接下来请看如何实现:
IFeignColumnController.java
接口的实现
@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);
}
}
IFeignArticleController.java
接口的实现
@Api(value = "Feign-被远程调用的文章微服务接口",tags = "Feign-被远程调用的文章微服务接口")
@RestController
public class FeignArticleController implements IFeignArticleController {
private final ILabelService labelService;
private final IArticleService articleService;
public FeignArticleController(ILabelService labelService, IArticleService articleService) {this.labelService = labelService;
this.articleService = articleService;
}
@Override
public List<Map<String, Object>> userBlogInfo(String userId) {
return articleService.userBlogInfo(userId);
}
}
经过上面的配置,就可以满足 一个微服务提供多个Feign接口
这个需求