Spring-Cloud-Openfeign如何做熔断降级?

微服务系统中为了防止服务雪崩问题,服务之间相互调用的时候一般需要开启熔断与降级,下面就来看下feign如何集成hystrix来做熔断与降级。

依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--高版本才需要单独引入-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.10.RELEASE</version>
</dependency>

需要说明的是,低版本的feign默认已经依赖了hystrix,不需要添加额外的依赖,但是高版本的feign默认并没有依赖hystrix,因此需要额外导入hystrix的依赖。
在这里插入图片描述

降级

所谓的降级就是在服务之间相互调用的时候,如果提供者抛出了异常,消费者并不会同步的也抛出异常,而是给客户端返回一个降级以后的结果,我们可以给FeignClient添加fallbackFactory来指定降级以后的处理逻辑。

1)让feign开启降级

feign:hystrix:enabled: true

2)给FeingClient添加fallbackFactory

比如我们有一个UserClient:

@FeignClient(value = "userservice",url = "http://localhost:8081",fallbackFactory = UserFallbackFactory.class,configuration = FeignConfig.class)
public interface UserClient {@GetMapping("/user/{id}")public User queryById(@PathVariable("id") Long id);
}

3)实现UserFallbackFactory自定义降级逻辑

public class UserFallbackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable cause) {return new UserClient(){@Overridepublic User queryById(Long id) {return new User(0L, "fallback user", "fallback address");}};}
}

4)UserFallbackFactory配置到FeignConfig中

UserClient会引用这个配置,从而找到UserFallbackFactory这个bean。

public class FeignConfig {@Beanpublic UserFallbackFactory userFallbackFactory(){return new UserFallbackFactory();}
}

测试一下

如果userservice接口异常,浏览器并不会抛出异常,而是返回将降级以后的结果:
在这里插入图片描述

熔断

所谓的熔断就是说假如服务提供者现在已经异常了,消费者就没有必要继续去调用了,反正调用也是失败,干错直接走降级逻辑。那么,hystrix是如何来判断应该是直接走降级逻辑还是应该发起远程调用?这里边主要有以下几个参数:

配置

hystrix:command:default:metrics:rollingStats:timeInMilliseconds: 5000circuitBreaker:requestVolumeThreshold: 2errorThresholdPercentage: 50sleepWindowInMilliseconds: 10000

以上几个参数的含义是: 5秒(timeInMilliseconds)以内,请求次数达到2个(requestVolumeThreshold)以上,失败率达到50%(errorThresholdPercentage)以上,则开启熔断10秒(sleepWindowInMilliseconds)。

测试一下

连续访问10次接口,order-service的输出:

2023-09-08 09:32:44.144  INFO 4364 --- [nio-8080-exec-1] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:44.806  INFO 4364 --- [nio-8080-exec-2] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:45.408  INFO 4364 --- [nio-8080-exec-3] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:45.781  INFO 4364 --- [nio-8080-exec-4] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:45.981  INFO 4364 --- [nio-8080-exec-5] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:46.261  INFO 4364 --- [nio-8080-exec-6] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:46.541  INFO 4364 --- [nio-8080-exec-7] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:46.792  INFO 4364 --- [nio-8080-exec-8] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:47.029  INFO 4364 --- [nio-8080-exec-9] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1
2023-09-08 09:32:47.258  INFO 4364 --- [io-8080-exec-10] com.github.xjs.web.OrderController       : OrderController.queryById(), id=1

user-service的输出:

2023-09-08 09:32:44.358 ERROR 9788 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 查询用户异常] with root cause
2023-09-08 09:32:44.812 ERROR 9788 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 查询用户异常] with root cause

很显然,前面2次调用失败以后,开启了熔断,后面的8个请求都是直接走的降级逻辑,请求并没有到后端的user-service。

熔断器的工作原理

背后的原理就是AOP,hystrix会拦截并统计远程调用的结果,如果达到熔断的条件,就开启熔断,开启熔断以后,请求就不会到后端的微服务了。当然也不能一直熔断,sleepWindowInMilliseconds时间以后,如果再有新的调用,hystrix会放行一个请求到后端的微服务,如果请求还是失败的,则继续保持熔断,走降级逻辑,如果请求是成功的,则关闭熔断,正常调用后端的微服务。

断路器控制熔断和放行是通过状态机来完成的:
在这里插入图片描述
完整的源码下载:https://github.com/xjs1919/enumdemo

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

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

相关文章

Full authentication is required to access this resource解决办法

我们在使用postman调接口时候&#xff0c;有的时候需要权限才可以访问&#xff0c;否则可能会报下面这个错误 {"success": false,"message": "Full authentication is required to access this resource","code": 401,"result&q…

浏览器缓存机制及其分类

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 强缓存&#xff08;Cache-Control 和 Expires&#xff09;⭐ 协商缓存&#xff08;ETag 和 Last-Modified&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几…

四川百幕晟科技:抖音新店怎么快速起店?

抖音作为全球最大的短视频平台&#xff0c;拥有庞大的用户基础和强大的影响力&#xff0c;成为众多商家宣传产品、增加销量的理想选择。那么&#xff0c;如何快速开店并成功运营呢&#xff1f;下面描述了一些关键步骤。 1、如何快速开新店&#xff1f; 1、确定产品定位&#x…

