spring cloud之服务熔断

四、Hystrix组件(*)

- 官网:https://github.com/Netflix/Hystrix
- 在分布式环境中,许多服务依赖项不可避免的会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。

1.服务雪崩

- 在微服务之间进行服务调用,由于某一个服务故障,导致级联的服务故障的现象,成为雪崩效应。
- 雪崩效应描述的是服务提供方不可用,导致消费方不可用,并将不可用逐渐扩大的过程。

微服务之间链路调用图示
在这里插入图片描述

在某一时刻流量突然波动很大,导致某一服务(如SeverC)扛不住请求的压力,变得不可用。那么ServerB的请求也会阻塞,慢慢耗尽serverB的线程资源,导致ServerB也变得不可用,同样也会导致ServerA不可用

在这里插入图片描述

2.服务熔断

"熔断器"本身是一种开关装置,当某个服务发生故障后,通过断路器(hystrix)的故障监控,某个异常条件被触发,直接熔断整个服务。向请求方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出异常,就保证了服务请求方的线程不会长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解决服务雪崩的重要手段。

服务熔断图示:
在这里插入图片描述

3.服务降级

- 服务压力剧增时,为了保证核心服务正常运行,可以有策略的关闭微服务系统中的某些边缘服务

服务降级图示
在这里插入图片描述

4.服务熔断和服务降级总结

- 服务熔断必会触发服务降级,所以熔断也是降级的一种。区别在于熔断是对服务之间调用链的保护,而降级是对整个系统压力过载的一种保护。
- 都是从系统的可用性可靠性着想,为防止系统的整体缓慢甚至服务雪崩,所采取的保护手段。

5.服务熔断的实现

  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 2.在启动类上添加注解 @EnableCircuitBreaker。开启服务熔断
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {

}
  • 3.服务熔断测试
在方法上添加注解@HystrixCommand(fallbackMethod = "demoFallback"),fallback指定服务熔断后的处理

@RestController
public class DemoController {

    @GetMapping("/demo")
    @HystrixCommand(fallbackMethod = "demoFallback")
    public String demo(@RequestParam Integer id){
        if (id <= 0) {
            throw new RuntimeException("ID无效");
        }
        return "demo ok";
    }

    /**
     * demo方法服务熔断后的处理
     */
    public String demoFallback(Integer id) {
        return "系统繁忙,请稍后再试!";
    }
}

错误请求,操作多次后,熔断器打开
在这里插入图片描述

在熔断器打开状态下,接下来(默认)5秒内,所有请求到该接口依然会熔断处理
在这里插入图片描述

熔断器打开状态下,5秒后,此时熔断器处于半开状态,允许放行一个请求进来,如果该请求执行成功,则断路器会关闭,反之重新打开断路器
在这里插入图片描述

  • Hystrix熔断器打开条件
- 1.当次数达到一定的阈值时(默认10秒内超过20个请求次数)
- 2.当失败率达到一定的比例(默认10秒内超过50%的请求失败)
  • Hystrix熔断器触发熔断机制流程图
    在这里插入图片描述
当Hystrix监控对该服务接口调用达到触发熔断器开启的条件时,会在系统中自动触发熔断器,此时任何到该接口的服务请求均不可用,默认5秒后,熔断器会处于半开状态,只允许放行一个请求到该服务接口,如果该请求执行成功,则断路器关闭,反之断路器重新打开

6.OpenFeign 集成 Hystrix

  • 1.添加依赖
<dependencies>
    <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>

    <!-- consul 注册中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <!-- hystrix 熔断 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <!--openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • 2.配置文件
server.port=8855
# 服务名
spring.application.name=OPENFEIGN-HYSTRIX
# consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# 开启openfeign服务熔断处理(默认为false,不开启)
feign.hystrix.enabled=true
  • 3.在启动类上添加注解
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册客户端
@EnableCircuitBreaker // 开启断路器
@EnableFeignClients // 开启feign
public class OpenfeignHystrixApplication {

}
  • 4.OpenFegin 集成 Hystrix 测试
@RestController
@Slf4j
public class TestController {

    @Autowired
    private HystrixClient hystrixClient;

