【SpringCloud】OpenFeign高级特性

【SpringCloud】OpenFeign高级特性

文章目录

  • 【SpringCloud】OpenFeign高级特性
    • 1. 超时控制
      • 1.1 全局配置
      • 1.2 指定配置
    • 2. 重试机制
    • 3. 替换Http客户端
      • 3.1 引入依赖
      • 3.2 配置
    • 4. 请求/响应压缩
    • 5. 日志打印
    • 6. 综合配置

1. 超时控制

image-20240425215227490

默认OpenFeign客户端等待60秒钟,但是服务端处理超过规定时间会导致Feign客户端返回报错。

为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,默认60秒太长或者业务时间太短都不好


1.1 全局配置

spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            #连接超时时间
            connectTimeout: 3000
            #读取超时时间
            readTimeout: 3000

1.2 指定配置

如果A服务想让B服务的超时时间为2s,C服务想让B服务的超时时间为1s,那么全局配置就合适了,应该使用指定配置。

在服务消费方配置文件中根据调用服务名进行配置:

spring:
    openfeign:
      client:
        config:
          #default:
            #连接超时时间
            #connectTimeout: 3000
            #读取超时时间
            #readTimeout: 3000
          #服务名
          cloud-payment-service:
            #连接超时时间
            connectTimeout: 1000
            #读取超时时间
            readTimeout: 1000

注意:如果全局配置和指定配置同时存在,则以指定配置为主。


2. 重试机制

OpenFeign 的重试机制默认是关闭的,需要手动开启。

新建如下配置类:

@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer() {
        //return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的

        //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
        return new Retryer.Default(100, 1, 3);
    }
}

由于先前配置了超时时间为1s,所以重试之后的时间为3s:

image-20240425222202476


3. 替换Http客户端

OpenFeign中 http client 如果不做特殊配置,OpenFeign默认使用JDK自带的 HttpURLConnection 发送HTTP请求,由于默认HttpURLConnection没有连接池、性能和效率比较低,所以我们采用阿帕奇的Http客户端替换掉它。


3.1 引入依赖

<!-- httpclient5-->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version>
</dependency>
<!-- feign-hc5-->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>

3.2 配置

#  Apache HttpClient5 配置开启
spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true

4. 请求/响应压缩

对请求和响应进行GZIP压缩,Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。

spring:
  cloud:
    openfeign:
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true

5. 日志打印

OpenFeign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。

OpenFeign 日志有四个级别:

  • NONE:默认的,不显示任何日志。
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
  • FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。

开启日志打印步骤如下:

1)创建配置类:

@Bean
Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
}

2)yml配置:

# feign日志以什么级别监控哪个接口
logging:
  level:
    com:
      zhj:
        cloud:
          apis:
            PayFeignApi: debug

注意:公式为:logging.level + 含有@FeignClient注解的完整带包名的接口名 + debug


6. 综合配置

server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
            #连接超时时间
            connectTimeout: 3000
            #读取超时时间
            readTimeout: 3000
          cloud-payment-service:
            #连接超时时间
            connectTimeout: 1000
            #读取超时时间
            readTimeout: 1000
      httpclient:
        hc5:
          enabled: true
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true

# feign日志以什么级别监控哪个接口
logging:
  level:
    com:
      zhj:
        cloud:
          apis:
            PayFeignApi: debug

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传承汉字,发扬光大!让《米小圈动画汉字》也出一份力吧!

目前社会上出现的诸如“计算机是汉字的掘慕人”、“汉字是行将就木的老人”“必须废除汉字,汉字要走拼音化迷路”等观点,值得重视。专家们说,20年前如提汉字要走拼音化道路,主要是缘于汉字难以输入电脑,而时至今日,汉字在电脑上早已畅通无阻,如果仍坚持“汉字拙劣,必得用拼音文…

SAP 如何控制生产订单发料后不能删除组件

SAP默认的情况下,即使工单中的组件已发料了,但仍可以进行删除的标志。这种情况是不太符合逻辑的,如果真要删除,应该先退料,然后再上删除标志。并不能再物料还是已领料的状态下 就对物料做删除的操作。 如下图 生产订单在已经领料的情况下,仍然的被打上了删除标识。 我们…

【产品经理修炼之道】- 从需求到功能的转化过程

产品经理的最大作用是将需求转化为产品或者功能&#xff0c;从需求到功能&#xff0c;会经历哪些过程&#xff1f;本文总结了从需求到功能的转化过程&#xff0c;希望对你进一步了解有所帮助。 “大部分的产品经理特别是数字化产品经理其核心价值就是如何去解决如何把需求转化为…

MySQL主键:自增id、UUID、雪花算法

视频可看&#xff1a; 动画讲解&#xff1a;为什么不能使用自增ID或者UUID做MySQL的主键&#xff0c;雪花算法生成的主键存在哪些问题_哔哩哔哩_bilibili 一、MySQL分布式架构中&#xff0c;为什么不能使用自增id作为主键 自增主键的好处&#xff1a;写入效率高 弊端&#x…

