Spring Cloud OpenFeign 的使用及踩坑指南

这篇具有很好参考价值的文章主要介绍了Spring Cloud OpenFeign 的使用及踩坑指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

  • Feign 和OpenFeign
    • Feign
    • OpenFeign
    • openFeign的优势
  • OpenFeign应用
    • 1. 导入依赖
    • 2. 使用
    • 3. 日志配置
    • 4. 数据压缩
  • OpenFeign高级应用
    • OpenFeign熔断降级的两种方式-降级方法和降级工厂
  • 踩坑指南
    • 坑一:Http Client
    • 坑二:全局超时时间
    • 坑三:单服务设置超时时间
  • 遇到的问题
    • 1. 使用Spring MVC注解,但请求方式不正确
    • 2. 使用nacos做注册中心,Feign调用时拉取的服务列表为空

Feign 和OpenFeign

Feign

Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务Feign本身不支持Spring MVC的注解,它有一套自己的注解

OpenFeign

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等,是一个轻量级的Http封装工具对象,大大简化了Http请求,使得我们对服务的调用转换成了对本地接口方法的调用。

OpenFeign 的 @FeignClient 可以解析SpringMVC的 @RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

openFeign的优势

  1. 集成了Ribbon的负载均衡功能
  2. 集成Hystrix的熔断器功能
  3. 支持请求压缩
  4. 大大简化了远程调用的代码,同时功能还增强啦
  5. 以更加优雅的方式编写远程调用代码,并简化重复代码

OpenFeign应用

1. 导入依赖

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.1.RELEASE</version>
  </dependency>

2. 使用

创建Feign接口

@FeignClient(value = "xx-template-service")//value = "xx-template-service"指定服务的名字
public interface DriverFeign {

  /** 
   * demo feign 接口
   */
  @PutMapping(value = "/driver/status")
  Driver status(String id, Integer status);
}

Feign会通过动态代理,帮我们生成实现类。

注解@FeignClient声明Feign的客户端,注解value指明服务名称接口定义的方法,采用SpringMVC的注解。Feign会根据注解帮我们生成URL地址

FeignClient 注解参数

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

注意事项

  1. 在使用fallback、fallbackFactory属性时,需要使用@Component注解,保证fallback类被Spring容器扫描到
  2. 在使用FeignClient时,Spring会按name创建不同的ApplicationContext,通过不同的Context来隔离FeignClient的配置信息, 在使用配置类时,不能把配置类放到Spring App Component scan的路径下,否则,配置类会对所有FeignClient生效.

启用OpenFeign

我们需要在服务的启动类上开启 OpenFeign ,只需要在 **Application 启动类上添加 @EnableFeignClients即可。

3. 日志配置

logging:
  level:
    xx.template.cloud.web.service.feign.ServiceServiceFeign: debug

通过loggin.level.xx=debug来设置日志级别。然而这个对Feign客户端不会产生效果。因为@FeignClient注解修饰的客户端在被代理时,都会创建一个新的Feign.Logger实例。我们需要额外指定这个日志的级别才可以。

  /** 
   * feign 日志级别配置
   * @return 
   */
  @Bean
  public Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
  }

或者在配置文件中配置

feign: 
  client:
    config:
      # 全局配置
      default:
        loggerLevel: full

Feign支持4种级别:
NONE:不记录任何日志,默认值
BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
HEADERS:在BASIC基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据

4. 数据压缩

用户在网络请求过程中,如果网络不佳、传输数据过大,会造成体验差的问题,我们需要将传输数据压缩提升体验。SpringCloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。

在客户端中配置数据压缩

feign:
  compression:
    request:
     enabled: true # 开启请求压缩
    response:
     enabled: true # 开启响应压缩

也可以对请求的数据类型,以及触发压缩的大小下限进行设置

feign:
  compression:
    request:
      enabled: true # 开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限
      #以上数据类型,压缩大小下限均为默认值
      response:
        enabled: true # 开启响应压缩

OpenFeign高级应用

OpenFeign熔断降级的两种方式-降级方法和降级工厂

首先在配置文件中配置如下,开启熔断降级

