microblog | 微博客
原创
访问
0
获赞
0
评论
相关推荐
暂无数据
最新文章
暂无数据
热门文章
暂无数据

springcloud一个微服务提供多个Feign远程调用接口给其他微服务调用

写完bug就找女朋友 2022年02月18日 00:49:31 761 640 1
分类专栏: SpringCloud SpringBoot Java 文章标签: Feign远程调用 微服务远程调用

一、问题描述

需求背景: 有时候我们在一个微服务,需要对外提供多个 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接口 这个需求



评论区

登录后参与交流、获取后续更新提醒

写完bug就找女朋友
作者
2024年02月01日 16:54:36
评论一下捏
目录
暂无数据