    @GetMapping("/test")
    public String test(@RequestParam Integer id) {
        String result = hystrixClient.demo(id);
        log.info("result:{}", result);
        return "test ok";
    }
}
---------------
- feign客户端接口
// fallback:当接口处理异常或不可用时,进行服务熔断处理
@FeignClient(value = "HYSTRIX", fallback = HystrixClientFallback.class)
public interface HystrixClient {

    @GetMapping("/demo")
    String demo(@RequestParam(value = "id") Integer id);
}  

- Openfeign接口服务熔断备选处理类,需实现HystrixClient接口
@Component
public class HystrixClientFallback implements HystrixClient {

    @Override
    public String demo(Integer id) {
        return "当前请求处理失败,进行服务熔断备选处理。id:" + id;
    }
}

在这里插入图片描述

7.Hystrix Dashboard(仪表盘)

- Hystrix Dashboard收集了每个HystrixCommand的一组度量,以高效的方式显示每个断路器的运行状况
- 作用:监控每一个@HystrixCommand注解的一组度量,构建一组信息,通过图形化方式展示当前方法@HystrixCommad的状态信息
  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  • 2.配置文件
server.port=9909
# 应用名
spring.application.name=HYSTRIX-DASHBOARD
# consul注册中心地址
# spring.cloud.consul.host=localhost
# spring.cloud.consul.port=8500
  • 3.在启动上添加注解@EnableHystrixDashboard
@SpringBootApplication
//@EnableDiscoveryClient
@EnableHystrixDashboard // 开启熔断器仪表盘
public class HystrixDashboardApplication {

}
  • Hystrix Dashboard图形化界面访问地址
http://localhost:9909/hystrix

在这里插入图片描述

添加需要监控的服务地址,点击【 Monitor Stream】
在这里插入图片描述

  • Hystrix目前状态
- Hystrix 和 Hystrix Dashboard已经进入维护模式
	- Hystrix Dashboard已经被废弃,替换产品:Netflix-Skunkworks/hystrix-dashboard

- 推荐使用阿里的 sentinel (流量卫兵)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析C

【科技素养】少儿编程蓝桥杯青少组计算思维题考试真题及解析 1.天平的左右两端分别放有一些砝码&#xff0c;如下图所示&#xff0c;右边的砝码不变&#xff0c;从左边最多拿走几个砝码&#xff0c;可以使天平左右两边平衡&#xff1a; A、1 B、2 C、3 D、4 2.把下面的图形…

(一)什么是Vite——vite介绍与使用

什么是Vite Vite&#xff08;法语意为 "快速的"&#xff0c;发音 /vit/&#xff0c;发音同 "veet"&#xff09;是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。 它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于 原生 …

Javaweb之javascript事件案例的详细解析

1.6.4 案例 1.6.4.1 需求说明 接下来我们通过案例来加强所学js知识点的掌握。 需求如下3个&#xff1a; 点击 “点亮”按钮 点亮灯泡&#xff0c;点击“熄灭”按钮 熄灭灯泡 输入框鼠标聚焦后&#xff0c;展示小写&#xff1b;鼠标离焦后&#xff0c;展示大写。 点击 “全…

RK3588平台开发系列讲解(项目篇)实时显示摄像头

文章目录 一、测试代码二、代码解析2.1、OpenCV头文件2.2、类与函数的访问方式2.3、捕获摄像头图像2.4、定义图像变量2.5、显示图像沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将给大家介绍,如何基于USB摄像头进行实时显示。 一、测试代码 #include "o…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

docker-compose 部署 MySQL 8

前言 Windows 系统通过 docker-compose 部署 MySQL8.0。 MySQL 配置文件(my.cnf) # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服…

“技能兴鲁”职业技能大赛-网络安全赛项-学生组初赛 WP

Crypto BabyRSA 共模攻击 题目附件&#xff1a; from gmpy2 import * from Crypto.Util.number import *flag flag{I\m not gonna tell you the FLAG} # 这个肯定不是FLAG了&#xff0c;不要交这个咯p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.e…

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用 通过右键点击某个文件夹用Idea打开 首先打开注册表 win R 输入 regedit 然后找到HKEY_CLASSES_ROOT\Directory\shell 然后右键shell 新建一个项名字就叫 Idea 第一步&#xf…

