当前位置:首页 > 科技  > 软件

全网最详细的OpenFeign讲解,肯定有你不知道的

来源: 责编: 时间:2023-11-30 09:26:35 171观看
导读环境:SpringCloud3.1.51. 简介Spring Cloud OpenFeign是一种声明式、模板化的HTTP客户端,它简化了远程调用的编程体验。在Spring Cloud中使用OpenFeign,开发者可以像调用本地方法一样使用HTTP请求访问远程服务,而无需感知

环境:SpringCloud3.1.5KO028资讯网——每日最新资讯28at.com

1. 简介

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

OpenFeign会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign会将函数的参数值设置到这些请求模板中。KO028资讯网——每日最新资讯28at.com

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

总的来说,Spring Cloud OpenFeign是一种强大的工具,它可以帮助开发者更轻松地实现微服务的远程调用。KO028资讯网——每日最新资讯28at.com

2. OpenFeign配置

2.1 开启功能

引入依赖KO028资讯网——每日最新资讯28at.com

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

开启KO028资讯网——每日最新资讯28at.com

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

示例KO028资讯网——每日最新资讯28at.com

@FeignClient(name = "demoService")public interface DemoFeign {  @GetMapping("/info/{id}")  public Object info(@PathVariable("id") Integer id) ;}

在 @FeignClient 注解中,name="demoService"是一个客户端名称,用于创建 Spring Cloud LoadBalancer 客户端。你也可以设置 url 属性(绝对值或主机名)指定一个 URL。KO028资讯网——每日最新资讯28at.com

2.2 自定义配置

通过指定@FeignClient  configuration属性实现自定义配置KO028资讯网——每日最新资讯28at.com

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

默认情况下Spring Cloud OpenFeign会提供如下的默认Bean:KO028资讯网——每日最新资讯28at.com

Decoder feignDecoder:ResponseEntityDecoder  响应内容解码KO028资讯网——每日最新资讯28at.com

Encoder feignEncoder: SpringEncoderKO028资讯网——每日最新资讯28at.com

Logger feignLogger: Slf4jLoggerKO028资讯网——每日最新资讯28at.com

MicrometerCapability micrometerCapability: 如果 feign-micrometer 位于类路径上,且 MeterRegistry 可用KO028资讯网——每日最新资讯28at.com

CachingCapability cachingCapability: 如果使用 @EnableCaching 注解。可通过 feign.cache.enabled 关闭。KO028资讯网——每日最新资讯28at.com

Contract feignContract: SpringMvcContract这个的作用就是用来接下@FeignClient注解类中的相应MVC注解KO028资讯网——每日最新资讯28at.com

Feign.Builder feignBuilder: FeignCircuitBreaker.Builder构建Feign客户端的,比如环境中使用了CircuitBreaker,那么就会在调用接口时应用断路器功能KO028资讯网——每日最新资讯28at.com

Client feignClient: 如果 Spring Cloud LoadBalancer 位于类路径上,则使用 FeignBlockingLoadBalancerClient。如果它们都不在类路径上,则使用默认的 Feign  Client。默认的Client使用jdk自定的网络请求 URLConnection。KO028资讯网——每日最新资讯28at.com

我们可以在自定义的DemoConfiguration中自定义自己的实现,在DemoConfiguration中你可以自定义如下的Bean:注意:这些bean是 OpenFeign没有提供的,除了上面介绍的你可以覆盖自定义实现,你还可以定义下面的beanKO028资讯网——每日最新资讯28at.com

Logger.LevelRetryerErrorDecoderRequest.OptionsCollection<RequestInterceptor>SetterFactoryQueryMapEncoderCapability (MicrometerCapability and CachingCapability are provided by default)

接下来会介绍常用的一些自定义配置KO028资讯网——每日最新资讯28at.com

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

配置文件KO028资讯网——每日最新资讯28at.com

pack:  demo:    name: demoService    url: http://localhost:8088/demos

KO028资讯网——每日最新资讯28at.com

  • 超时配置
feign:  client:    config:      default:        connectTimeout: 5000        readTimeout: 5000

