您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

全网最详细的OpenFeign讲解

时间:2023-11-30 13:33:59  来源:  作者:Springboot实战案例锦集
OpenFeign是一个非常有用的工具,它为开发者提供了一种简单而强大的方式来处理远程服务调用。通过使用OpenFeign,开发者可以专注于业务逻辑,而无需花费太多精力在复杂的网络编程细节上。

环境:SpringCloud3.1.5

1. 简介

Spring Cloud OpenFeign是一种声明式、模板化的HTTP客户端,它简化了远程调用的编程体验。在Spring Cloud中使用OpenFeign,开发者可以像调用本地方法一样使用HTTP请求访问远程服务,而无需感知这是在调用远程方法。

OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。

在项目启动阶段,OpenFeign框架会自动的扫包流程,从指定的目录下扫描并加载所有被@FeignClient注解修饰的接口。OpenFeign会针对每一个FeignClient接口生成一个动态代理(JDK)对象,这个动态代理对象会被添加到Spring上下文中,并注入到对应的服务里。

总的来说,Spring Cloud OpenFeign是一种强大的工具,它可以帮助开发者更轻松地实现微服务的远程调用。

2. OpenFeign配置

2.1 开启功能

引入依赖

groupId: org.springframework.cloud
artifactId: spring-cloud-starter-openfeign

开启

@SpringBootApplication
@EnableFeignClients
public class DemoApplication {
  public static void mAIn(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
  }
}

示例

@FeignClient(name = "demoService")
public interface DemoFeign {


  @GetMapping("/info/{id}")
  public Object info(@PathVariable("id") Integer id) ;


}

在 @FeignClient 注解中,name="demoService"是一个客户端名称,用于创建 Spring Cloud LoadBalancer 客户端。你也可以设置 url 属性(绝对值或主机名)指定一个 URL。

2.2 自定义配置

通过指定@FeignClient  configuration属性实现自定义配置

@FeignClient(name = "demoService", configuration=DemoConfiguration.class)
public interface DemoFeign {
}

默认情况下Spring Cloud OpenFeign会提供如下的默认Bean:

Decoder feignDecoder:ResponseEntityDecoder  响应内容解码

Encoder feignEncoder: SpringEncoder

Logger feignLogger: Slf4jLogger

MicrometerCapability micrometerCapability: 如果 feign-micrometer 位于类路径上,且 MeterRegistry 可用

CachingCapability cachingCapability: 如果使用 @EnableCaching 注解。可通过 feign.cache.enabled 关闭。

Contract feignContract: SpringMvcContract这个的作用就是用来接下@FeignClient注解类中的相应MVC注解

Feign.Builder feignBuilder: FeignCircuitBreaker.Builder构建Feign客户端的,比如环境中使用了CircuitBreaker,那么就会在调用接口时应用断路器功能

Client feignClient: 如果 Spring Cloud LoadBalancer 位于类路径上,则使用 FeignBlockingLoadBalancerClient。如果它们都不在类路径上,则使用默认的 Feign  Client。默认的Client使用jdk自定的网络请求 URLConnection。

我们可以在自定义的DemoConfiguration中自定义自己的实现,在DemoConfiguration中你可以自定义如下的Bean:注意:这些bean是 OpenFeign没有提供的,除了上面介绍的你可以覆盖自定义实现,你还可以定义下面的bean

Logger.Level
Retryer
ErrorDecoder
Request.Options
Collection<RequestInterceptor>
SetterFactory
QueryMapEncoder
Capability (MicrometerCapability and CachingCapability are provided by default)

接下来会介绍常用的一些自定义配置

  • 动态配置name & url
@FeignClient(name = "${pack.demo.name}", url="${pack.demo.url}")
public interface DemoFeign {
}

配置文件

pack:
  demo:
    name: demoService
    url: http://localhost:8088/demos
  • 超时配置
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

默认所有的接口请求超时都是5s。

  • 动态设置超时时间

如果启用了 Feign 客户端刷新,则每个 Feign 客户端都会以 feign.Request.Options 作为 refresh-scoped Bean 来创建。这意味着 connectTimeout 和 readTimeout 等属性可以通过 POST /actuator/refresh 针对任何 Feign 客户端实例进行刷新。值需要进行如下配置接口

feign:
  client:
    refresh-enabled: true
  • 自定义日志级别

配置文件中设置

logging:
  level:
    '[com.pack.feign.test.DemoFeign]': debug

配置日志基本,两种方式:1 配置文件;2 定义Bean

feign:
  client:
    config:
      demoService:
        logger-level: full

在自定义配置类中定义为bean

@Bean
public Logger.Level loggerLevel() {
  return Logger.Level.FULL ;
}
  • 自定义重试机制

