一、问题描述

需求背景: 有时候我们在一个微服务,需要对外提供多个 Feign以供其他微服务远程调用

需求如下图:
image.png

常规的方法新建 Feign、然后运行服务这种方式是无法满足上面的需求的,因为就算创建了多个 Feign,服务启动以后也只有一个能使用,如果尝试调用其他Feign接口,就会报错,提示无法找到可用会微服务,报错如下:

image.png
那么出现这种情况的时候,应该如何解决呢?

二、解决办法

  1. applicant.yml 配置:
spring:
  application:
    main:
       allow-bean-definition-overriding: true  ##允许统一微服务多个远程调用接口
  1. 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);
}
  1. 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);
}
  1. 具体方法实现
    上面只是定义了两个接口而已,还没有实现具体的方法,接下来请看如何实现:

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接口 这个需求

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