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

Spring Cloud 远程调用 OpenFeign 这些知识点,能颠覆你的认知!

来源: 责编: 时间:2023-10-13 14:34:09 422观看
导读环境:SpringBoot2.7.12 + Spring Cloud2021.0.71. 概述Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端,主要用于在Spring Cloud微服务架构中进行服务调用。相比于传统的RestTemplate,Openfeign更加简洁,开发者

环境:SpringBoot2.7.12 + Spring Cloud2021.0.7AuG28资讯网——每日最新资讯28at.com

1. 概述

Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端,主要用于在Spring Cloud微服务架构中进行服务调用。AuG28资讯网——每日最新资讯28at.com

相比于传统的RestTemplate,Openfeign更加简洁,开发者只需通过编写一个接口并添加注解进行配置,即可实现对服务提供方接口的绑定,而无需手动构造请求和解析返回数据。AuG28资讯网——每日最新资讯28at.com

Openfeign的应用,让Spring Cloud微服务调用变得更加便捷。在服务消费者中,只需通过接口方法即可进行远程服务调用,就像调用本地方法一样简单。此外,Feign还集成了LoadBalancer,利用LoadBalancer维护服务提供方列表,实现轮询调用服务提供者。AuG28资讯网——每日最新资讯28at.com

使用Spring Cloud Openfeign,开发者可以更加专注于业务逻辑而不是底层的HTTP请求,提高了开发效率和代码可读性。同时,Openfeign还支持自定义配置和扩展,可以满足不同场景下的需求。总之,Spring Cloud Openfeign是Spring Cloud微服务架构中不可或缺的一部分,可以帮助开发者更加高效地进行服务调用。AuG28资讯网——每日最新资讯28at.com

2. 准备环境

<dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency>

开启openfeign功能

@SpringBootApplication@EnableFeignClientspublic class SpringCloudComprehensiveApplication {}

feign客户端

@FeignClient(    url = "http://localhost:8088/demos",     name = "demoService")public interface DemoFeign {  @GetMapping("/info/{id}")  public Object info(@PathVariable("id") Integer id) ;  }

以上DemoFeign就能被正确的使用了。接下来看看下面的那些知识点你是知道的AuG28资讯网——每日最新资讯28at.com

3. 知识盲区

盲区1:超时时间

默认情况下feign调用超时时间如下:AuG28资讯网——每日最新资讯28at.com

/** * 默认超时时间 * <ul> * <li>Connect Timeout: 10 seconds</li> * <li>Read Timeout: 60 seconds</li> * <li>Follow all 3xx redirects</li> * </ul> */public Options() {  this(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);}

定义

public class FeignClientFactoryBean {  // 读超时时间  private int readTimeoutMillis = new Request.Options().readTimeoutMillis();  // 连接超时时间  private int connectTimeoutMillis = new Request.Options().connectTimeoutMillis();}

编程方式自定义:你只需要提供Request.Options类型的Bean即可。AuG28资讯网——每日最新资讯28at.com

配置定义

#全局定义feign.client.config.default.connect-timeout=3000feign.client.config.default.read-timeout=3000#具体服务定义feign.client.config.demoService.connect-timeout=2000feign.client.config.demoService.read-timeout=2000

盲区2:重试

feign的重试相信很多人都没有玩过对吧?AuG28资讯网——每日最新资讯28at.com

如果feign没有启用断路器功能(feign.circuitbreaker.enabled, 默认值为false),那么会开启retryer(重试)功能;默认情况openfeign提供了如下配置:AuG28资讯网——每日最新资讯28at.com

@Bean@Scope("prototype")@ConditionalOnMissingBeanpublic Feign.Builder feignBuilder(Retryer retryer) {  return Feign.builder().retryer(retryer);}// 默认还是个不支持重试的,所以我们需要自定义重试Bean@Bean@ConditionalOnMissingBeanpublic Retryer feignRetryer() {  return Retryer.NEVER_RETRY;}

自定义重试bean

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

这样如果当前环境没有cricuitbreaker,那么这里的重试就能生效了。AuG28资讯网——每日最新资讯28at.com

盲区3:服务降级

通常定义了feign客户端后,我们都会定义相应的降级服务,fallback或fallbackFactory,如果这两个都配置了那谁才会生效呢?源码如下:AuG28资讯网——每日最新资讯28at.com

class FeignCircuitBreakerTargeter implements Targeter {  public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context,      Target.HardCodedTarget<T> target) {    // ...    FeignCircuitBreaker.Builder builder = (FeignCircuitBreaker.Builder) feign;    String name = !StringUtils.hasText(factory.getContextId()) ? factory.getName() : factory.getContextId();    // 先判断了fallback属性,如果不是void,那么直接返回了    Class<?> fallback = factory.getFallback();    if (fallback != void.class) {      return targetWithFallback(name, context, target, builder, fallback);    }    Class<?> fallbackFactory = factory.getFallbackFactory();    if (fallbackFactory != void.class) {      return targetWithFallbackFactory(name, context, target, builder, fallbackFactory);    }    return builder(name, builder).target(target);  }}

盲区4:primary属性

在@FeignClient注解中有个primary属性,你知道这个属性有什么用吗?AuG28资讯网——每日最新资讯28at.com

默认每一个feign客户端都被注册为bean,并且每个bean都相当于使用了@Primary注解修饰一样,任何地方注入都是有限注入的该bean。它的用处还得从fallback属性说起。如果定义了feign客户端后对应的fallback是需要实现当前这个feign接口的,且还的注册为bean对象。那么如果把这里的primary设置为false后,容器中此时可是存在两个DemoFeign类型的bean的,这时候容器启动就会报错了。所以这里默认就吧feign客户端的primary设置为true就是解决这个问题的。示例如下:AuG28资讯网——每日最新资讯28at.com

@FeignClient(    url = "http://localhost:8088/demos",     name = "demoService",     fallback = DemoFeignFallback.class    primary = true // 默认即为true)public interface DemoFeign {}@Componentpublic class DemoFeignFallback implements DemoFeign {}

盲区5:动态刷新超时时间

盲区1中已经提到了超时时间问题,那都是写静态配置,那能不能动态配置呢?可以,完全可以,你只需下面这样操作即可AuG28资讯网——每日最新资讯28at.com

#开启刷新配置feign.client.refresh-enabled=true

实现的原理也比较简单就是:向容器中注册了一个OptionsFactoryBean类型的bean且该Bean的作用域范围是refresh。当我们调用/refresh endpoint后就会刷新该Bean的配置信息。AuG28资讯网——每日最新资讯28at.com

先就列出上面5个知识点吧,看看你知道几个?AuG28资讯网——每日最新资讯28at.com

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

本文链接:http://www.28at.com/showinfo-26-13248-0.htmlSpring Cloud 远程调用 OpenFeign 这些知识点,能颠覆你的认知!

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

上一篇: Java设计规范与代码风格:保持代码的一致性与可读性

下一篇: NET序列化工具:SharpSerializer库快速上手并轻松完成序列化操作

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 十个可以手动编写的 JavaScript 数组 API

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

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
Top