Springcloud1----->Hystrix

news2024/11/18 6:01:32

目录

  • 雪崩问题
  • 服务降级
    • 原理
    • 实践
      • 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
    @LoadBalanced
    public 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.coloradmin.cn/o/548360.html

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

相关文章

selenium自动化测试报告_selenium自动化测试断言

一、元素操作方法 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 复制 注意&#xff1a;在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver# 实例化浏览器 driver webdriver…

这才是自动化测试,资深测试构建持续交付体系(高质量)持续集成...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试-自动化测…

OptimizePI仿真流程

OptimizePI软件介绍 OptimizePI是用于针对PI设计进行优化的一个设计流程&#xff0c;可以针对PDN的设计进行仿真计算&#xff0c;主要功能包括以下几个&#xff1a; PDN前仿真分析PDN后仿真分析PDN阻抗检查去耦电容的回路电感分析芯片的电源管脚的电感分析去耦电容最佳位置评…

一文参透AB斗篷的前世今生

做FP独立站的应该都对cloak斗篷不陌生&#xff0c;cloak已经成为出海营销行业的必备工具之一。尽管使用cloak并不能保证一定有效&#xff0c;但不使用cloak却也是不可行的。今天本文将详细讲解cloak系统的“前世今生”&#xff0c;以便让大家更好地了解cloak系统并能挑选到最适…

【中间件】通过 docker-compose 快速部署 Zookeeper 保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、Zookeeper 编排部署1&#xff09;下载 Zookeeper2&#xff09;配置3&#xff09;启动脚本 bootstrap.sh4&#xff09;构建镜像 Dockerfile5&#xff09;编排 docker-c…

如何使用ChatGpt来学习和提问【对话ChatGPT】?

ChatGPT的不断发展和进步&#xff0c;我们需要工作中很多时候会用到ChatGPT&#xff0c;那么如何使用ChatGPT来解决我们工作中的问题呢&#xff1f; Q1如何向ChatGPT提问&#xff0c;从而更快解决我们的问题&#xff1f; ChatGPT&#xff1a;以下是向ChatGPT提问的一些提示&a…

CISSP和Security+的区别和学习建议

当谈到网络安全认证时&#xff0c;经常有朋友问我CISSP 与 Security认证。两者都是业内比较认可&#xff0c;对实际工作有所帮助的认证&#xff0c;但是哪一个适合自己呢&#xff0c;区别又是什么呢&#xff1f; 在深入研究细节之前&#xff0c;让我们先简要了解一下 CISSP 与 …

深度学习之自编码器实现——实现图像去噪

大家好&#xff0c;我是带我去滑雪&#xff01; 自编码器是一种无监督学习的神经网络&#xff0c;是一种数据压缩算法&#xff0c;主要用于数据降维和特征提取。它的基本思想是将输入数据经过一个编码器映射到隐藏层&#xff0c;再通过一个解码器映射到输出层&#xff0c;使得输…

数字宁夏“1244+N”行动进行时,实在智能以AI为宁夏全区县数字化转型加“数”度

建设数字中国是数字时代推进中国式现代化的重要引擎&#xff0c;是构筑国家竞争新优势的有力支撑。现如今&#xff0c;政府部门发展数字经济已然成为新科技浪潮下的战略选择。可以预见&#xff0c;在数字化浪潮的推动下&#xff0c;中国经济将迎来新的高峰。 近日&#xff0c;宁…

English Learning - L3 作业打卡 Lesson2 Day13 2023.5.17 周三

English Learning - L3 作业打卡 Lesson2 Day13 2023.5.17 周三 引言&#x1f349;句1: A blacklist is illegal now.成分划分弱读爆破语调 &#x1f349;句2: But at one time, some businesses refused to employ people who were on a blacklist for belonging to unpopular…

【正点原子STM32连载】 第十一章 STM32时钟配置 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十一…

log4net在Asp.net MVC4中的使用

1、安装log4net插件 新建Asp.net MVC4项目&#xff0c;并在Nuget控制台输入命令&#xff0c;或者直接搜索log4net在线安装&#xff0c;安装log4net >Install-Package log4net -Version 2.0.15 2、配置web.config文件 <?xml version"1.0" encoding"ut…

小试牛刀:应用深度强化学习优化文本摘要思路及在裁判文书摘要上的实践效果

一、引言 近期&#xff0c;随着大模型的出现&#xff0c;强化学习再一次的引起了本人的兴趣&#xff0c;本文将应用深度强化学习来优化文本摘要模型&#xff0c;使生成的摘要更加的流畅。在此之前&#xff0c;大家都采用了很多种方式训练摘要系统&#xff0c;例如&#xff1a;…

MySQL的主从实战

MySQL的主从实战 1、Mysql主从的必要性 访问量不断增减&#xff0c;Mysql服务器的压力增大&#xff1b;就需要对Mysql进行优化与改造&#xff1b; 实现Mysql的高可用MySQL的主从复制搭建 主从搭建的目的就是实现数据库冗余备份同步主服务器和Slave服务器&#xff0c;一旦Mas…

Vivado综合属性系列之七 DONT TOUCH

目录 一、前言 二、DONT TOUCH ​ ​2.1 属性说明 ​ ​2.2 属性用法 ​ ​2.3 工程代码 ​ ​2.4 参考资料 一、前言 ​ ​设计中经常会遇到一些信号&#xff0c;模块等被综合工具优化&#xff0c;而实际这些部分确是我们所需要的&#xff0c;针对这种情况&a…

哨兵机制原理详解

文章目录 初始化 Sentinel三个定时任务&#xff08;重要&#xff09;INFO任务订阅/发布任务心跳任务 Redis节点下线判断主观下线判断客观下线判断 Sentinel Leader 选举故障转移过程整体过程Master 选择算法修改从服务器的复制目标将旧的主服务器变为从服务器 节点上线原Redis节…

如何用Nginx实现对国家/城市以及指定IP的访问限制?

1.前言 在【如何用Nginx代理MySQL连接&#xff0c;并限制可访问IP】一文中&#xff0c;我们实现了通过Nginx代理MySQL连接&#xff0c;并限制了指定IP才能通过Nginx进行连接&#xff0c;以提高数据安全性。 该场景适用于根据具体的IP地址来进行访问限制&#xff0c;假如我们要…

synchronized优化原理

文章目录 一、Monitor1.1 Monitor结构 二、轻量级锁三、锁膨胀四、自旋优化五、偏向锁 一、Monitor Monitor的工作原理也是synchronized底层原理 每个Java对象都可以关联一个Monitor对象&#xff0c;如果使用synchronized给对象上锁之后&#xff0c;该对象头的MarkWord中就被设…

怎样从“点点点”进阶到自动化测试?

为什么要学习自动化测试 在讨论这个问题之前&#xff0c;先来聊一下测试人员的职业发展路线&#xff0c;无非就是两条&#xff0c;技术路线和管理路线&#xff0c;技术路线一般就是功能测试&#xff08;60%&#xff09;-->自动化测试&#xff08;25%&#xff09;-->测试…

fio引发的一些问题

fio引发的一些问题 奇怪的255扇区在nvme驱动中插入打印语句直接编译模块加载源码编译内核 查找内核源码 奇怪的255扇区 由于块设备驱动项目需要测试读写速度&#xff0c;故使用fio工具&#xff0c;没想着深入了解&#xff0c;简单测个速就可以 使用tldr命令得到测试磁盘读写的…