SpringCloud之OpenFeign入门与实战系列

目录

一、什么是 OpenFeign?

1.1 OpenFeign 功能升级

二、OpenFeign超时重试机制

2.1 超时重试机制

2.2 自定义超时重试机制

2.2.2 自定义超时重试类

2.3 OpenFeign 超时重试的底层原理


一、什么是 OpenFeign?

OpenFeign 的全称为 Spring Cloud OpenFeign(下文简称 Openfeign),是 Spring Cloud 团队开发的-款基于 Feign 的框架,声明式 Web 服务客户端。

Feign 是 Netflix 开源的一个声明式的 Web 服务客户端,它简化了基于 HTTP 的服务调用,使得服务间的通信变得更加简单和灵活。Feign 通过定义接口、注解和动态代理等方式,将服务调用的过程封装起来,开发者只需要定义服务接口,而无需关心底层的 HTTP 请求和序列化等细节。

1.1 OpenFeign 功能升级

OpenFeign 在 Feign 的基础上提供了以下增强和扩展功能:

  1. 更好的集成 Spring Cloud 组件:OpenFeign 与 Spring Cloud 其他组件(如服务发现、负载均衡1.等)紧密集成,可以无缝地与其他 Spring Cloud 组件一起使用。
  2. 支持 @FeignClient 注解:OpenFeign 引入了 @FeignClient 注解作为 Feign 客户端的标识,可以方便地定义和使用远程服务的声明式接口。
  3. 错误处理改进:OpenFeign 对异常的处理做了增强,提供了更好的错误信息和异常处理机制,使得开发者可以更方便地进行错误处理。例如 OpenFeign 提供的错误解码器(DefaultErrorDecoder)和回退策略(当服务端返回错误响应或请求失败时,OpenFeiqn 会调用回退策略中的逻辑,提供一个默认的处理结果)。
  4. 更丰富的配置项:OpenFeign 提供了丰富的配置选项,可以对 Feign 客户端的行为进行灵活的配置,例如超时设置、重试策略等。 

前两点就不必多说,对于三四两点,我们可以展开聊聊,第三点错误处理改进,可以让我们在运行SpringCloud项目的情况下,通过SkyWalking可以更精确的发现和修改错误。

关于OpenFeign的基本使用,博主在上一篇入门与实战Nacos系列的消费者实现模块已经说明:

SpringCloud之Nacos入门与实战系列-CSDN博客,因此我们这篇博客主要讲将OpenFeign的超时重试机制和自定义超时重试机制。

二、OpenFeign超时重试机制

2.1 超时重试机制

在微服务架构中,服务之间是通过网络进行通信的,而网络是非常复杂性和不稳定的,所以在调用服务时可能会失败或超时,那么在这种情况下,我们就需要给 OpenFeign 配置超时重试机制了。

什么是超时重试?

答:超时重试是一种在网络通信中常用的策略,用于处理请求在一定时间内未能得到响应或得到超时响应的情况。当发起请求后,如果在规定的时间内没有得到预期的响应,就会触发超时重试机制,重新发送请求。
超时重试的主要目的是提高请求的可靠性和稳定性,以应对网络不稳定、服务不可用、响应延迟等不确定因素。

OpenFeign 默认情况下是不会自动开启超时重试的,所以想要开启超时重试,需要通过以下2 步来实现:

  1. 配置超时重试
  2. 覆盖 Retryer 对象

覆盖超时重试 

spring:cloud:openfeign:client:config:default:    # 全局配置connect-timeout: 1000 # 连接超时时间 1sread-timeout: 1000 # 读取超时时间 1s

 覆盖 Retryer 对象

package com.example.consumer.config;import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RetryerConfig {@Beanpublic Retryer retryer() {return new Retryer.Default(1000,3000,3);}
}

观察源码,我们可以发现:默认提供的Default对象,最大尝试次数一开始就是1,那也就是说,我们刚刚设置最大重试次数为3,那么其实只会重试2次,因为第一次也被算进去了。 

每次尝试之后,会进行+1操作: 

2.2 自定义超时重试机制

2.2.2 自定义超时重试类