默认情况下,当请求的接口出现异常不会进行重试,可以通过定义下面bean进行重试

@Bean
public Retryer feignRetryer() {
  Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);
  return retryer ;
}
  • 自定义拦截器

默认OpenFeign不提供任何拦截器,如果你需要在请求前进行处理,比如添加请求header,那么你可以自定义拦截器实现

@Bean
public RequestInterceptor headerRequestInterceptor() {
  return template -> {
    template.header("X-API-TOKEN", "666666") ;
  } ;
}

也可以通过配置文件配置

feign:
  client:
    config:
      demoService:
        request-interceptors:
        - com.pack.feign.HeaderRequestInterceptor
  • 手动创建Feign客户端

在某些情况下,可能需要自定义 Feign 客户端,你可以使用 Feign Builder API 创建客户端。下面的示例创建了两个具有相同接口的 Feign Client,但每个客户端都配置了单独的请求拦截器。

public class DemoController {


  private DemoFeign demoFeign ;


  @Autowired
  public DemoController(Client client, Encoder encoder, Decoder decoder) {
    this.fooClient = Feign.builder().client(client)
        .encoder(encoder)
        .decoder(decoder)
        .requestInterceptor(new HeaderRequestInterceptor("X-API-TOKEN", "666666"))
        .target(FooClient.class, "http://localhost:8088/demos");
  }
}

 

  • 服务降级

当你的类路径下有了Spring Cloud CircuitBreaker后服务降级fallback才会生效。

@FeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoService", 
    configuration = DemoFeignConfiguration.class,
    fallback = DemoFeignFallback.class
)
public interface DemoFeign {


  @GetMapping("/info/{id}")
  public Object info(@PathVariable("id") Integer id) ;


}

服务降级类必须实现对应FeignClient的接口

public class DemoFeignFallback implements DemoFeign {


  public Object info(Integer id) {
    return "default - " + id;
  }
}
  • 服务降级工厂

如果需要访问触发回退的原因,可以使用 @FeignClient 内的 fallbackFactory 属性。

@FeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoService", 
    configuration = DemoFeignConfiguration.class,
    fallbackFactory = DemoFeignFallbackFactory.class,
)
public interface DemoFeign {


  @GetMapping("/info/{id}")
  public Object info(@PathVariable("id") Integer id) ;


}

工厂类

public class DemoFeignFallbackFactory implements FallbackFactory<DemoFeignFallback> {


  static class DemoFeignFallback implements DemoFeign {


    private Throwable cause ;


    public DemoFeignFallback(Throwable cause) {
      this.cause = cause ;
    }


    @Override
    public Object info(Integer id) {
      return "接口调用异常 - " + this.cause.getMessage() ;
    }


  }


  @Override
  public DemoFeignFallback create(Throwable cause) {
    return new DemoFeignFallback(cause) ;
  }
}
  • 缓存支持

如果使用 @EnableCaching 注解,则会创建并注册一个 CachingCapability Bean,以便 Feign 客户端识别其接口上的 @Cache* 相关注解:

@FeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoService", 
    configuration = DemoFeignConfiguration.class,
    fallbackFactory = DemoFeignFallbackFactory.class,
)
public interface DemoFeign {


  @GetMapping("/info/{id}")
  @Cacheable(cacheNames = "demo-cache", key = "#id")
  public Object info(@PathVariable("id") Integer id) ;
}
  • Feign继承支持

Feign 通过单继承接口支持模板应用程序。这样就可以将常用操作归类到方便的基础接口中。

@FeignClient(
    url = "http://localhost:8088/users", 
    name = "userService"
)
public interface UserService {


  @GetMapping("/{id}")
  User getUser(@PathVariable("id") Long id) ;
}
@FeignClient("users")
public interface UserClient extends UserService {
}

注意:@FeignClient 接口不应在服务器和客户端之间共享,并且不再支持在类级使用 @RequestMapping 对 @FeignClient 接口进行注解。

  • 请求相应压缩

你可以考虑为你的 Feign 请求启用请求或响应 GZIP 压缩。你可以启用其中一个属性:

feign: 
  compression: 
    request
      enabled: true
    response:
      enabled: true

控制压缩MeidaType类型和最小请求阈值长度

feign:
  compression: 
    request:
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048

 

3. 关于响应式客户端

由于 OpenFeign 项目目前不支持 Spring WebClient 等反应式客户端,因此 Spring Cloud OpenFeign 也不支持反应式客户端。

目前官方推荐的响应式库:feign-reactive

<dependency>
  <groupId>com.playtika.reactivefeign</groupId>
  <artifactId>feign-reactor-webclient</artifactId>
  <version>3.3.0</version>