feign.hystrix.enabled=true
  1. Feign 定义降级方法

    feign接口定义

    /**
     * FeignClient 注解的 fallback 属性指定降级类
     */
    @FeignClient(name = "xx-template-cloud-service", fallback = ServiceServiceFeignFallBack.class)
    public interface ServiceServiceFeign {
    
        @GetMapping("/order/getOrder")
        Result getOrder(String id);
    }
    
    

    feign接口降级方法定义

    @Slf4j
    @Component
    class ServiceServiceFeignFallBack implements ServiceServiceFeign {
    
        @Override
        public Result getOrder(String id) {
            log.error("Feign接口熔断 熔断方式:ServiceServiceFeignFallBack");
            return Result.error("500", "Feign接口熔断");
        }
    }
    
  2. Feign 定义降级工厂

    feign接口定义

    /**
     * FeignClient 注解的 fallback 属性指定降级类
     */
    @FeignClient(name = "xx-template-cloud-service", fallback = UserCenterFeignClientFallbackFactory.class)
    public interface ServiceServiceFeign {
    
        @GetMapping("/order/getOrder")
        Result getOrder(String id);
    }
    
    

    feign接口降级工厂定义

    @Component
    @Slf4j
    class UserCenterFeignClientFallbackFactory implements FallbackFactory<ServiceServiceFeign> {
    
        @Override
        public ServiceServiceFeign create(Throwable cause) {
            return new ServiceServiceFeign() {
                @Override
                public Result getOrder(String id) {
                    log.error("Feign接口熔断,熔断方式:UserCenterFeignClientFallbackFactory");
                    return Result.error("500", "Feign接口熔断");
                }
            };
        }
    }
    

踩坑指南

坑一:Http Client

OpenFeign默认使用jdk自带的HttpURLConnection,我们知道HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,很可能会遇到性能问题导致系统故障

  1. 可以采用Apache HttpClient

    注意feign-httpclient的版本,如果和Open Feign 不兼容可能会报original request is required异常

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>10.10.1</version>
    </dependency>
    
    feign.httpclient.enabled=true
    
  2. 也可以采用OkHttpClient

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
        <version>10.2.0</version>
    </dependency>
    
    feign.okhttp.enabled=true
    

ribbon中的Http Client

通过OpenFeign作为注册中心的客户端时,默认使用Ribbon做负载均衡,Ribbon默认也是用jdk自带的HttpURLConnection,需要给Ribbon也设置一个Http client,比如使用okhttp,在properties文件中增加下面配置

ribbon.okhttp.enabled=true

坑二:全局超时时间

OpenFeign可以设置超时时间,简单粗暴,设置一个全局的超时时间。如果不配置超时时间,默认是连接超时10s,读超时60s。

feign.client.config.default.connectTimeout=2000
feign.client.config.default.readTimeout=60000

但是如果某个服务的并发量很高,服务的超时时间过长会导致占用大量连接资源,导致系统崩溃,要防止这样的故障发生,最好的做法就是给服务单独设置超时时间。

当然,如果开启熔断后,不配置hystrix和ribbon的超时时间,那么Hystrix与ribbon的默认请求超时时间都是1秒,建议配置Hystrix的超时时间要大于ribbon的超时时间,否则会在接口调用还未完成的时候直接进入回调方法。

# 开启熔断
feign.hystrix.enabled: true


坑三:单服务设置超时时间

上文所述,对单个服务设置超时时间。

feign.client.config.serviceA.connectTimeout=2000
feign.client.config.serviceA.readTimeout=60000

但是如果serviceA中有多个接口,其中X接口又调用serviceB的Feign接口,为了保证X接口请求不被单服务超时时间影响,需要单独对X接口设置超时时间。

几个组件的关系

Spring Cloud OpenFeign 的使用及踩坑指南

hystrix+ribbon。hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。hystrix的熔断时间必须大于ribbon的 ( ConnectTimeout + ReadTimeout )。而如果ribbon开启了重试机制,还需要乘以对应的重试次数(注意这里的重试可以是ribbon的重试也可能是feign的重试),保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

遇到的问题

1. 使用Spring MVC注解,但请求方式不正确

  • 参数没有通过注解指定,此时的参数会自动封装到body中,Feign检测到body里面有请求参数就会默认使用POST请求。
  • Feign默认使用的是POST方法,如果想使用GET方法,需要在配置文件中设置spring.cloud.openfeign.client.config.default.method.name=get。
  • 如果使用了Spring Cloud Netflix Feign,那么可能是因为您的应用程序使用了Spring Cloud Netflix Ribbon来处理HTTP负载均衡。在这种情况下,您需要确保Ribbon的配置正确,并且不会影响Feign的GET请求。