常见的超时重试策略有以下三种:

  • 固定间隔重试:每次重试之间的时间间隔固定不变,例如每次重试之间相隔 1秒。
  • 指数重试:每次重试之间的时间间隔按指数递增。例如,初始间隔为1秒,每次重试后加倍,即第2.一次 1 秒,第二次 2 秒,第三次 4秒,以此类推。
  • 随机间隔重试:每次重试之间的时间间隔是随机的,通过引入随机性来防止多个失败请求同时发生。例如,每次重试的时间间隔在一定范围内随机选择。
package com.example.consumer.config;import feign.RetryableException;
import feign.Retryer;import java.time.LocalDateTime;public class CustomRetryer implements Retryer {private final int maxAttempts; //最大尝试次数private final long period;   // 重试间隔时间private int attempt;      // 当前尝试次数public CustomRetryer() {maxAttempts = 3;attempt = 1;period = 1000;}@Overridepublic void continueOrPropagate(RetryableException e) {if (this.attempt++ >= this.maxAttempts) {throw e;}long interval = this.period;System.out.println(LocalDateTime.now() + "| 执行一次重试:" + interval);try {Thread.sleep(interval*(attempt));} catch (InterruptedException ex) {throw new RuntimeException(ex);}}@Overridepublic Retryer clone() {return null;}
}

 设置配置文件:

spring:application:name: nacos-consumer-demo # 注意这里填写的是服务名 (并且命名不要使用 下划线_)cloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-enabled: false # 由于是消费者,所以这里不进行注册到注册中心openfeign:client:config:default:            # 全局配置connect-timeout: 3000  # 连接超时时间 2sread-timeout: 1000 # 读取超时时间 1sretryer: com.example.consumer.config.RetryerConfig # 自定义失败重试类
server:port: 8080 # 作为消费者,那就需要设置一个固定的端口号,

2.3 OpenFeign 超时重试的底层原理

该模块是照搬OpenFeign 的超时重试机制以及底层实现原理_openfeign重试机制-CSDN博客作为自己学习的记录。

① 加注解

        在启动类或者配置类上添加 @EnableFeignClients注解
② 动态代理

        这个注解会触发Spring框架的自动配置机制,扫描所有标记有@FeignClient的接口,并为它们创建代理实例

③ RequestTemplate 发送HTTP请求

        此处的 RequeustTemplate 我们可以理解为 RestTemplate,因为他俩的目的相同。OpenFeign 不能直接发送 HTTP 请求,它在动态代理里面做了一件事,它将注解里面请求的路由地址拿出来,然后就能拼出来一个 URL 请求的地址,然后再使用 RequestTemplate(RestTemplate)去发送 HTTP 请求。

④ RestTemplate 依靠 HTTP 框架实现 web 请求 (把它理解为 RestTemplate)

        RestTemplate 只是一个模板方法类,它只是规定了一个调用的 API,它底层并没有实现,它依靠的是 HTTP 框架实现的 web 请求 (阿帕奇的 HttpClient 框架)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《剑指offer》14--剪绳子(整数拆分)[C++]

目录 题目描述 贪心算法 输出结果 题目描述 把一根绳子剪成多段,并且使得每段的长度乘积最大。 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释:…

Android开发技术总结,附项目源码

今天本文主要讲解: APK文件反编译 什么是反编译如何防止反编译APK文件的基本构造 APK加固的方案原理 APK加固总体架构APK打包基本流程Dex文件的意义 AES加密项目实战 APK加固项目实战APK脱壳技术实战 一.APK文件反编译 1.什么是反编译 定义: 利用…

Java后端核心——Servlet

目录 一.概述 二.基础实现 1.导入坐标 2.定义实现类 3.注解 4.访问Servlet 三.执行流程 四.生命周期 1.加载和实例化 2.初始化 3.请求处理 4.服务终止 五.方法 1.init 2.service 3.destroy 4.getServletInfo 5.getServletConfig 六.体系结构 七.urlPatter…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能: 提供用户名和密码输入框。当用户提交表单时,阻止默认提交行为。使用正则表达式验证用户输入的内容,判断输入的是有效的邮箱地址还是身份证号码。根据验证结果,在输入框下方显示相应的提示信息。 实现逻辑&a…

ZYNQ--PS_PL交互(AXI_HP)

AXI_HP接口 通过AXI_HP接口,可直接通过AXI_FULL协议向DDR中通过DMA传输数据。 BD设计 AXI_HP接口设置 AXI_Master代码 module axi_full_master #(parameter C_M_TARGET_SLAVE_BASE_ADDR = 32h40000000,parameter integer C_M_AXI_BURST_LEN = 16,parameter integer …

