OpenFeign入门

news2024/11/28 15:48:04

OpenFeign是Spring Cloud OpenFeign,是Spring Cloud团队开发的基于Feign的框架

1、OpenFeign功能升级

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

(1)便于集成Spring Cloud组件:OpenFeign与Spring Cloud其他组件(服务发现、负载均衡等)紧密集成

(2)支持@FeignClient注解:OpenFeign引入了@FeignClient注解作为Feign客户端的标识,可以方便地定义和使用远程服务的声明式接口

(3)错误处理改进:OpenFeign对异常处理增强,例如:OpenFeign提供错误编码器(DefaultErrorDecoder)和回退策略(当服务端返回错误响应或请求失败时,OpenFeign调用回退策略中的逻辑,提供一个默认的处理结果)

(4)更丰富的配置项:例如:超时设置、重试策略等

2、OpenFeign基本使用

OpenFeign通常要配合注册中心一起使用,并且新版本OpenFeign也必须和负载均衡器一起使用

(1)添加依赖(Nacos注册中心、OpenFeign、Spring Cloud LoadBalancer)

(2)配置Nacos服务信息

(3)在项目中开启OpenFeign

(4)编写OpenFeign调用代码

(5)编写代码通过OpenFeign调用生产者

代码的基本分块

2.1、添加依赖

总共添加三个依赖:Nacos注册中心、OpenFeign和LoadBalancer(在nacosr入门的时候,添加过这些依赖进行演示)

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.2、配置Nacos服务端信息

以下采用yml格式的配置文件

2.2.1、消费者

spring:
   application:
     name: consumer
   cloud:
     nacos:
       discovery:
         server-addr: localhost:8848
         username: nacos
         password: nacos
         register-enabled: false  #表示注册显示 消费者 不需要显示
server:
  port: 8080

2.2.2、提供者

spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
server:
  port: 9091

2.2.3、提供者业务代码

提供者访问路径 /user/getname 这里的路径的一会要提供给消费者的

@RestController
@RequestMapping("/user")
public class UserController {

    //为了获取端口号 注入webServer相关注解
    @Autowired
    private WebServerApplicationContext serverApplicationContext;

    @RequestMapping("/getname")
    public String getName(@RequestParam("id") Integer id) throws InterruptedException {
        Thread.sleep(1000);
        System.out.println("------超时重试--------"+ LocalDateTime.now());
        return "provider  : "+id+" | port "+serverApplicationContext.getWebServer().getPort();
    }
}

2.3、项目中开启OpenFeign

在消费者的Spring Boot启动类添加@EnableFeignClients注解

2.4、编写OpenFeign调用代码

消费者:接口的访问路径就是远程调用 这里路径是我们要访问提供者的路径,方法和提供者也是一样的,除了没有方法体

@Service
@FeignClient("provider")  // 我们需要远程调用的服务, 也就是生产者名称 我们刚刚写的provider
public interface UserService {
    @RequestMapping("/user/getname") //生产者的调用接口
    public String getName(@RequestParam("id") Integer id);
}

2.5、调用OpenFeign接口代码

@RestController
public class UserController {
    @Autowired   // 注入我们远程调用的接口
    private UserService userService;
    @RequestMapping("/getname")
    public String getName(Integer id){
        return "consumer 调用 "+userService.getName(id);
    }
}

3、超时重试机制

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

超时重传:网络通信中一种策略,请求在一定时间内未能得到响应或得到超时响应的情况,当发起请求后,如果在规定的时间内没有得到预期响应,就会触发超时重试机制,重新发送请求

超时重试的主要目的是提高请求的可靠性和稳定性,以应对网络不稳定,服务不可用、响应延迟等不确定因素

OpenFeign默认情况下是不会自动开启超时重试的,所以想要开启超时重试,需要下面的步骤

(1)配置超时重传

(2)覆盖Retryer对象

3.1、配置超时重试

超时配置消费者访问的时候超时需要配置的,不是提供者

spring:
   application:
     name: consumer
   cloud:
     nacos:
       discovery:
         server-addr: localhost:8848
         username: nacos
         password: nacos
         register-enabled: false  #表示注册显示 消费者 不需要显示
     openfeign:    #OpenFeign配置超时重传配置
       client:
         config:
           default:  #全局配置
             connect-timeout: 1000 #这里是ms单位 连接时间1s
             read-timeout: 1000 # 读取超时时间 1s
server:
  port: 8080

光配置是不行,这里需要从写一下Retryer

3.2、覆盖Retryer

在消费者(consumer)这个子模块中写config层,写一个Retryer注入到对象中

@Configuration
public class RetryerConfig {
    @Bean
    public Retryer retryer(){
        //第一个参数 是 时间间隔   第二个参数 是最大超时时间  第三个参数是最大重试次数
        return new Retryer.Default(
                1000,    
                3000,              
                3
        );
    }
}

