Hystrix入门使用 服务熔断 服务降级 服务雪崩

news2024/11/22 14:45:17

一、概念

hystrix停止更新,理念优秀。

分布式系统面临的问题:

  • 对于复杂的分布式体系,有数十个依赖,依赖不可避免的错误。

  • 服务会出现雪崩,高可用受到破坏

    Hystrix就是用于解决分布式系统延迟和容错的开源库。

  • 保证在一个依赖出现问题,不会导致整体的服务失败,避免级联故障,以提高分布式系统的弹性

  • 如果出现错误,向调用方抛出备选FallBack

1. 功能

  • 服务降级
  • 服务熔断
  • 接近实时监控
  • 服务限流
  • 服务隔离

停止更新进入维护

2. 重要理念

服务降级

服务器出现问题时候,不让客户端持续等待,立刻返回一个友好的提示。fallback.

以下原因会导致服务降级.

  • 程序运行异常
  • 服务熔断触发降级
  • 线程池和信号量打满
  • 程序超时

服务熔断

当访问达到最大访问(简短可以理解为保险丝),直接拒绝访问,然后调用服务降级方法,返回友好提示。

降级-熔断-恢复

服务限流

秒杀高并发的操作,严禁一窝蜂过来拥挤,有序进行。


二、Hystrix案例

Hystrix一般用于消费端,也就是调用端;

1. 服务降级

什么时候开启服务降级呢?

  1. 当被调用服务超时
  2. 当被调用服务Down机
  3. 当调用这等待时间小于服务端的处理时间

1.1 创建服务端

 <dependencies>
        <!--新增hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>


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

        <dependency>
            <groupId>com.atjianyi</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--        <dependency>-->
        <!--            <groupId>org.springframework.boot</groupId>-->
        <!--            <artifactId>spring-boot-devtools</artifactId>-->
        <!--            <scope>runtime</scope>-->
        <!--            <optional>true</optional>-->
        <!--        </dependency>-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. 创建mould 8001端口,且注册进入eureka

image-20230527222354845

  1. 在业务当中添加两个方法: 方便我们后续进行服务降级和熔断时候对比。
    • ok模拟正常业务
    • timeout模拟长流程业务员

image-20230527222443058

1.2 添加客户端

出现客户端相应缓慢,8001同一层次的其他接口被困死,因为在tomcat线程池当中默认只有10个线程。

客户端服务的核心就是调用远程服务。

image-20230527223817593

使用Jemeter测试,压测timeout方法,发现OK方法也出现了问题,相应变慢,我们应该怎么来改善这一问题,这就引入了我们下面要说的Hystrix;

1.3 Hystrix解决

  • 超时导致服务器变慢
  • 出错(程序运行出错)

解决方案:

  • 对方超时,必须有服务降级
  • 对方down机,必须服务降级
  • 对方OK,调用者自己出故障,自己处理降级

@HystrixCommand(fallbackMethod)

EnableCirutBreaker

1.3.1 提供端降级

  1. 在 Timeout 业务当中添加注解

image-20230527132410536

  @Override
    @HystrixCommand(fallbackMethod = "timeoutHandler" ,commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000") //表示业务处理若超过 3s,则降级,调用方法。
    })
    public String timeout(String id ) {
        int tmm = 3*1000;
        try {
            Thread.sleep(tmm);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "payment-timeout"+"current Thread "+Thread.currentThread().getId()+"   cID="+id;
    }

    /**
     * 降级回调方法
     * @param id
     * @return
     */
    public String timeoutHandler(String id){
        return "payment-timeout-handler"+"current Thread "+Thread.currentThread().getId()+"   cID="+id;
    }
  1. 主启动类当中激活 @EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class HystrixPaymentApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixPaymentApplication.class,args);
    }
}

测试结果

由于配置了hystrix容忍 3s 的超时,实际业务需要 5s 所以这里服务进行了降级处理。

image-20230527225446282

