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,一经查实,立即删除!

相关文章

[Uniapp]携带参数跳转界面(两种方法)

一、方法1:路由携参 假设现在有两个界面:界面A和界面B。并要由界面A跳转到界面B,则我们可以使用 uni.navigateTo({}) 跳转界面时,将参数附加在URL后&#xff0c…

newSingleThreadExecutor和newFixedThreadPool(1)的区别

维护仅有一个线程的线程池有如下两种方式,正常使用的情况下,二者差异不大;复杂使用环境下,二者存在细微的差异。用newSingleThreadExecutor方式创建的线程池在任何时刻至多只有一个线程,因此可以理解为用异步的方式执行…

Android中 在目录下创建文件的权限添加 流程

Android中读写目录涉及到的权限一般有三个,一个是selinux, 另一个是用户组, 还有一个是目录本身权限问题,本文章针对这三点做详细解析 目录 一: Selinux权限问题 1: 先查看进程SSSPID的标签 2: 再查看要访问的目录的标签 二: 被访问目录本身权限问…

《剑指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…

第二节 JDBC SQL语法

结构化查询语言(SQL)是一种标准化语言,允许对数据库执行操作,例如:创建数据记录,读取内容,更新内容和删除数据记录等。 本教程中将概述SQL,这是了解和学习JDBC概念的前提条件。 经过本章后,您将…

【C++】7-1 简单加法 分数 15

7-1 简单加法 分数 15 全屏浏览 切换布局 作者 刘利 单位 惠州学院 编写add函数,通过函数重载,实现对变量num,增加值n。num增加n的规则如下: 如果num和n都是数值,则num的值变为numn。 如果num为字符,…

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

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

【英语学习(1)】学习工具和学习习惯培养(自用向,非专业!持续更新中)

我英语一直一直一直就是学不好,好痛苦!!!!~~~~最近又重拾了激情,因此分享一下我的学习经历~大家共勉!!! 一、对话工具挑选 我的朋友们英语大多都很好,所以我根…

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 应用时,服务器都需要保存和跟踪用户的状态&…

探究与以太坊智能合约的交互

# 概述 智能合约是部署在区块链上的一串代代码,通常我们与智能合约的打交道 可以通过前端的Dapp,etherscan,metamask 等方式。作为开发人员可以通过调用提供的相关包来与之交互,如web3.js,ether.js , web3.j(java 语言…

外部存储空间

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,找到内存分…

什么样的计算机专业应届生好找工作

什么样的计算机专业应届生好找工作 引言 计算机技术在现代社会中扮演着至关重要的角色,因此,计算机专业的就业前景一直备受关注。对于即将毕业的计算机专业应届生来说,找到一份满意的工作是他们的首要目标。但是,如何在竞争激烈…

网安笔记(二)

十三、OSI七层模型 OSI七层模型是一种将计算机通信协议按照功能分层的模型。每一层都有明确定义的功能和协议规范,各层之间可通过接口互相调用,以实现数据通信和交换。这些层分别是: 1. 应用层(Application Layer)&am…

前端最简单的方法,实现字段拼接

在前端实现两个字段的拼接是一个非常基础且常见的需求,可以通过多种编程语言和技术来实现,这里主要以JavaScript为例,介绍几种简单的方法: 1. 使用加号()运算符 JavaScript中最直观的字符串拼接方式是使用…