LeetCode(13)除自身以外数组的乘积【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 238. 除自身以外数组的乘积 1.题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素…

FPGA时序约束与分析-简单入门

FPGA时序约束与分析-简单入门 文章目录 FPGA时序约束与分析-简单入门1. 本课程概述2. 时序约束简介2.1 什么是时序约束2.2 合理的时序约束2.3 *基于Vivado的时序约束方法 3. 时序分析的基本概念3.1 时钟与时钟偏差3.2 建立时间和保持时间3.3 时序分析中路径、沿和关系的定义 4.…

Sentinel浅层介绍(上)

一、概述 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 二、核心概念 1、资源 资…

HelloWorld - 从Houdini导出HDA到UE5

1.配置插件 在Houdini安装目录下找到对应版本引擎的插件&#xff0c;例如这里是Houdini19对应UE5.2的版本&#xff0c;我们就要保证先下载好UE5.2&#xff1a; 将Houdini插件粘贴到UE安装目录的Plugins文件夹下&#xff1a; 目前插件配置完成&#xff0c;打开UE会自动启用插…

非petallinux操作的xilinx zynqmp openamp核间通信框架搭建核测试(APU :linux2021 + rpu1(裸机))

不使用petallinux构建apu核rpu之间的核间通信 一&#xff1a;首先需要在RPU中创建openamp裸机程序&#xff1a;居于openamp框架实现rpmag通信 打开vitis平台将xsa导入并创建平台工程&#xff0c;然后再平台工程中找到platform.spr文件并打开&#xff0c;可以看到平台添加的cp…

Umeyama 算法之源码阅读与测试

Title: Umeyama 算法之源码阅读与测试 文章目录 前言I. Eigen 中 Umeyama 算法源码1. Eigen/src/Geometry/Umeyama.h 源码2. 代码测试 II. PCL 中 Umeyama 算法源码III. evo 中 Umeyama 算法源码1. evo/core/geometry.py 源码2. 代码测试 总结参考文献 [相关博文介绍] - 矩阵乘…

Python中的Random模块详解:生成随机数与高级应用

大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python中的Random模块详解&#xff0c;文章2800字&#xff0c;阅读大约10分钟&#xff0c;大家enjoy~~ 在Python编程中&#xff0c;随机数生成是许多应用的基础之一。random模块为我们提供了生成伪随机数的丰富工具&…

Vue dev-tools的安装

安装 Vue 开发者工具&#xff0c;装插件调试Vue应用 1.通过谷歌应用商店来进行安装&#xff08;国外网站&#xff09; 2.极简插件&#xff1a; 搜索 Vue -> 下载解压 -> 浏览器扩展模式打开&#xff0c;开发者模式 -> 将解压的CRX文件拖拽安装 -> 插件详情 &…

CSS特效010:文字颜色渐变的流光效果

查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS相关的库、…

学【Java多态】-- 写高质量代码

多态的实现条件 在java中要实现&#xff0c;必须要满足如下几个条件&#xff0c;缺一不可。 1.必须在继承体系下2.子类必须要对父类中的方法进行重写3.通过父类的引用调用冲写的方法。 想要真正的学好多态需要去学习一些前置知识&#xff0c;那我们直接开始吧&#xff01; …

LeetCode - 27. 移除元素 (C语言,快慢指针,配图)

思路一&#xff1a;新开辟一个数组&#xff0c;空间复杂度O(N) 因为本题要求是空间复杂度O(1),所以这里只是列出思路1的思路和配图&#xff0c;并没有具体的实现代码&#xff0c;想必这对大家一定很简单。 思路二&#xff1a;使用快慢指针&#xff0c;空间复杂度O(1)&#xff0…

Python编程-----网络通信

一.统一资源定位器URL 专为标识Internet网上资源位置而设的一种编址方式 ,URL一般由以下几个部分组成&#xff1a; 传输协议://主机IP地址(或域名地址)[:端口号]/资源所在路径和文件名 •传输协议是指访问该资源所使用的访问协议&#xff1b; •主机IP地址&#xff08;或域名…