</dependency>

我目前使用的是3.3.0版本,除了注解适当调整,其它使用基本一致,非常爽。

@ReactiveFeignClient(
    url = "http://localhost:8088/demos", 
    name = "demoReactorFeign", 
    fallback = DemoReactorFeignFallback.class,
    configuration = {DemoReactorFeignConfig.class}
)
public interface DemoReactorFeign {
  @GetMapping("/info/{id}")
  public Mono<Object> info(@PathVariable("id") Integer id) ;
}

 

总结:

OpenFeign是一个非常有用的工具,它为开发者提供了一种简单而强大的方式来处理远程服务调用。通过使用OpenFeign,开发者可以专注于业务逻辑,而无需花费太多精力在复杂的网络编程细节上。

OpenFeign的声明式编程风格使得我们能够以一种高度抽象和简洁的方式与远程服务进行交互,它简化了网络请求的构建和发送过程,降低了开发的复杂度。

总的来说,Spring Cloud OpenFeign是一个强大而灵活的工具,它可以帮助开发者更高效地构建和维护微服务应用。通过使用OpenFeign,我们可以更好地专注于业务逻辑,而无需担心网络调用的实现细节。

完毕!!!



Tags:OpenFeign   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
全网最详细的OpenFeign讲解
OpenFeign是一个非常有用的工具,它为开发者提供了一种简单而强大的方式来处理远程服务调用。通过使用OpenFeign,开发者可以专注于业务逻辑,而无需花费太多精力在复杂的网络编程...【详细内容】
2023-11-30  Search: OpenFeign  点击:(179)  评论:(0)  加入收藏
SpringCloud OpenFeign整合Ribbon实现负载均衡及源码分析
负载均衡器在分布式网络中扮演着非常重要的角色。通过负载均衡,可以实现更好的性能和可靠性,同时提高系统的可扩展性和弹性。目前,SpringCloud体系中,主要使用的有两种:Netflix的...【详细内容】
2023-11-09  Search: OpenFeign  点击:(234)  评论:(0)  加入收藏
Spring Cloud 远程调用 OpenFeign 这些知识点,能颠覆你的认知!
环境:SpringBoot2.7.12 + Spring Cloud2021.0.71. 概述Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端,主要用于在Spring Cloud微服务架构中进行服务调用。相比于传...【详细内容】
2023-10-13  Search: OpenFeign  点击:(312)  评论:(0)  加入收藏
使用OpenFeign实现服务调用
OpenFeignOpenFeign是运行在客户端的声明式服务调用的框架,通过声明接口的方式来达到对服务的调用,表面上看起来就好像在调用本地方法一样。OpenFeign使用方法创建一个Springb...【详细内容】
2023-06-12  Search: OpenFeign  点击:(399)  评论:(0)  加入收藏
Spring Boot+Nacos+gRPC,一个区别于 OpenFeign 的微服务通信方案!
gRPC 的基础知识前面跟小伙伴们分享了很多了,今天再写一篇给这个小小的系列收个尾。我们前面介绍的都是 gRPC 的基本用法,最终目的当然是希望能够在 Spring Boot 中用上这个...【详细内容】
2023-04-04  Search: OpenFeign  点击:(230)  评论:(0)  加入收藏
SpringCloud OpenFeign 服务调用传递 token
业务场景通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去。 在 gateway 直接把 to...【详细内容】
2022-07-24  Search: OpenFeign  点击:(330)  评论:(0)  加入收藏
SpringCloud微服务之OpenFeign添加traceId全链路监控
注册中心请参考: https://blog.csdn.net/MadLifeBin/article/details/120332483可搭建单机版用于 Demo 测试服务提供与消费请参考: https://blog.csdn.net/MadLifeBin/article...【详细内容】
2022-04-26  Search: OpenFeign  点击:(1291)  评论:(0)  加入收藏
关于OpenFeign那点事儿 - 使用篇
引言Hello 大家好,这里是Anyin。在我们微服务开发过程中不可避免的会涉及到微服务之间的调用,例如:认证Auth服务需要去用户User服务获取用户信息。在Spring Cloud全家桶的背景...【详细内容】
2022-03-28  Search: OpenFeign  点击:(1471)  评论:(0)  加入收藏
springcloud 整合openFeign
使用Feign可以完成服务间调用,但是总存在一种情况:服务提供方没有注册到注册中心、服务提供方还没开发完成(因此也就无法调用)等等。此时如果我们需要完成服务之间调用该如何...【详细内容】
2022-03-03  Search: OpenFeign  点击:(444)  评论:(0)  加入收藏
SpringCloud Alibaba实战(使用OpenFeign服务调用)
1、Feign简介Feign是一种声明式、模板化的HTTP客户端。使用Feign,可以做到声明式调用。尽管Feign目前已经不再迭代,处于维护状态,但是Feign仍然是目前使用最广泛的远程调用框架...【详细内容】
2021-06-29  Search: OpenFeign  点击:(481)  评论:(0)  加入收藏
▌简易百科推荐
Win10/Win11和 macOS用户反馈:谷歌云服务“捆绑”系统 DNS 设置
IT之家 4 月 6 日消息,谷歌公司承认旗下的 Google One 订阅服务中存在问题,在 Windows 10、Windows 11 以及 macOS 系统上会更改系统 DNS 设置,变更为 8.8.8.8 地址。Google On...【详细内容】
2024-04-08    IT之家  Tags:Win10   点击:(3)  评论:(0)  加入收藏
微软 Edge 浏览器将迎来“内存限制器”功能,用户可自主控制 Edge 内存占用
IT之家 3 月 28 日消息,微软即将为其 Edge 浏览器带来一项实用新功能,据悉该公司正在测试一项内置的内存限制器,这项功能可以让用户限制 Edge 所占用的内存,防止浏览器超出内存...【详细内容】
2024-03-29    IT之家  Tags:Edge   点击:(13)  评论:(0)  加入收藏
一寸照片的大小如何压缩?四个实测效果很好的方法
一寸照片作为生活中常见的尺寸之一,常用于各类证件照与证明文件的制作。然而,受限于其较为狭小的尺寸,上传及打印过程中很容易出现尺寸超限的情况。所以,这个时候就需要对其体积...【详细内容】
2024-03-18  宠物小阿涛    Tags:压缩   点击:(12)  评论:(0)  加入收藏
手机投屏到电脑/电视的方法
方法一:Win10自带的投影功能1、将手机和电脑连接同一个无线网络。2、选择【开始】>【设置】>【系统】>【投影到此电脑】3、将默认的始终关闭的选项更改为所有位置都可用。4、...【详细内容】
2024-03-18    老吴讲I  Tags:投屏   点击:(13)  评论:(0)  加入收藏
微软商店怎么卸载应用 一分钟快速看懂!
微软商店怎么卸载应用 一分钟快速看懂!微软公司(Microsoft Corporation)是一家全球领先的科技企业,总部位于美国华盛顿州的雷德蒙德。成立于1975年,由比尔&middot;盖茨和保罗&mid...【详细内容】
2024-02-27  婷婷说体育    Tags:微软商店   点击:(35)  评论:(0)  加入收藏
微软Edge浏览器新功能:手机上传 配对设备直接传文件
2月21日,微软最新的稳定版本Edge浏览器在Windows 11/10端加入了“手机上传”功能。这一功能允许用户直接从移动设备上上传文件,适用于所有网站,并且没有文件格式限制。要使用这...【详细内容】
2024-02-21    中关村在线  Tags:Edge   点击:(127)  评论:(0)  加入收藏
什么是虚拟机?你知道吗?
谁都没想到 Sun 公司技术如此的强大,却在之后的岁月里逐渐走向陨落,因为不懂销售和运营,导致公司财务逐渐出现亏损,在 2009 年,Oracle 公司以现金方式收购 Sun 公司,交易价格达 74...【详细内容】
2024-02-19  Java极客技术  微信公众号  Tags:虚拟机   点击:(43)  评论:(0)  加入收藏
怎么查看电脑使用记录
查看电脑使用记录是一项常见的操作,可以帮助用户了解自己或其他人在电脑上进行了哪些操作。下面是一个详细的解释,包括查看浏览历史、文件访问记录、应用程序使用记录以及其他...【详细内容】
2024-02-06  编程资料站    Tags:使用记录   点击:(81)  评论:(0)  加入收藏
电脑虚拟内存怎么设置?1分钟快速增加内存!
“我电脑里的内存好像不太够用,因此,我想在电脑里增加一些虚拟内存。不知道我应该怎么操作呢?有什么比较简单的此操作方法吗?” 虚拟内存是计算机系统内存管理的一种技术,它为程...【详细内容】
2024-02-06  数据蛙恢复专家    Tags:虚拟内存   点击:(61)  评论:(0)  加入收藏
新手制作ai写真都是用哪些工具?
春节即将来临,你的朋友圈是否已经被各种春节主题的个人写真刷屏了?看到那么多美照,你是否也心动了?其实,制作个人写真并不需要专门去拍摄,现在有很多AI写真软件可以轻松制作出自己...【详细内容】
2024-01-31  雨后海棠    Tags:ai写真   点击:(60)  评论:(0)  加入收藏
站内最新
站内热门
站内头条