JVM GC垃圾回收

一、GC垃圾回收算法 标记-清除算法 算法分为“标记”和“清除”阶段&#xff1a;标记存活的对象&#xff0c; 统一回收所有未被标记的对象(一般选择这种)&#xff1b;也可以反过来&#xff0c;标记出所有需要回收的对象&#xff0c;在标记完成后统一回收所有被标记的对象 。它…

geopandas笔记:汇总连接两个区域的边

比如这样的两个区域&#xff0c;我们想知道从蓝到绿、从绿到蓝都有哪些边 1 读取openstreetmap import osmnx as ox import geopandas as gpdGox.graph_from_place(Singapore,simplifyTrue,network_typedrive)ox.plot_graph(G) 2 得到对应的边的信息 nodes,edgesox.graph_to_…

正中优配:股票出现xd是好还是坏?

近年来&#xff0c;股票市场的日渐成熟和开展使得出资者们关于股票价格的涨跌也愈加灵敏&#xff0c;特别是股票呈现XD之后&#xff0c;更是引起了一系列热议。那么&#xff0c;股票呈现XD是好还是坏&#xff1f;本文将从多个角度进行剖析。 首要&#xff0c;需要清晰XD的定义…

2023年9月制造业NPDP产品经理国际认证报名来这错不了

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

java Math类中的random方法和Random类中方法的区别

文章目录 Math类中的random()方法Random类 Math类中的random()方法 Math类中的random()方法没有参数&#xff0c;它会默认返回等于0.0、小于1.0的double类型随机数。对double()方法返回的数字稍加处理&#xff0c;即可实现任意范围随机数的功能 public class MathTest {publi…

vue 前端 问题整理

列表显示字典数据 template里面的vue代码 <el-table-column label"性别" align"center" prop"sex"><template #default"scope"> <!-- <dict-tag :optionssysUserSex :value"scope.row.sex&quo…

Redis持久化、主从与哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次数…

【Linux】让笔记本发挥余热,Ubuntu20.04设置WiFi热点

Ubuntu20.04设置WiFi热点 由于卧室距离客厅较远&#xff0c;wifi信号太弱&#xff0c;体验极差。鉴于卧室的笔记本电脑是通过网线连接的客厅路由器&#xff0c;因此考虑将这台老破笔记本作为“路由器”&#xff0c;以便发挥它的余热。实验证明&#xff0c;上网速度提升数十倍&a…

Kubectl 使用详解——k8s陈述式资源管理

目录 一、kubectl 简介 二、kubectl 的使用 1.基础用法 &#xff08;1&#xff09;配置kubectl自动补全 &#xff08;2&#xff09;查看版本信息 &#xff08;3&#xff09;查看资源对象信息 &#xff08;4&#xff09;查看集群信息 &#xff08;5&#xff09;查看日志…

taro vue3 ts nut-ui 项目

# 使用 npm 安装 CLI $ npm install -g tarojs/cli 查看 Taro 全部版本信息​ 可以使用 npm info 查看 Taro 版本信息&#xff0c;在这里你可以看到当前最新版本 npm info tarojs/cli 项目初始化​ 使用命令创建模板项目&#xff1a; taro init 项目名 taro init myApp …

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

今天聊TC3xx HSM系统,包括所用内核、UCB相关信息、Host和HSM交互方式。 1、HSM系统架构 下图来源于英飞凌官网培训材料。 TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及T…

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题&#xff0c;参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议&#xff0c;因此题目的本质是判断是否存在重叠区间 将区…

30天入门Python(基础篇)——第2天:Python安装(保姆级)与IDE的认识与选择+详细安装教程

文章目录 专栏导读上一节课回顾1、Python解释器的安装查看各个版本的Python解释器①、ok,双击安装②、这里我们选择【自定义】安装&#xff0c; 下面的【将Python添加在环境变量】大家一定要打个勾③、点击【Next】进行下一步④、这里不建议安装在C盘, 点击【Browse】我在F盘创…

C++ 多态

引例&#xff1a; #include<iostream> using namespace std; class Animal { public:void speak(){cout<<"动物在说话"<<endl;} }; class Cat:public Animal { public:void speak(){cout<<"小猫在说话"<<endl;} }; void Do…

多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步

在并发编程中实现原子操作可以使用锁&#xff0c;锁机制满足基本的需求是没有问题的了&#xff0c;但是有的时候我们的需求并非这么简单&#xff0c;我们需要更有效&#xff0c;更加灵活的机制&#xff0c;synchronized关键字是基于阻塞的锁机制&#xff0c;也就是说当一个线程…

CSS整理

目录 CSS中的& 弹性&#xff08;display:flex&#xff09;布局 flex的对齐方式 justify-content align-items flex-wrap 弹性盒换行 flex:1 flex属性 flex-grow&#xff1a;项目的放大比例 flex-shrink&#xff1a;收缩 flex-basis&#xff1a;初始值&#xff…

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用&#xff0c;以下是一些可能的应用领域&#xff1a; 工业过程控制&#xff1a; GE IS220…