OpenFegin

news/2024/10/9 3:03:24 标签: java

文章目录

  • 一、OpenFegin是什么?
  • 二、基本使用
  • 三、超时重试机制
  • 4.自定义超时重传机制
  • 五、底层实现

一、OpenFegin是什么?

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

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

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

二、基本使用

基本使用在之前的nacos注册中心时已经演示 可以点击观看nacos注册中心

三、超时重试机制

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

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

OpenFeign默认情况下是不会自动开启超时重试的,所以想要开启超时重试,需要通过以下2步来实现:
1.配置超时重试
2.覆盖Retryer对象

java">    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000 # 连接超时时间
            read-timeout: 1000 # 读取超时时间
java">@Configuration // 将当前对象存储在 IoC 容器
public class RetryerConfig {
    @Bean
    public Retryer retryer(){
        return new Retryer.Default(1000,1000,3);
    }
}

而这里的1000,1000,3 分别代表重试间隔时间,最大重试间隔时间,最大重试次数

java">    @RequestMapping("/getnamebyid")
    public String getNameById(Integer id) throws InterruptedException {
        System.out.println("-------------------- Do Provider getNameById method."
                + LocalDateTime.now());
        Thread.sleep(1500);
        return "provider-name-" + id +
                " | port:" + context.getWebServer().getPort();
    }

设置的读取超时时间为1秒 我们手动让线程休眠1.5秒那么就会触发超时重传机制
在这里插入图片描述
结果是符合预期的

4.自定义超时重传机制

自定义超时重试机制的实现分为以下两步:
1.自定义超时重试类(实现Retryer接口,并重写continueOrPropagate方法)。
2.设置配置文件。

常见的超时重试策略有以下三种:
1.固定间隔重试:每次重试之间的时间间隔固定不变,例如每次重试之间相隔1秒。
2.指数重试:每次重试之间的时间间隔按指数递增。例如,初始间隔为1秒,每次重试后加倍,即第一次1秒,
第二次2秒,第三次4秒,以此类推。
3.随机间隔重试:每次重试之间的时间间隔是随机的,通过引入随机性来防止多个失败请求同时发生。例如,每
次重试的时间间隔在一定范围内随机选择。

java">
/**
 * 自定义超时重传类
 */
public class CustomRetryer implements Retryer {

    private final int maxAttempts;  // 最大尝试次数
    private final long backoff;     // 超时间隔时间
    int attempt; // 当前尝试次数

    public CustomRetryer() {
        this.maxAttempts = 3;
        this.backoff = 1000L;
        this.attempt = 0;
    }

    @Override
    public void continueOrPropagate(RetryableException e) {
        if (attempt++ >= maxAttempts) {
            throw e;
        }
        long interval = this.backoff; // 重试间隔时间
        System.out.println(LocalDateTime.now() + " | 执行一次重试:" + interval);
        try {
            Thread.sleep(interval * attempt);
        } catch (InterruptedException ex) {
            throw new RuntimeException(ex);
        }
    }

    @Override
    public Retryer clone() {
        return new CustomRetryer();
    }
}

在这里插入图片描述
可以看到重试时间符合我们的预期

java">spring:
  application:
    name: nacos-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false # 消费者(不需要将此服务注册到nacos)
    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000 # 连接超时时间
            read-timeout: 3000 # 读取超时时间
            retryer: com.example.consumer.config.CustomRetryer

五、底层实现

OpenFeign超时的底层实现是通过配置底层的HTTP客户端来实现的。OpenFeign允许你在请求连接和读取数据
阶段设置超时时间,具体的超时配置可以通过设置HTTP客户端的连接超时(connectTimeout)和读取超时
(readTimeout)来实现,你可以在配置文件中设置超时参数。
OpenFeign底层的HTTP客户端,可以使用Apache HttpClient或OkHttpClient来实现,默认使用的是Apache
HttpClient实现的。


http://www.niftyadmin.cn/n/5695172.html

相关文章

MySQL数据库备份与恢复的深度解析

作为一名资深DBA,深知数据库备份与恢复在企业数据管理中的重要性。数据是企业的核心资产,任何数据的丢失都可能对业务造成不可挽回的损失。本文将深入探讨MySQL数据库的备份与恢复策略,旨在帮助您建立健全的数据保护机制。 一、为什么备份与…

String、StringBuilder

internal class Mainclus { internal static void Main(string[] args) { //创建方式 string a = "*world"; string new1 = "hello*world"; string new2 = "hello" + "*world"; …

AI时代来袭,程序员怎样才能不被淘汰?

大家好!今天我们来聊聊一个非常热门的话题:在AI时代,程序员应该如何提升自己,避免被行业淘汰。 随着人工智能技术的飞速发展,很多传统职业都面临着重新定义的挑战,程序员也不例外。那么,作为一…

ChatGPT推出Canvas功能

"Canvas" 是 OpenAI 推出的全新界面,专为增强写作和编程协作而设计。它让用户能够在聊天之外更高效地进行编辑、审阅和反馈,提供了内联编辑、代码调试和文档版本控制等功能。目前,"Canvas" 已面向 ChatGPT Plus 和 Team …

【JavaEE】【多线程】Thread类讲解

目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用…

技术图书推荐与管理系统(针对云计算技术与人工智能领域)

1.产品介绍 产品介绍方案 产品名称 智云图管:AI驱动的云计算技术图书推荐与管理系统 主要功能 智能图书推荐 基于用户的历史阅读记录、兴趣偏好及实时行为数据,采用先进的协同过滤和内容推荐算法,为用户提供个性化的图书推荐。支持多维度…

单片机(学习)2024.10.8

ok家人们,国庆回来继续开始新的单片机的学习,这次学习的单片机芯片为STM32U575RIT6 计算机基础 IO逻辑 计算机系统中的高低电平逻辑1和0,数据在计算机中的存储、传输、运算都是以二进制形式进行的。数据的传输通过总线真正传递的是电信号&a…

【unity进阶知识9】序列化字典,场景,vector,color,Quaternion

文章目录 前言一、可序列化字典类普通字典简单的使用可序列化字典简单的使用 二、序列化场景三、序列化vector四、序列化color五、序列化旋转Quaternion完结 前言 自定义序列化的主要原因: 可读性:使数据结构更清晰,便于理解和维护。优化 I…