问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring Cloud Feign全解析:简化微服务调用的最佳实践

创作时间:
作者:
@小白创作中心

Spring Cloud Feign全解析:简化微服务调用的最佳实践

引用
CSDN
1.
https://blog.csdn.net/m0_74022498/article/details/140906191

在使用Spring Cloud开发微服务时,服务消费者需要通过HTTP Client访问服务提供者。常见的实现方式包括使用JDK原生的URLConnection、Apache的HTTP Client、Netty的异步HTTP Client以及Spring提供的RestTemplate。而Spring Cloud Open Feign则是最方便和优雅的选择,它支持Spring MVC注解并整合了Ribbon。

Feign 概述

Feign是一个声明式的Web Service客户端,使开发Web Service客户端变得简单。使用Feign只需要创建一个接口并添加相应的注解,例如@FeignClient注解。Feign支持可插拔的注解,包括Feign注解和AX-RS注解。它还支持编码器和解码器,Spring Cloud Open Feign对Feign进行了增强,支持Spring MVC注解,可以像Spring Web一样使用HttpMessageConverters等。

Feign的主要特性包括:

  • 可插拔的注解支持
  • 支持可插拔的HTTP编码器和解码器
  • 支持Hystrix和它的Fallback
  • 支持Ribbon的负载均衡
  • 支持HTTP请求和响应的压缩

Feign 工作原理

在开发微服务应用时,需要在主程序入口添加@EnableFeignClients注解以开启Feign Client的扫描加载处理。根据Feign Client的开发规范,需要定义接口并添加@FeignClients注解。

当程序启动时,会进行包扫描,扫描所有带有@FeignClients注解的类,并将这些信息注入Spring IOC容器中。当定义的Feign接口中的方法被调用时,通过JDK的代理方式生成具体的RequestTemplate。每个接口方法都会创建一个RequestTemplate对象,该对象封装了HTTP请求需要的全部信息,如请求参数名、请求方法等。

然后由RequestTemplate生成Request,交给Client处理。这里的Client可以是JDK原生的URLConnection、Apache的HttpClient或Okhttp。最后,Client被封装到LoadBalanceclient类,结合Ribbon进行负载均衡发起服务间的调用。

@FeignClient 注解剖析

@FeignClient注解被@Target(ElementType.TYPE)修饰,表示它只能作用在接口上。声明接口后,可以通过@Resource注入并在代码中使用。@FeignClient标签的常用属性包括:

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称用于服务发现
  • url:用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生HTTP 404错误时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException
  • configuration:Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback:定义容错处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory:工厂类,用于生成fallback类实例,通过这个属性可以实现每个接口通用的容错逻辑,减少重复代码
  • path:定义当前FeignClient的统一前缀

Feign请求超时问题

Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。由于Spring的懒加载机制,首次请求可能会比较慢,响应时间可能超过1秒。以下是三种解决方案:

  1. 修改Hystrix的超时时间:

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
    
  2. 禁用Hystrix的超时时间:

    hystrix.command.default.execution.timeout.enabled: false
    
  3. 禁用Feign的Hystrix:

    feign.hystrix.enabled: false
    

需要注意的是,第三种方案除非在特殊场景下,否则不推荐使用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号