Spring Cloud中关于Feign的常见问题总结

发布时间 - 2026-01-10 23:19:32    点击率:

一、FeignClient接口,不能使用@GettingMapping 之类的组合注解

代码示例:

@FeignClient("microservice-provider-user")
public interface UserFeignClient {
 @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
 public User findById(@PathVariable("id") Long id);
 ...
}

这边的@RequestMapping(value = "/simple/{id}", method = RequestMethod.GET) 不能写成@GetMapping("/simple/{id}")

二、FeignClient接口中,如果使用到@PathVariable ,必须指定其value

代码示例:

@FeignClient("microservice-provider-user")
public interface UserFeignClient {
 @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
 public User findById(@PathVariable("id") Long id);
 ...
}

这边的@PathVariable("id") 中的”id”,不能省略,必须指定。

三、FeignClient多参数的构造

如果想要请求microservice-provider-user 服务,并且参数有多个例如:http://microservice-provider-user/query-by?id=1&username=张三 要怎么办呢?

直接使用复杂对象:

@FeignClient("microservice-provider-user")
public interface UserFeignClient {
 @RequestMapping(value = "/query-by", method = RequestMethod.GET)
 public User queryBy(User user);
 ...
}

该请求不会成功,只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求。

正确的写法:

写法1:

@FeignClient("microservice-provider-user")
public interface UserFeignClient {
 @RequestMapping(value = "/query-by", method = RequestMethod.GET)
 public User queryBy(@RequestParam("id")Long id, @RequestParam("username")String username);
}

写法2:

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
 @RequestMapping(value = "/query-by", method = RequestMethod.GET)
 public List<User> queryBy(@RequestParam Map<String, Object> param);
}

四、Feign如果想要使用Hystrix Stream,需要做一些额外操作

我们知道Feign本身就是支持Hystrix的,可以直接使用@FeignClient(value = "microservice-provider-user", fallback = XXX.class) 来指定fallback的类,这个fallback类集成@FeignClient所标注的接口即可。

但是假设我们需要使用Hystrix Stream进行监控,默认情况下,访问http://IP:PORT/hystrix.stream 是个404。如何为Feign增加Hystrix Stream支持呢?

需要以下两步:

第一步:添加依赖,示例:

<!-- 整合hystrix,其实feign中自带了hystrix,引入该依赖主要是为了使用其中的hystrix-metrics-event-stream,用于dashboard -->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

第二步:在启动类上添加@EnableCircuitBreaker 注解,示例:

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker
public class MovieFeignHystrixApplication {
 public static void main(String[] args) {
 SpringApplication.run(MovieFeignHystrixApplication.class, args);
 }
}

这样修改以后,访问任意的API后,再访问http://IP:PORT/hystrix.stream,就会展示出一大堆的API监控数据了。

五、如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ComponentScan 的包重叠

如果包重叠,将会导致所有的Feign Client都会使用该配置。

六、首次请求失败

详见:解决Spring Cloud中Feign/Ribbon第一次请求失败的方法

七、@FeignClient 的属性注意点

(1) serviceId属性已经失效,尽量使用name属性。例如:

@FeignClient(serviceId = "microservice-provider-user")

这么写是不推荐的,应写为:

@FeignClient(name = "microservice-provider-user")

(2) 在使用url属性时,在老版本的Spring Cloud中,不需要提供name属性,但是在新版本(例如Brixton、Camden)@FeignClient必须提供name属性,并且name、url属性支持占位符。例如:

@FeignClient(name = "${feign.name}", url = "${feign.url}")

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# spring  # cloud  # feign  # 优化  # 详解spring cloud Feign使用中遇到的问题总结  # Spring Cloud-Feign服务调用的问题及处理方法  # Spring Cloud Feign报错问题解决  # springcloud feign docker上无法通讯的问题及解决  # 就会  # 是个  # 首次  # 多个  # 将会  # 不需要  # 可以直接  # 自定义  # 这篇文章  # 带了  # 谢谢大家  # 能与  # 两步  # 会以  # 第二步  # 新版本  # 何为  # 是为了  # 情况下  # 但是在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  焦点电影公司作品,电影焦点结局是什么?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  javascript基本数据类型及类型检测常用方法小结  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何快速上传建站程序避免常见错误?  iOS UIView常见属性方法小结  详解MySQL数据库的安装与密码配置  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何快速登录WAP自助建站平台?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何在腾讯云免费申请建站?  创业网站制作流程,创业网站可靠吗?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  linux写shell需要注意的问题(必看)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何使用Sanctum进行API认证?(SPA实战)  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何在云主机快速搭建网站站点?  如何用AWS免费套餐快速搭建高效网站?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  linux top下的 minerd 木马清除方法  IOS倒计时设置UIButton标题title的抖动问题  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何用搬瓦工VPS快速搭建个人网站?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何快速生成ASP一键建站模板并优化安全性?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  JavaScript实现Fly Bird小游戏  在线教育网站制作平台,山西立德教育官网?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  如何用美橙互联一键搭建多站合一网站?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在IIS管理器中快速创建并配置网站?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  北京的网站制作公司有哪些,哪个视频网站最好?  PHP正则匹配日期和时间(时间戳转换)的实例代码