现在我们把 timeout() 代码改成如下,在进行测试: 结果显示降级并且调用到了降级方法。

 @Override
    @HystrixCommand(fallbackMethod = "timeoutHandler" ,commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000") //表示业务处理若超过 3s,则降级,调用方法。
    })
    public String timeout(String id ) {
        //直接报错,观察是否会进行降级
        int t = 10/0;
        int tmm = 5*1000;
        try {
            Thread.sleep(tmm);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "payment-timeout"+"current Thread "+Thread.currentThread().getId()+"   cID="+id;
    }

image-20230527230433556


1.3.2 客户端降级

server:
  port: 80
spring:
  application:
    name: cloud-hystrix-order
eureka:
  client:
    register-with-eureka: true    #表示不向注册中心注册自己
    fetch-registry: true   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka/
#      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

feign:
  hystrix:
    enabled: true
ribbon:
  ReadTimeout: 5000
  ConnectionTimeout: 5000

这里我们将主调用方法的超时容忍设为 1.5s, 而远程调用的长流程业务需要 3s完成,因此,测试一样会降级处理。

 @GetMapping("consumer/payment/timeout/{id}")
    @HystrixCommand(fallbackMethod = "timeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500") //设置容忍度为1500
    })
    public R timeout(@PathVariable("id")String id){
        R ok = paymentClient.timeout(id);
        return ok;
    }
    public R timeoutHandler(String id){
        R<String> r = new R<>();
        r.setData("consumer-timeoutHandler  id="+id);
        return r ;
    }

image-20230527232405879

然而,上述代码的写法带来的两个问题

  • 代码膨胀:每个方法都有一个hystrixConnmend,若有一百个接口,就得写一百个@hystrix…
  • 代码混乱: 服务降级和正常业务逻辑进行了混淆

针对上面出现的两个问题,我们改写为下面的方法。

1.4 全局服务降级

全局服务降级配置,就是针对需要服务降级的进行通用配置 使用 @Defaultproperties()注解进行配置;

再改写消费端如下,配置全局服务降级;

image-20230527234054254

image-20230527234028877

通过上一个配置,我们解决了代码膨胀得问题,接着我们最后写出一套完整通用得服务调用与降级的Demo。

1.5 究极服务降级

  1. 在 client 接口当中直接指定降级处理类;

image-20230527234707291

  1. 继承 client接口,并且实现方法。

image-20230527234912706

在测试的时候,将 服务端(被调用端)关闭,成功调用降级方法!

image-20230527235212263

这样,我们就解决了代码膨胀和代码混乱的问题;


2. 服务熔断

服务降级 -> 服务熔断 -> 链路恢复

image-20230527141849197

断路器就是保险丝,熔断: 应对服务雪崩效应的链路保护机制,当检测节点微服务调用响应正常后,恢复调用链路

  • 熔点机制通过Hystrix实现
  • 监控微服务调用的状况:
    • 5秒20次调用失败,就会启动熔断机制。

熔断是> https://martinfowler.com/bliki/CircuitBreaker.html

2.1 熔断原理

  • 熔断打开: 请求不再进行调用当前服务

  • 熔断关闭: 熔断关闭,不再对服务进行熔断

  • 熔断半开: 部分请求根据规则调用当前服务,如果请求成功且符合规则,则关闭熔断

    设计断路器的三个重要参数; 快照时间窗口、请求总数阀值、错误百分比阀值

  • 快照时间窗口: 统计请求和错误数据,默认为10s内

  • 请求总数阀值: 在快照时间窗内,必须满足请求总数才有资格熔断,默认为20;

  • 错误百分比法制: 当请求总数在快照时间内超过阀值,例如在10s内发生30次调用,有15次失败,则断路器打开。

image-20230527142436114

当熔断开启后,直接调用fallback;

2.2 案例

  1. 在 payment 业务当中,添加业务方法代码,以便于我们测试熔断机制。
  @HystrixCommand(fallbackMethod = "paymentCircuitBreakHandler",commandProperties = {
            //开启熔断;
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
            //请求次数至少10次
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
            //在10s中
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
            //错误率 60%
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "20")
    })
    public String paymentCirumentBreak(Integer id) {
        if(id<0){
            throw new RuntimeException("不能为负数");
        }
        //
        String rid = UUID.randomUUID().toString().replace("-","");
        return "调用成功: 流水号为: "+rid;
    }
    public String paymentCircuitBreakHandler(Integer id){
        return "调用失败: === 降级处理"+id;
    }
  1. 在Controller当中调用Service,并打开浏览器进行测试;

    • 测试时候,传入负数参数连续调用n次,后在传入正数,会发现,正数返回的也是服务降级的内容,说明断路器Open;

    image-20230529091834445

    • 再多次调用正数内容,熔断慢慢恢复到正常状态 closed;

    image-20230529091920222

    上述熔断过程就是 closed -> open ->halfOpen -> closed 的过程

