Springcloud1----->Hystrix

news/2024/7/24 13:14:18/

目录

  • 雪崩问题
  • 服务降级
    • 原理
    • 实践
      • order降级处理
      • user降级处理
  • 服务熔断
    • 原理
    • 实践

hystrix,英文意思是豪猪,全是是刺,一种保护机制,即熔断器。
主页:https://github.com/Netflix/Hystrix/

雪崩问题

在微服务中,服务与服务之间的调用是错综复杂的,一个请求,可能需要调用多个微服务的接口才能实现,会形成非常复杂的调用链路。
如图,一次业务请求,需要调用A、P、H、I四个服务,这四个服务又可能调用其他服务。如果此时,某个服务出现异常,例如微服务I发送异常,请求阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞。而tomcat的最大连接数不能超过700(默认200)。
在这里插入图片描述
如果此时更多的请求阻塞到一个服务器下,当请求耗尽之后,会消耗其他服务器线程从而导致其它服务器都不可用,就形成了雪崩效应。

服务降级

原理

Hystrix 为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队。 用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满 ,或者请求超时 ,则会进行降级处理。
什么是服务降级?
服务降级:优先保证核心服务,而非核心服务不可用或弱可用。

  • 用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息) 。
  • 服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
  • 触发 Hystrix 服务降级的情况:
    1. 线程池已满
    2. 请求超时
    3. 服务爆炸(宕机)

实践

order降级处理

注意: 是服务的消费者请求服务担心返回异常,所以需要在消费者一方配置自己的降级处理,所以我们的操作在消费者一方。
首先引入Hystix依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

开启服务降级
加注解:@EnableCircuitBreaker //开启服务降级

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //开启服务降级
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

在这里插入图片描述
因为我们默认使用了hystrix 所以我们应该处理一下,如果失败之后返回的信息,那么我们应该重新改造一下方法:
controller:

    /*** 根基ID查询* @param id* @return*/@GetMapping("/{id}")@HystrixCommand(fallbackMethod = "ww") //降级处理方法public Order byId(@PathVariable("id") Long id) {Order order = orderService.getById(id);User user = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);order.setUser(user);return order;}/*** 降级的处理方法,要求方法的返回值,参数都要一致* @param id* @return*/public Order ww(@PathVariable Long id){return  new Order();}

在这里插入图片描述
为了能够模拟超时,我们需要改造一下user-service 有意让其返回结果慢一点:
在这里插入图片描述

 @GetMapping("/{id}")public User byId(@PathVariable("id") Long id) {try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}return userService.getById(id);}

结果:
因为user的查询超时,所以order降级处理返回了一个空的order对象
在这里插入图片描述
到了这里大家就应该能明白,Hystrix给我们做的功能就是为了避免雪崩问题,对请求进行了降级处理。

user降级处理

当order请求user时order产生超时user触发降级处理返回一个空的user对象给order来展示。
在这里插入图片描述

在这里插入图片描述

服务熔断

原理

熔断器,也叫断路器(铅丝原理), 英文单词为:CircuitBreaker。
Hystrix熔断器模型:
在这里插入图片描述
工作原理:阈值默认是最近20次请求内,有50%的请求发生降级处理(超时),触发打开熔断器!,此时进入5秒的休眠期,5秒后进入Half open(半开状态)并且放一定的请求通过,测试请求是否正常,如果请求依然失败,直接进入打开状态(5秒循环),如果请求成功,关闭熔断器。
熔断器有三个状态:

  • open状态说明打开熔断,也就是服务调用方执行本地降级策略,不进行远程调用。
  • closed状态说明关闭了熔断,这时候服务调用方直接发起远程调用。
  • half-open状态,则是一个中间状态,当熔断器处于这种状态时候,直接发起远程调用。

实践

首先打开Hystrix配置文件 HystrixCommandProperties:
在这里插入图片描述

  • 第一个为熔断器请求量阈值 默认为20
  • 第二个为熔断器休眠时间窗 默认5s
  • 第三个为熔断器服务错误(降级或者超时) 百分比 默认50%
  • ---- 非案例一般默认即可。

修改 controller 代码去自定义规则