DiskMirror-spring-boot-starter 技术|

DiskMirror-spring-boot-starter 技术 diskMirror 实现了 SpringBoot 的 starter 能够集成到 SpringBoot 中。 DiskMirror 的 starter,通过引入此类,可以直接实现 diskMirror 在 SpringBoot 中的自动配置,接下来我们将使用案例逐步的演示 d…

[202403]xavier nx環境配置流程記錄

xavier nx環境配置流程記錄 引言1.板子環境2.設置默認python和pip2.安裝torch和torchvision2.1 下載正確的whl安裝文件2.2 開始安裝2.3 查看torch安裝情況 3.問題記錄3.1 問題1:Running pip as the root user can result in broken permissions3.2 問題2&#xff1a…

Java Web(八)--Servlet(三)

会话技术 为什么需要? 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据; 用户通过浏览器访问 Web 应用时,服务器都需要保存和跟踪用户的状态&…

外部存储空间

1. 存储在外部 私有 存储空间 /storage/emulated/0/Android/data/com.tiger.chapter06/files/Download/1709636015824.txt package com.tiger.chapter06;import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; impo…

linux kernel物理内存概述(六)

目录 伙伴系统 1、什么是伙伴? 2、伙伴系统的分配原理 3、伙伴系统回收 伙伴系统 1、什么是伙伴? 伙伴必须是大小相同并且在物理上连续的两个或者多个页。 2、伙伴系统的分配原理 首先根据内存分配接口函数gfp_t gfp_mask,找到内存分…

分布式事务Seata

分布式事务与Seata落地 一、事务基础 1.1 本地事务 事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。 1.2 本地事务特性 本地事务四大特性: ACID A:原…

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 2024年01月03日 10:38186浏览 3喜欢 0评论 视频地址: SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 好想 特征点匹配,为了计算位姿 特征点:关键点描述子&#xff08…

第五十回 插翅虎枷打白秀英 美髯公误失小衙内-mayfly-go:web 版 linux、数据库等管理平台

晁盖宋江和吴用到山下迎接雷横上山,宋江邀请雷横入伙,雷横以母亲年事已高为由拒绝了。 雷横回到郓城,听李小二说从东京新来了个表演的叫白秀英,吹拉弹唱跳,样样精通,于是雷横和李小二一起到戏院去看演出。…

Python爬虫实战第三例【三】(下)

零.前情提要: 没有看上一章的小伙伴,建议先去看上一章,避免有些知识点不连贯 地址:Python爬虫实战第三例【三】【上】-CSDN博客 在上一章,我们经过分析.m3u8文件和.ts文件后,成功爬取到了所有.ts文件的文…

冒泡经典题

📑前言 本文主要是【】——简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句:狠…

RN开发搬砖经验之-Android平台下处理后退按钮事件

基本接口 利用RN 针对Android平台提供的接口 BackHandler BackHandler需要区分类组件跟函数组件的场景,主要是两个组件一个基于组件生命周期的,一个是基于hook的,即注册BackHandler的事件监听与移除时机写法不同。 类组件 示例代码 impor…

使用J-Link | OPENSDA 调试S32K144开发板

一、S32DS下载 使用的开发软件为S32DS,可以到NXP官网下载:链接,也可以通过网盘:链接 二、对S32K144开发板进行调试 调试方法一: S32K144开发板自带一个OPENSDA MCU,我们可以通过一根Mircro USB线连接到电…

计算机网络-第3章 数据链路层

主要内容:两个信道及对应的协议:点对点信道和广播信道,扩展以太网和高速以太网 本章的分组转发为局域网内的转发,不经过路由,网络层分组转为为网络与网络之间的转发,经过路由。局域网属于网络链路层的范围…

springboot3.x 以上,官方不建议使用spring.factories

springboot2.7.x 以上,官方不建议使用spring.factories 最近公司项目升级.需要将springcloud/springboot版本升级到2.7.x以上,再升级的过程中遇到了太多的问题.总结在了如下文章中: springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本 这篇文章就重点是梳理一…

LeetCode 热题 100 (尽量ACM模式刷) 持续更新!!!

LeetCode 热题 100 哈希hash 1 两数之和 /** 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案…