3. 服务监控

Hystrix还提供了一个准实时的调用监控,以报表的方式或者图形化的方式展现给用户。SpringCloud提供了hystrixDashboard的整合,对监控内容转为可视化界面。

案例

  1. 创建Module

image-20230529093104348

  1. POM
   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  1. yaml
Server.port=9001
  1. 主类激活。

image-20230529093756999

  1. 修改被监控的微服务

注意只要涉及到监控,就必须要添加 actuator 依赖

再主类当中添加如下代码

image-20230529094245345

  1. 访问localhost:9001/hystrix, 监控8001服务

在hystrix监控栏目中输入被监控的地址: localhost:8001/hystrix.stream

image-20230529095057567

image-20230529095122212

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

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

相关文章

Python五彩气球

文章目录 前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字 五彩气球气球类漂浮函数气球函数六一祝福 尾声 前言 六一要来啦&#xff0c;快来领取博主精心准备的五彩气球吧&#xff01; Turtle基础 小海龟(Turtle)是Python中画图的一…

SpringBatch历史数据的清理方案及实现

SpringBatch历史数据的清理方案及实现 需求背景 SpringBatch的程序已经运行了将近一年&#xff0c;数据量已经达到了一定的数据量级别。 对SpringBatch历史数据的清理也被提上日程。 但是SpringBatch的代码中似乎没有找到清理历史数据的代码&#xff0c;在官方文档中也没有…

一、STM32程序下载软件_FlyMCU

1、软件简介 (1)FlyMCU是一款STM32下载程序的软件。 (2)FlyMCU采用ISP下载方式。 (3)ISP&#xff1a;在线系统编程。 (4)FlyMCU支持STM32F1、STM32F2、STM32F4系列&#xff0c;其他暂不支持&#xff0c;后续应该也不会更新了。 (5)STM32芯片的ISP下载&#xff0c;只能使用…

LINUX系统编程-----中

文章目录 进程间的通信管道popen 和 pclosepipeFIFO 共享内存system V 版本的共享内存创建/获取共享内存 共享内存涉及的函数共享内存的通信两个进程同时对共享内存进行读写 信号量使用信号量保护共享资源消息队列死锁 信号内核不可中断状态 进程间的通信 管道 在操作系统中&…

【备战秋招】每日一题:4月1日美团春招(二批)第三题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

Electron简单开发

文章目录 1.参考网站2.HelloWold编写2.1新建空文件夹2.2node初始化2.3安装electron依赖2.4添加.gitignore 文件2.5创建main.js文件和index.html2.6运行electron应用 3.打包 接到一个任务&#xff0c;将electron集成到solidworks中&#xff0c;所以记录一下electron的简单操作&a…

【操作系统】05.文件管理

文件管理 文件的属性 文件内部数据的组织 文件之间的组织 操作系统向上层提供功能 创建文件 删除文件 打开文件 关闭文件 读文件 写文件 文件的逻辑结构 无结构文件 有结构文件 顺序文件 文件的物理结构 磁盘块&#xff08;文件块&#xff09; 连续分配 优点 对于机…

操作系统 四、文件管理

文章目录 4.1 文件的逻辑结构4.2 文件目录4.2.1 目录结构4.2.1.1 单级目录结构4.2.1.2 两级目录结构4.2.1.3 多级目录结构4.2.1.4 无环图目录结构 4.2.2 索引结点(FCB的改进) 4.3 文件的物理结构4.3.1 连续分配4.3.2 链接分配4.3.2.1 隐式链接4.3.2.2 显式链接 4.3.3 索引分配 …

稠密点云获取方法(二)

