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…

docker配置nginx,并部署多个项目

前言 基于开发需要需要使用Docker安装nginx&#xff0c;并部署多个前端项目。 1、docker安装nginx容器 docker pull nginx# 挂载项目静态资源和配置文件 docker run --name nginx -p 8088:8088 \ -v /ruoyi/nginx/html:/usr/share/nginx/html \ -v /ruoyi/nginx/conf/nginx…

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_…

基于Spring Boot的酒店客房管理系统

文章目录 项目介绍主要功能截图:后台:前台部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的酒店客房管…

一键切换开发环境

一键切换开发环境 在我们正常开发中&#xff0c;经常会遇到切换代理环境的问题&#xff0c;总不能每次切换的时候都需要重启吧 解决方案&#xff1a; 1.1 利用host解决代理问题&#xff0c;代码如下 devServer: {proxy: 127.0.0.1,...}1.2. 需要有起一个node 服务 &#xff…

Spring Bean 的作用域(Bean Scope)

前言 大家好&#xff0c;我是 god23bin&#xff0c;今天我们来聊一聊 Spring 框架中的 Bean 作用域&#xff08;Scope&#xff09;。 什么是 Bean 的作用域&#xff1f; 我们在以 XML 作为配置元数据的情况下&#xff0c;进行 Bean 的定义&#xff0c;是这样的&#xff1a; …

标准C++day3——构造、析构函数和初始化列表

一、面向对象和面向过程 面向过程&#xff1a; 关注如何解决问题&#xff0c;以及解决问题的步骤 面向对象&#xff1a; 关注的解决问题的"人"-"对象"&#xff0c;以及实现能解决问题的"对象" 抽象&#xff1a;先找出(想象)能解决问题的"对…

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

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

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

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

设计模式-命令模式

文章目录 前言命令模式简介命令模式的示例代码命令模式使用场景命令模式优缺点 前言 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求发送者和请求接收者解耦&#xff0c;使得可以在不同的上下文中灵活地传递请求&#xff0c;记录…

Gin中的Cookie和Session的用法

Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法介绍Cookie代码演示 Session代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术&#xff0c;主要用于跟踪用户的状态信息。 Cookie func (c *Context) Cookie(name string, value string, max…

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 …