4、自定义超时重试机制

自定义超时重试机制的实现分为以下两步:

(1)自定义超时重试类(实现Retryer接口,并重写continueOrPropagate方法)

(2)设置配置文件

4.1、自定义超时重试类

常见超时重试策略有以下三种:
(1)固定间隔重试:每次重试之间的时间间隔固定不变,例如每次重试之间相隔1秒

(2)指数重试:每次重试之间的时间间隔按指数递增。例如,初始间隔为1秒,每次重试后加倍,第一次1s,第二次2s,第三次4s依次类推

(3)随机间隔重试:每次重试之间的时间间隔是随机的,通过引入随机性来防止多个失败请求同时发生,例如,每次重试的时间间隔在一定范围内随机选择

我们这里就写一个类继承Retryer 开始我们的自定义超时重试

我们这里同样是在config层写的

//重写不需要注入 直接会进行覆盖 实现 Retryer接口需要 重写continueOrPropagate和clone
//模仿这写就行
public class CustomRetryer implements Retryer {

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

    public CustomRetryer(){
        this.maxAttempts=3;
        this.backoff=1000;
        this.attempt=0;
    }
    public CustomRetryer(int maxAttempts,long backoff){
        this.maxAttempts=maxAttempts;
        this.backoff=backoff;
        this.attempt=0;
    }
    /*
    * 失败重试方法
    * */

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

    /*
    *克隆创建独立实例
    * */
    @Override
    public Retryer clone() {
        return new CustomRetryer(maxAttempts,backoff);
    }
}

4.2、设置配置文件

只重写重试策略是不行的,还需要进行配置,让重试得时候跑我们自定义重试策略

spring:
   application:
     name: consumer
   cloud:
     nacos:
       discovery:
         server-addr: localhost:8848
         username: nacos
         password: nacos
         register-enabled: false  #表示注册显示 消费者 不需要显示
     openfeign:    #OpenFeign配置超时重传配置
       client:
         config:
           default:  #全局配置
             connect-timeout: 1000 #这里是ms单位 连接时间1s
             read-timeout: 1000 # 读取超时时间 1s
             retryer: com.example.consumer.config.CustomRetryer  #添加路径
server:
  port: 8080

运行结果:

这里的重试是有三次的,会打印四个超时重试,相差时间为2,3,4s,因为我们自定超时重试时间就是按照次数来计算时间的,第一次:间隔时间+1=2s   第二次:间隔时间+2=3s

也就是 间隔时间 + 第几次 = 超时时间

 5、超时重试底层实现

“超时重试”基本就两个动作:“超时”和“重试”,对应底层实现也是不同的

5.1、超时底层实现

OpenFeign超时的底层实现是通过HTTP客户端来实现的

OpenFeign允许你在请求连接和读取数据阶段设置超时时间,具体的超时配置可以通过设置HTTP客户端连接超时(connectTimeout)和读取超时(readTimeout)来实现,你可以在配置文件中设置超时参数

OpenFeign底层的HTTP客户端,可以使用Apache HttpClient或OkHttpClient来实现,默认使用的是Apache HttpClient来实现的

5.2、重试底层实现

通过观察OpenFeign的源码实现就可以了解重试功能的底层实习,它的源码在就是invoke方法,如下所示:

底层实现基于RequestTemplate的

 retryer实现continueOrPropagate方法

 总结:OpenFeign的重试功能是通过其内置的Retryer组件和底层的HTTP客户端实现的,Retryer组件提供了重试策略的逻辑实现,而远程接口则通过HTTP客户端来完成调用

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

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

相关文章

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

汽车电子 - UDS

汽车电子 - UDS 概念基本概念分类请求与响应寻址信息物理寻址功能寻址 协议格式&#xff1f;&#xff1f;&#xff1f;750/758厂家自定义的吗&#xff1f;&#xff1f;&#xff1f;&#xff0c; 所有的UDS服务都在这里边吗&#xff1f;&#xff1f;&#xff1f;&#xff0c;代码…

Redis-缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存保护后端存储的…

Linux:docker容器操作(4)

docker的基础操作 Linux&#xff1a;docker基础操作&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/134616198?spm1001.2014.3001.5501 我这里准备了两个镜像 镜像加载到容器 docker create [选项] 镜像 运行的程序 -i 让容器的标准输…

基于单片机的可升降助眠婴儿床(论文+源码)

1.系统设计 本课题为基于单片机的可升降助眠婴儿床系统&#xff0c;在设计目标上确定如下&#xff1a; 1. 可以实现婴儿床的升降&#xff0c;摇床功能控制&#xff1b; 2. 具有音乐播放功能&#xff0c;并且有多首曲目&#xff1b; 3. 用户可以通过按键或者红外遥控&#x…