你只可以转让未使用“通过 Apple 登录”功能的 App。

你只可以转让未使用“通过 Apple 登录”功能的 App。 因为这个问题遇到的比较少&#xff0c;同时也比较难以解决&#xff0c;所以这个问题的答案&#xff0c;必须要开会员我才让你们看。 华丽的开会员分割线 当前问题的主要原因是被接入的账号有30天的封号提示了&#xff0c;…

12(第十一章,数据仓库和商务智能)

目录 概述 目标和原则 基本概念 商务智能 数据仓库 数据仓库建设方法 数据仓库架构组件 加载处理方式 1、历史数据 2、批量变更数据捕获&#xff08;CDC&#xff09; 3、准实时和实时数据加载 活动 运营分析应用 方法 数据仓库构建 架构演进 数据处理过程 数…

Python+Selenium基于PO模式的Web自动化测试框架

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供…

pytest教程-30-测试数据管理插件-pytest-datadir

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest重复执行用例插件pytest-repeat&#xff0c;本小节我们讲解一下测试数据管理插件-pytest-datadir。 在软件测试中&#xff0c;有效管理测试数据对于编写全面的测试用例至关重要。Pytest…

Allure精通指南(04)静态和动态生成报告标记

文章目录 Allure 静态定制报告标记Allure 动态生成报告标记Allure 实现方式选择Allure 分类执行运行epic相关运行feature相关运行story相关运行story相关运行feature和多个story相关&#xff08;取并集&#xff09; Allure 静态定制报告标记 定义和用法&#xff1a; Decorators…

Learn ComputeShader 01 First Computer Shader

使用Unity版本&#xff1a;2019.4.12f1 整体流程&#xff1a; 1添加一个quad object并添加一个无光照材质 2.相机投影模式设置为正交 3.调整quad使其完全显示在相机内 4.创建脚本并且使用计算着色器覆盖quad的纹理 5.创建一个compute shader 前三步完成以后结果应该是这…

深入了解计算机系统——利用循环展开对程序的优化

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 文章目录 一些概念CPE 初步优化消除不必…

Mysql基础篇

1 数据库的三大范式 第一范式&#xff1a;强调的是列的原子性&#xff0c;即数据库表的每一列都是不可分割的原子数据项。 第二范式&#xff1a;在第一范式的基础上&#xff0c;消除非主属性对主属性的部分函数依赖。要求实体的非主键完全依赖于主键。所谓完全依赖是指不能存…

Linux进程间通讯

文章目录 Linux进程间通讯1、进程间通信介绍1.1、进程间通信目的1.2、进程间通信发展1.3、进程间通信分类 2、管道2.1、什么是管道2.2、匿名管道2.2.1、标准输入stdin和标准输出stdout通信2.2.2、父子进程通信2.2.3、父子进程通信现象2.2.4、父子进程通信特性2.2.5、进程池 2.3…

【window环境、Linux环境、QT三种方法实现TCP通信】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Windows环境下实现TCP通信1.服务器2.客户端3.运行 二、Linux环境下实现TCP通信1.服务端2.客户端 三、Qt实现TCP通信1.服务端1.客户端 总结 前言 大多数项目…

RAG文本解析工具open-parse

简介 对于RAG来说&#xff0c;将文本有效的分块(chucking)是很重要的一件事&#xff0c;open-parse是一个用来分块pdf的开源工具&#xff0c;它主要基于视觉驱动(Visually-Driven)的方式来将文档分块&#xff0c;也就是说它不仅仅是按照段落或者字数来对文档分块&#xff0c;而…

easyx 按键信息

前言 看看代码吧 ExMessage msg { 0 }; bool button(int x, int y, int w, int h, const char* text) {//绘制按钮setfillcolor(RGB(230, 231, 232));fillroundrect(x, y, x w, y h, 5, 5);if ((msg.x > x && msg.x<x w && msg.y>y && …

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

目录 1.分表 2.分库 说白了&#xff0c;分库分表是两回事儿&#xff0c;大家可别搞混了&#xff0c;可能是光分库不分表&#xff0c;也可能是光分表不分库&#xff0c;都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT …

java反序列化之URLDNS链学习

一、前言 近来学习java反序列化&#xff0c;听p神所说这个URLDNS利用链比较好理解&#xff0c;故决定由此进入学习的第一篇。 URLDNS是Java反序列化中比较简单的一个链&#xff0c;由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检…

hertzbeat 源码阅读记录

关于自定义标签的说明 EmailValid.java HostValid PhoneNumValid 枚举值说明&#xff1a;

【OpenGL实践08】现代渲染管线在GLUT和Pygame和Qt.QOpenGLWidget上各自的实现代码

Qt.QOpenGLWidget进行现代渲染管线实验效果 一、说明 据说QOpenGLWidget是用来取代QGLWidget的继承者&#xff0c;我们试图将GLUT上的旧代码改成QOpenGLWidget&#xff0c;本以为差别不大&#xff0c;轻易搞定&#xff0c;经实践发现要付出极大努力才能完成。经多次实验发现G…