2. 使用nacos做注册中心,Feign调用时拉取的服务列表为空

我用的spring cloud版本是Hoxton.SR8

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

原因是Feign 在spring cloud Hoxton.M2版本之后,不再使用ribbon,所以我们在pom文件中还需要导入loadbalancer依赖,并排除掉nacos的ribbon依赖。

        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

并在配置文件中添加文章来源地址https://www.toymoban.com/news/detail-623635.html


spring.cloud.loadbalancer.ribbon.enabled: false

到了这里,关于Spring Cloud OpenFeign 的使用及踩坑指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生微服务 第六章 Spring Cloud中使用OpenFeign

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。我们可

    2024年02月08日
    浏览(35)
  • 【Spring Cloud】如何使用Feign实现远程调用

    本次示例代码的文件结构如下图所示。 在 order-service 的 pom.xml 文件中导入 Feign 的依赖坐标。 在 order-service 的启动类上添加注解 @EnableFeignClients ,以开启 Feign 功能。 Feign 采用了 Spring MVC 的注解的方式发起远程调用。只需要把发 HTTP 请求的信息声明在一个接口中,并添加注解

    2024年02月13日
    浏览(47)
  • Intellij IDEA下载安装教程和搭建springboot开发环境及踩坑指南(超详细图文教程)

    https://www.jetbrains.com/idea/ 大家通过上方的链接进入到Intellij idea的官网后,可以在主界面点击Download或者点击上方导航栏里面的DeveloperTools,在里面找到并点击Intellij idea,下载安装即可。 3、 Intellij idea安装指南 通过上方的官网下载完成以后,会的到一个压缩包(里面是Intellij

    2024年03月24日
    浏览(57)
  • 使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

            Feign是一个声明式的 HTTP客户端框架 ,用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分,旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。         Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下,在微服务

    2024年02月15日
    浏览(41)
  • 在spring cloud中使用gateway报错404(踩坑)

    在我写一个spring cloud小demo时,在浏览器访问报错中报错404,让我百思不得其解,    以下是错误代码展示 teacher业务 teacher配置文件 gateway配置文件 在上述gateway配置文件中出现的错误 - Path=/teacherserver/** 正确是应该是 -Path=/teacher/** Path应该与controller对应 当然,这是我粗心大意

    2024年02月04日
    浏览(46)
  • 【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用

    目录 一、通过RestTemplate调用微服务 二、通过Feign远程调用 三、Dubbo  分布式中的远程调用大概分为两种 RESTful接口  REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架构。 每一个URI代表一种资源; 客户端和服务器之间,传递这种资源的某种

    2024年04月11日
    浏览(48)
  • OpenFeign:Spring Cloud声明式服务调用组件

    OpenFeign? Feign VS OpenFeign? OpenFeign实现远程服务调用? OpenFeign超时控制? OpenFeign日志增强? Open Feign Spring官方推出的一种声明式服务端调用与负载均衡组件。 OpenFeign常用注解 注解 说明 @FeignClient 通知OpenFeign组件对@RequestMapping注解下的接口解析,并通过动态代理的方式实现类

    2024年02月03日
    浏览(50)
  • 第五章 : Spring cloud 微服务调用-OpenFeign

    第五章 : Spring cloud 微服务调用-OpenFeign 前言 本章知识点:OpenFeign介绍、负载均衡Ribbon的算法、Spring cloud 如何通过RestTemplate调用微服务,以及RestTemplate负载均衡原理。 OpenFeign介绍 Spring Cloud OpenFeign是一个声明式、模板化的HTTP客户端,主要用于Spring Cloud微服务之间的调用。以

    2024年02月02日
    浏览(41)
  • Spring Cloud ( openFeign 服务发现、配置、公共client抽取 )

    本章目录: openFeign的引出 快速入门 引入依赖 添加@EnableFeignClients注解 编写FeignClient接口 使用FeignClient中定义的方法代替RestTemplate 日志配置 连接池配置 公共client抽取 先来看我们之前服务通信使用的方法: 我们调用RestTemplate的getObject并手写url来完成服务调用,这样做的缺点是

    2023年04月08日
    浏览(45)
  • Spring Cloud Alibaba 同时兼容dubbo与openfeign

    dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组件引入困难重重,于是在国内的市场上就有了升级版的

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包