@GetMapping("/{id}")@HystrixCommand(fallbackMethod = "ww",commandProperties = {@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value ="10"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")})public Order byId(@PathVariable("id") Long id) {Order order = orderService.getById(id);User user = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);order.setUser(user);return order;}

在这里插入图片描述
测试:
给controller添加一个异常用来测试

@GetMapping("/{id}")@HystrixCommand(fallbackMethod = "ww",commandProperties = {@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value ="10"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")})public Order byId(@PathVariable("id") Long id) {if (id == 101){throw new RuntimeException("模拟请求异常!!!");}Order order = orderService.getById(id);User user = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);order.setUser(user);return order;}

在这里插入图片描述
测试 多次访问101触发熔断,之后请求102 测试 ==> 102不能正常访问 ==> 代表已经触发了熔断休眠
在这里插入图片描述
10秒后继续测试102 ==> 发现102可以正常访问了 ==> 表示熔断器关闭 恢复正常请求。
在这里插入图片描述


http://www.ppmy.cn/news/75326.html

相关文章

GoLand 2023 Crack函数的支持

GoLand 2023 Crack函数的支持 增加了对“MIN_BY”和“MAX_BY”函数的支持。 更新了Prisma插件previewFeatures以包含jsonProtocol。 改进了与角度相关的符号的文档-添加了更多关于管道、特性和指令的文档。当您将鼠标悬停在符号上或调用显示文档完成时(F1/CtrlQ)&#xff0c;您…

SVN 修改URL路径-使用重新定位(relocate)命令和找不到问题解决

当svn服务器url发生变更,又不想在本地重新进行checkout操作,这时候可以使用svn relocate命令进行url的重新定位; 在windows下以TortoiseSVN为例,在仓库文件夹上右键,TortoiseSVN-(重新定位)relocate, 1、Windows TortoiseSVN客户端: 在工作复本的根目录上右键->TortoiseSV…

是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

华为是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有9.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾…

【笔试强训选择题】Day17.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 前言 目…

深度学习实战项目(一)-基于cnn和opencv的车牌号识别

深度学习实战项目(一)-基于cnn和opencv的车牌号识别 网上大部分是关于tensorflow&#xff0c;使用pytorch的比较少&#xff0c;本文也在之前大佬写的代码的基础上&#xff0c;进行了数据集的完善&#xff0c;和代码的优化&#xff0c;效果可比之前的pytorch版本好一点。 数据…

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录 1. MVC简介 2. SpringMVC简介 3. 路由映射注解 3.1 RequestMapping 3.2 GetMapping与PostMapping 4. 接收前端传递参数 4.1 接收单/多个参数 4.2 接收对象 4.3 接收JSON对象 4.4 后端参数重命名/映射 4.5 设置参数必传/非必传 4.6 获取URL中的参数 4.7 获取文…

PHP程序员的工作内容复杂吗?如何更快完成交代的任务?

我们城里人大部分都是高富帅 &#xff0c;你看那些想进入程序员行业的人&#xff0c;哪个不是冲着高薪而来的。互联网已经深入到我们生活的方方面面&#xff0c;比如你去购物啊&#xff0c;聊天啊&#xff0c;你玩游戏啊&#xff0c;哪个不是我们程序员经历过多少日日夜夜加班给…

mybatis的一对一与一对多

我现在有两个表,是一对多的关系,CREATE TABLE repayment_plan ( ,针对一个还款计划可多次进行还款; 下面请帮我映射成两个bean对象 ID bigint(20) NOT NULL COMMENT 主键, CONSUMER_ID bigint(20) DEFAULT NULL COMMENT 发标人用户标识, USER_NO varchar(50) DEFAULT NULL …

【leetcode】1373. 二叉搜索子树的最大键值和

二叉搜索子树的最大键值和 问题描述问题简单分析提交之旅第一次提交-失败第二次提交-失败第三次提交-成功 问题描述 二叉搜索子树的最大键值和 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&#xff1a; 任意节…

接口测试的流程?怎么设计接口测试用例?两张图给你讲的明明白白

目录 一、简介 二、接口测试的流程 三、为什么要写用例 四、接口用例设计 一、简介 在开始接口测试之前&#xff0c;我们想一下&#xff0c;接口测试的流程是什么&#xff1f;说到这里&#xff0c;有些人就会产生好奇和疑问&#xff0c;心里mmp&#xff1a;接口测试要什么流…

Android Qcom USB Driver学习(十一)

该系列文章总目录链接与各部分简介&#xff1a; Android Qcom USB Driver学习(零) 基于TI的Firmware Update固件升级的流程分析usb appliction layers的数据 USB Protocol Package ①/② map to check password correct Package Format: Byte[0] Report Id Byte[1] Valid L…

阿里三面过了,却无理由挂了,HR反问一句话:为什么不考虑阿里?

进入互联网大厂一般都是“过五关斩六将”&#xff0c;难度堪比西天取经&#xff0c;但当你真正面对这些大厂的面试时&#xff0c;有时候又会被其中的神操作弄的很是蒙圈。 近日&#xff0c;某位测试员发帖称&#xff0c;自己去阿里面试&#xff0c;三面都过了&#xff0c;却被…

IEEE独立出版 | 第七届计算机科学与智能控制国际会议(ISCSIC 2023)

会议简介 Brief Introduction 第七届计算机科学与智能控制国际会议(ISCSIC 2023) 会议时间&#xff1a;2023年10月27日-29日 召开地点&#xff1a;中国南京 大会官网&#xff1a; ISCSIC 2023-2023 7th International Symposium on Computer Science and Intelligent Control(I…

20230520查找中国移动的APP在RK3566下调用UVC摄像头出错

20230520查找中国移动的APP在RK3566下调用UVC摄像头出错 2023/5/20 23:34 SDK&#xff1a;Android12RK3566平台 android12 UVC camera 没插摄像头&#xff0c;但是/dev/video0-13标号被占用&#xff0c;是啥原因导致的 板子上也没有摄像头 【板子没有接CSI/MIPI接口的I2C通道…

如何快速搭建springboot项目

在IntelliJ IDEA中&#xff0c;可以按照以下步骤快速创建一个Spring Boot项目&#xff1a; 1. 打开 IntelliJ IDEA&#xff0c;点击欢迎界面上的"Create New Project"或者从菜单栏选择"File" -> "New" -> "Project"。 2. 在创…

C++ CS留学生期末答疑2

#include <iostream>using namespace std;int main() {int i 0;while (i < 10) {if (i % 2 0) {continue;}printf("%d", i);i i 1;}return 0; }#include <iostream>这是一个预处理指令&#xff0c;用于包含输入输出流库&#xff0c;使我们可以使用…

shell——免交互

一、Here Document 免交互 概述 常用的交互程序&#xff1a;read&#xff0c;ftp&#xff0c;passwd&#xff0c;su&#xff0c;sudo。 cat也可配合免交互的方式重定向输出到文件。 作用&#xff1a; 使用I/O重定向的方式将命令列表提供给交互式程序&#xff1b;标准输入的…

Java的CAS操作

介绍 CAS 技术是为了解决问题而生的&#xff0c;通过 CAS 我们可以以无锁的方式&#xff0c;保证对共享数据进行 “读取 - 修改 - 写回” 操作序列的正确性。 CAS 是乐观锁设计思想的实现。CAS 的思想是&#xff1a;在“读取 - 修改 - 写回”操作序列中&#xff0c;先读取并修…

章节2 Matplotlib 绘图基础

目录 课时 2 Matplotlib简介及绘制简单线型图 课时 3 图例和标题 课时 4 自定义图形样式 课时 4 绘制条形图 课时 2 Matplotlib简介及绘制简单线型图 线的画法 plt.plot&#xff0c;同时提供x轴坐标和y轴坐标 课时 3 图例和标题 x 轴数据默认即可&#xff0c;如下所示 x轴代…

plsql为什么连不上远程或本地的Oracle,需要做哪些准备?

文件配置解说 tnsnames.ora文件 文件所在地址&#xff1a;ORACLE_HOME\network\admin ORACLE_HOME&#xff1a;Oracle数据库或者客户端软件所在的地址 但是我的在Oracle数据库的目录下&#xff0c;而不是Oracle客户端软件&#xff08;instantclient_11_2&#xff09;下 里…