6.12找树左下角的值(LC513-M)

算法&#xff1a; 这道题适合用迭代法&#xff0c;层序遍历&#xff1a;按层遍历&#xff0c;每次把每层最左边的值保存、更新到result里面。 看看Java怎么实现层序遍历的&#xff08;用队列&#xff09;&#xff1a; /*** Definition for a binary tree node.* public clas…

openpnp - 给底部相机加防尘罩

文章目录 openpnp - 给底部相机加防尘罩概述笔记END openpnp - 给底部相机加防尘罩 概述 设备标定完, 看着底部相机, 有点担心掉进去东西, 万一从吸嘴掉下去的料(或者清理设备台面时, 不小心掉进去东西)将顶部相机搞短路怎么办. 就想加个防尘罩, 如果有东西掉进去, 可以掉到机…

【机器学习 | 开山篇】打造坚实基础、Kaggle 登榜之路

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering&#xff1a; 提示工程 通过自然语言&#xff08;英语、汉语等&#xff09;来给AI下达指示&#xff0c;从而让AI完成你指定给他的工作的过程都可以称之为提示工程。&#xff08;面向自然语言编程&#xff09; 提示词要素 指令&…

线程的常用方法-wait和notify以及线程的结束方式

再复习一下Java中的线程的状态图 wait和sleep的区别是&#xff1a;wait需要先持有锁&#xff08;wait需要再synchronized代码块中执行&#xff09;&#xff0c;执行后会让出锁。而sleep不需要先持有锁&#xff0c;执行后也不会释放锁&#xff08;有锁的话抱着锁睡觉&#xff09…

2024年天津天狮学院食品质量与安全专业《普通化学》考试大纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《普通化学》考试大纲 一、考试性质 《普通化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

这一款 Mac 系统终端工具,已经用的爱不释手了!

&#x1f525;&#x1f525;&#x1f525;作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 相信大家用的最多的终端工具就是 Xshell、iTerm2和Mobaxterm&#…

Vue框架学习笔记——计算属性

文章目录 前文提要代码需求描述插值语法实现methods实现 计算属性getter执行时间&#xff1a;setter 计算属性简写形式&#xff08;只读不改&#xff0c;才能如此简写&#xff09;slice截取元素&#xff0c;限制输入字符数量 前文提要 本人仅做个人学习记录&#xff0c;如有错…

vue3(二)-基础入门

一、列表渲染 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

聚观早报 |红魔9 Pro支持165W快充;2023Q3欧洲手机市场报告

【聚观365】11月22日消息 红魔9 Pro支持165W快充 2023Q3欧洲手机市场报告 长安汽车官宣加入蔚来换电体系 网龙战略投资Rokid IBM推出5亿美元的风险基金 红魔9 Pro支持165W快充 截至目前&#xff0c;除了已经发布或即将亮相的几款骁龙8 Gen3常规旗舰外&#xff0c;游戏手机…

梯度详解与优化实战

什么是梯度 对所有自变量求偏微分构成的向量&#xff0c;它是一个向量&#xff08;有大小和函数值增长方向&#xff09; 导数是一个标量 找最小值点坐标的案例 import torchimport numpy as np import matplotlib.pyplot as plt def himmelblau(x):return (x[0]**2x[1]-11)…

MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、正弦函数曲线实例

MFC 绘制三种不同圆形以及绘制正弦函数曲线 本文使用visual Studio MFC 平台实现绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线. 关于基础工程的创建请参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-vis…

SpringBoot 环境使用 Redis + AOP + 自定义注解实现接口幂等性

目录 一、前言二、主流实现方案介绍2.1、前端按钮做加载状态限制&#xff08;必备&#xff09;2.2、客户端使用唯一标识符2.3、服务端通过检测请求参数进行幂等校验&#xff08;本文使用&#xff09; 三、代码实现3.1、POM3.2、application.yml3.3、Redis配置类3.4、自定义注解…

部署项目时常用的 Linux 命令

目录 1 前言2 SSH登录命令3 SCP传输命令4 CP拷贝命令5 MV移动命令6 TAR解压命令7 DU查看文件夹/文件大小8 TAIL查看日志9 NOHUP后台运行10 结语 1 前言 在应用部署过程中&#xff0c;Linux命令是必不可少的工具。它们能够帮助我们管理文件、连接服务器、拷贝文件、查看日志以及…

大数据项目--学习笔记

新零售项目介绍 1&#xff0c;行业背景介绍 一&#xff0c;百货商店 百货商店是世界商业史上第一个实行新销售方法的现代大量销售组织。其新型销售方法有&#xff1a; 1&#xff0e;顾客可以毫无顾忌地、自由自在地进出商店&#xff1b; 2&#xff0e;商品销售实行“明码标价…