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

 更新时间:2017年02月28日 10:33:03   作者:周立  
这篇文章主要给大家介绍了Spring Cloud中关于Feign的常见问题,文中通过示例代码介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。

一、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}")

总结

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

相关文章

  • 为什么禁止在SpringBoot项目中使用@Autowired注解

    为什么禁止在SpringBoot项目中使用@Autowired注解

    写代码的时候突然发现 idea 在属性注入的 @Autowired 注解上给出警告提示,spring framework 4.0 以后开始出现的,spring 4.0 开始就不推荐使用属性注入,改为推荐构造器注入和 setter 注入,推荐的方法是使用基于构造函数和基于setter的依赖注入
    2024-08-08
  • Java ArrayList使用总结

    Java ArrayList使用总结

    这篇文章主要介绍了Java ArrayList使用总结,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 使用SpringBoot整合Jpa的过程详解

    使用SpringBoot整合Jpa的过程详解

    SpringBoot是一种快速开发框架,它简化了Java应用程序的开发过程,而Jpa是Java持久化规范的一种实现,将SpringBoot与Jpa整合可以更加方便地进行数据库操作,提高开发效率,本文将介绍如何使用Spring Boot整合Jpa,帮助读者快速上手并应用于实际项目中
    2023-12-12
  • Java数组常见应用详解【创建、遍历、排序、查找】

    Java数组常见应用详解【创建、遍历、排序、查找】

    这篇文章主要介绍了Java数组常见应用,结合实例形式详细分析了java数组的基本定义、创建、遍历、排序、查找等相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-02-02
  • java如何获得redis所有的key-value

    java如何获得redis所有的key-value

    这篇文章主要介绍了java如何获得redis所有的key-value,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • windows java.exe内存暴涨解决、idea跑java\ tomcat内存无限增长

    windows java.exe内存暴涨解决、idea跑java\ tomcat内存无限增长

    这篇文章主要介绍了windows java.exe内存暴涨解决、idea跑 java\ tomcat内存无限增长,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Spring覆盖容器中Bean的注解如何实现@OverrideBean

    Spring覆盖容器中Bean的注解如何实现@OverrideBean

    文章介绍了在项目开发中如何通过偷梁换柱的方式重写Spring容器中的内置Bean,并指出了需要注意的两点:1. 对应的Bean应基于接口注入;2. 如果不是基于接口注入,可以使用同包名同类名的方式重写(可能存在潜在问题,不推荐),文章还强调了“基于接口编程”的好处
    2025-01-01
  • java实现基于TCP协议网络socket编程(C/S通信)

    java实现基于TCP协议网络socket编程(C/S通信)

    这篇文章主要介绍了java实现基于TCP协议网络socket编程(C/S通信),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • springboot中server.ssl.key-store配置路径的问题小结

    springboot中server.ssl.key-store配置路径的问题小结

    这篇文章主要介绍了springboot中server.ssl.key-store配置路径的问题,文中还记录了Spring Boot SSL(https)实例,介绍在web程序中使用自签名的SSL(HTTPS)证书及创建SSL认证,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • SpringBoot使用YML文件进行多环境配置的三种方法

    SpringBoot使用YML文件进行多环境配置的三种方法

    SpringBoot通过其灵活的配置机制,使得在不同环境中管理应用设置变得简单,尤其是使用YAML文件进行配置,它提供了一种简洁、易读的方式来定义应用的配置,本文将探讨在SpringBoot中使用YAML文件进行多环境配置的三种方法,需要的朋友可以参考下
    2024-04-04

最新评论