默认所有的接口请求超时都是5s。KO028资讯网——每日最新资讯28at.com

KO028资讯网——每日最新资讯28at.com

  • 动态设置超时时间

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

feign:  client:    refresh-enabled: true

KO028资讯网——每日最新资讯28at.com

  • 自定义日志级别

配置文件中设置KO028资讯网——每日最新资讯28at.com

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

配置日志基本,两种方式:1 配置文件;2 定义BeanKO028资讯网——每日最新资讯28at.com

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

在自定义配置类中定义为beanKO028资讯网——每日最新资讯28at.com

@Beanpublic Logger.Level loggerLevel() {  return Logger.Level.FULL ;}

KO028资讯网——每日最新资讯28at.com

  • 自定义重试机制

默认情况下,当请求的接口出现异常不会进行重试,可以通过定义下面bean进行重试KO028资讯网——每日最新资讯28at.com

@Beanpublic Retryer feignRetryer() {  Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);  return retryer ;}

KO028资讯网——每日最新资讯28at.com

  • 自定义拦截器

默认OpenFeign不提供任何拦截器,如果你需要在请求前进行处理,比如添加请求header,那么你可以自定义拦截器实现KO028资讯网——每日最新资讯28at.com

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

也可以通过配置文件配置KO028资讯网——每日最新资讯28at.com

feign:  client:    config:      demoService:        request-interceptors:        - com.pack.feign.HeaderRequestInterceptor

KO028资讯网——每日最新资讯28at.com

  • 手动创建Feign客户端

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

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");  }}

KO028资讯网——每日最新资讯28at.com

  • 服务降级

当你的类路径下有了Spring Cloud CircuitBreaker后服务降级fallback才会生效。KO028资讯网——每日最新资讯28at.com

@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的接口KO028资讯网——每日最新资讯28at.com

public class DemoFeignFallback implements DemoFeign {  public Object info(Integer id) {    return "default - " + id;  }}

KO028资讯网——每日最新资讯28at.com

  • 服务降级工厂

如果需要访问触发回退的原因,可以使用 @FeignClient 内的 fallbackFactory 属性。KO028资讯网——每日最新资讯28at.com

@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) ;}

工厂类KO028资讯网——每日最新资讯28at.com

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) ;  }}

KO028资讯网——每日最新资讯28at.com

  • 缓存支持

如果使用 @EnableCaching 注解,则会创建并注册一个 CachingCapability Bean,以便 Feign 客户端识别其接口上的 @Cache* 相关注解:KO028资讯网——每日最新资讯28at.com

@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) ;}

KO028资讯网——每日最新资讯28at.com

  • Feign继承支持

Feign 通过单继承接口支持模板应用程序。这样就可以将常用操作归类到方便的基础接口中。KO028资讯网——每日最新资讯28at.com

@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 接口进行注解。KO028资讯网——每日最新资讯28at.com

  • 请求相应压缩

你可以考虑为你的 Feign 请求启用请求或响应 GZIP 压缩。你可以启用其中一个属性:KO028资讯网——每日最新资讯28at.com

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

控制压缩MeidaType类型和最小请求阈值长度KO028资讯网——每日最新资讯28at.com

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

KO028资讯网——每日最新资讯28at.com

3. 关于响应式客户端

由于 OpenFeign 项目目前不支持 Spring WebClient 等反应式客户端,因此 Spring Cloud OpenFeign 也不支持反应式客户端。KO028资讯网——每日最新资讯28at.com

目前官方推荐的响应式库:feign-reactiveKO028资讯网——每日最新资讯28at.com

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

我目前使用的是3.3.0版本,除了注解适当调整,其它使用基本一致,非常爽。KO028资讯网——每日最新资讯28at.com

@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) ;}

KO028资讯网——每日最新资讯28at.com

总结:

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

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

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

完毕!!!KO028资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-35260-0.html全网最详细的OpenFeign讲解,肯定有你不知道的

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 消息队列批量收发消息,请避开这五个坑!

下一篇: Python的三元表达式,你知道吗?

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 十个可以手动编写的 JavaScript 数组 API

    十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top