作为高分辨率三维重建的方法之一,从单张图像生成稠密三维点云在计算机视觉领域中一直有着较高的关注度。 以下文献提出了一种针对二维和三维信息融合的方法以解决三维点云稀疏难以检测远处的目标的问题。 Multimodal Virtual Point 3D Detection 该文献提出一种将 RGB 传感器…

【Mysql】| 超详细常见bug及解决方案

目录 一. &#x1f31f; 引入话题二. &#x1f31f; 引出bug1.1 查看bug1.2 Problem Solving2.1 查看bug2.2 Problem Solving3.1 字段长度异常3.2 Problem Solving 三. &#x1f31f; 最后 一. &#x1f31f; 引入话题 MySQL是一款广泛使用的开源数据库管理系统&#xff0c;它…

小白了解Docker容器技术

一、什么是Docker&#x1f451; 有一个最常见的例子来很好的帮我们简单了解Docker容器技术&#xff1a; 当我们在一台计算机中配置好了环境&#xff0c;花费了极大的时间和精力成功开发部署好了一个应用。准备尝试在不同操作系统、不同环境下部署这个应用时&#xff0c;我们需要…

图及其与图相关的算法

⭐️前言⭐️ 本篇文章主要介绍图及其与图相关的算法 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主…

如何在 Rocky Linux 上检查磁盘空间?

在 Rocky Linux 上检查磁盘空间是系统管理和维护的重要任务之一。磁盘空间的监控和管理可以帮助我们及时发现和解决存储空间不足的问题&#xff0c;以确保系统的正常运行。本文将详细介绍在 Rocky Linux 上检查磁盘空间的方法。 方法 1&#xff1a;使用 df 命令 df 命令是 Li…

SOLIDWORKS技巧大全培训教程

1 您可以使用 CTRLTAB 键循环进入在 SolidWorks 中打开的文件。 2 使用方向键可以旋转模型。按 CTRL 键加上方向键可以移动模型。按 ALT 键加上方向键可以将模型沿顺时针或逆时1 您可以使用 CTRLTAB 键循环进入在 SolidWorks 中打开的文件。 2 使用方向键可以旋转模型。按 CTRL…

【CloudCompare教程】012:基于点云数据的测量功能

本文讲解CloudCompare基于点云数据的测量功能,主要有:点云索引、坐标、距离、角度、面积、标签等。 文章目录 一、加载地形点云数据二、基于点云数据的测量功能1. 选择单点并显示信息2. 选择两点并显示分割信息3. 选择三点并显示相关三角形信息4. 定义矩形2D标签5. 保存当前标…

Milvus向量数据库

Milvus vector database 第一章 Milvus概述 Milvus创建于2019年&#xff0c;唯一的目标是&#xff1a;存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量embedding vectors。 存储对象&#xff1a;向量 NOTE&#xff1a;embedding vectors是对非结构…

c#快速入门(下)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;Inline和lambda委托和lambda &#x1f449;&#x1f…

上海斯歌荣获中国低代码/零代码行业“卓越影响力厂商奖”

3月19日&#xff0c;在「第三届中国 ISIG 产业智能大会」隆重的颁奖典礼上&#xff0c;上海斯歌被授予“卓越影响力厂商奖”&#xff0c;并入围国内权威咨询机构LowCode低码时代的《2022年中国低代码&零代码行业研究报告》卓越影响力榜单。 「第三届ISIG中国产业智能大会」…

如何编写接口自动化框架系列通过yaml来管理测试用例(四)

本文是接口自动化测试框架系列篇的第四篇 &#xff0c;主要介绍yaml包的使用 。自动化测试的本质是将功能测试用例交给代码去 目录 1. yaml介绍&#xff1f; 2.python中的yaml包 3.项目中使用yaml包 4 项目总结 执行 &#xff0c;测试人员往往是在自动化框架添加对应的测试…

惠普83752B高功率合成扫频器,20 GHz

惠普83752B扫频仪为元器件测试市场带来了卓越的综合性能&#xff0c;在通用台式扫频仪、扫频仪或标量测试应用中&#xff0c;83752B提供了性价比最高的性能。这款扫频仪在保持模拟源速度的同时&#xff0c;提供了卓越的精度和稳定性。全合成CW、步进和科坡扫描模式可在宽带和窄…