Spring Cloud Hystrix简单实用

news2024/11/19 6:19:12

文章目录

    • 一、简介
    • 二、快速开始
      • 1、pom依赖
      • 2、启动类注解
      • 3、服务降级配置`@HystrixCommand`
      • 4、配置熔断策略
      • 5、测试
    • 三、原理分析
    • 四、实际使用


一、简介

请添加图片描述

Hystrix,英文意思是豪猪,全身是刺,刺是一种保护机制。Hystrix也是Netflflix公司的一款组件。

Hystrix是什么?

在分布式环境中,许多服务依赖项中的部分服务必然有概率出现失败。Hystrix是一个库,通过添加延迟和容错逻辑,来帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点阻止级联失败,通过提供回退选项来实现防止级联出错。提高了系统的整体弹性。与Ribbon并列,也几乎存在于每个Spring Cloud构建的微服务和基础设施中。

Hystrix被设计的目标是:

  • 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。

  • 在复杂的分布式系统中阻止雪崩效应。

  • 快速失败,快速恢复。

  • 回退,尽可能优雅地降级。

二、快速开始

1、pom依赖

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

2、启动类注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

//注解简化写法:微服务中,注解往往引入多个,简化注解可以使用组合注解。
// @SpringCloudApplication =等同于
// @SpringBootApplication+@EnableDiscoveryClient+@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker   //开启熔断
public class DemoHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoHystrixApplication.class, args);
    }

    @Bean
    @LoadBalanced
    //开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3、服务降级配置@HystrixCommand

使用@HystrixCommand定义fallback方法

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestHystrixController {

    @RequestMapping("/hystrix")
    @HystrixCommand(fallbackMethod = "queryByIdFallBack")
    public String queryById() {
        System.out.println("testBystrix");
        return "testBystrix";
    }

    public String queryByIdFallBack() {
        return "对不起,网络太过拥挤";
    }
}

4、配置熔断策略

  1. 常见熔断策略配置

  2. 熔断后休眠时间:sleepWindowInMilliseconds

  3. 熔断触发最小请求次数:requestVolumeThreshold

  4. 熔断触发错误比例阈值:errorThresholdPercentage

  5. 熔断超时时间:timeoutInMilliseconds

官方配置文件地址

https://github.com/Netflix/Hystrix/wiki/Configuration#circuitBreaker.forceOpen
# 配置熔断策略:
# 强制打开熔断器 默认false关闭的。测试配置是否生效
hystrix.command.default.circuitBreaker.forceOpen: false
# 触发熔断错误比例阈值,默认值50%
hystrix.command.default.circuitBreaker.errorThresholdPercentage: 20
# 熔断后休眠时长,默认值5秒
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds: 60000
# 熔断触发最小请求次数,默认值是20
hystrix.command.default.circuitBreaker.requestVolumeThreshold: 5
# 熔断超时设置,默认为1秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 2000

5、测试

请添加图片描述

三、原理分析

熔断器的原理如同电力过载保护器。

熔断器状态机有3个状态:

  • 关闭状态,所有请求正常访问

  • 打开状态,所有请求都会被降级。

    • Hystrix会对请求情况计数,当一定时间失败请求百分比达到阈值,则触发熔断,断路器完全关闭

    • 默认失败比例的阈值是50%,请求次数最低不少于20次

  • 半开状态

    • 打开状态不是永久的,打开一会后会进入休眠时间(默认5秒)。休眠时间过后会进入半开状态。

    • 半开状态:熔断器会判断下一次请求的返回状况,如果成功,熔断器切回关闭状态。如果失败,熔断器切回打开状态。

请添加图片描述

熔断器的核心解决方案:线程隔离和服务降级。

  • 线程隔离。

  • 服务降级(兜底方法)

线程隔离和服务降级之后,用户请求故障时,线程不会被阻塞,更不会无休止等待或者看到系统奔溃,至少可以看到执行结果(熔断机制)。

什么时候熔断:

  1. 访问超时

  2. 服务不可用(死了)

  3. 服务抛出异常(虽然有异常但还活着)

  4. 其他请求导致服务异常到达阈值,所有服务都会被降级

四、实际使用

**注意:**熔断服务降级方法必须保证与被降级方法相同的参数列表和返回值

两种编写方式:编写在类上,编写在方法上。在类的上边对类的所有方法都生效。在方法上,仅对当前方法有效。

方法上:服务降级的fallback兜底方法

  • 使用HystrixCommon注解,定义

  • @HystrixCommand(fallbackMethod="queryByIdFallBack")用来声明一个降级逻辑的fallback兜底方法。

类上:默认服务降级的fallback兜底方法

  • 刚才把fallback写在了某个业务方法上,如果方法很多,可以将FallBack配置加在类上,实现默认FallBack

  • @DefaultProperties(defaultFallback=”defaultFallBack“),在类上,指明统一的失败降级方法;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/consumer")
@DefaultProperties(defaultFallback = "defaultFallback")
//开启默认的 FallBack,统一失败降级方法(兜底) 
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("{id}")
    @HystrixCommand
    public String queryById(@PathVariable Long id) {
        //如果参数为1抛出异常,否则 执行REST请求返回user对象 
        if (id == 1) {
            throw new RuntimeException("too busy!!!");
        }
        String url = String.format("http://user-service/user/%d", id);
        return restTemplate.getForObject(url, String.class);
    }

    /**
     * queryById的降级方法
     */
    public String queryByIdFallback(Long id) {
        return "对不起,网络太拥挤了!";
    }

    /**
     * 默认降级方法
     */
    public String defaultFallback() {
        return "默认提示:对不起,网络太拥挤了!";
    }
}

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

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

相关文章

Controller配置总结与RequestMapping

1.Controller 2.ResquestMapping 就一个父级目录与自己目录的一个关系&#xff01;&#xff01;&#xff01;理清楚就好了&#xff0c;很好理解&#xff01;

MURF20100CTR-ASEMI快恢复对管MURF20100CTR

编辑&#xff1a;ll MURF20100CTR-ASEMI快恢复对管MURF20100CTR 型号&#xff1a;MUR20100CTR 品牌&#xff1a;ASEMI 芯片个数&#xff1a;2 封装&#xff1a;TO-220F 恢复时间&#xff1a;50ns 工作温度&#xff1a;-50C~150C 浪涌电流&#xff1a;200A 正向电流&am…

[JVM] 2. 类加载子系统(1)-- 内存结构、类加载子系统概述

一、内存结构 类加载子系统的职责是&#xff1a;加载class文件到内存中。 完整的内存结构如下&#xff1a; 二、类加载过程 类加载过程总体分为Loading&#xff08;加载&#xff09;、Linking&#xff08;链接&#xff09;、Initialization&#xff08;初始化&#xff09;三…

【力扣每日一题】2023.7.15 四数之和

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这题和本月出过的每日一题&#xff1a;两数之和&#xff0c;三数之和类似。 不夸张的说只要把三数之和的代码拿来再套层for循环改改就可以了。 不过我这里还是简单捋一捋思路&#xff0c;题目给一个数组&#xff0c;要求…

玩转数据可视化之R语言ggplot2:(十四)层级布局(一层一层增加你的绘图元素,使绘图更灵活)

【R语言数据科学可视化篇】 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可…

代码随想录二刷day53 | 动态规划之子序列 1143.最长公共子序列 1035.不相交的线 53. 最大子序和

day53 1143.最长公共子序列1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 1035.不相交的线53. 最大子序和1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如…

数据结构_进阶(1):搜索二叉树

1.内容 建议再看这节之前能对C有一定了解 二叉树在前面C的数据结构阶段时有出过&#xff0c;现在我们对二叉树来学习一些更复杂的类型&#xff0c;也为之后C学习的 map 和 set 做铺垫 1. map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构2. 二叉搜…

分布式事务-本地消息表

本地消息表方案核心思路 需要分布式处理的任务通过消息日志的方式来异步执行。消息日志可以存储到本地文本、数据库或消息队列&#xff0c;再通过业务规则自动或人工发起重试。 方案核心具体实现 包括数据模型和核心逻辑 业务规则 定义业务的消息配置如topic 、key、tag …

计算机网络基础-OSI七层模型 和 TCP/IP四层模型的对比

OSI七层模型 和 TCP/IP四层模型的对比 OSI七层模型&#xff1a; 理论上的网络通信模型 记忆&#xff1a; (物、链、网、输、会、示、用) TCP/IP四层模型&#xff1a; 实际上的网络通信标准 (1) 七层网络体系结构各层的主要功能&#xff1a; 应用层&#xff1a; 最上层的&am…

linux X系统 X窗口系统(X Window System)

Xorg是一个开放源代码的跨平台的图形系统&#xff0c;它是UNIX和Linux的主要图形系统&#xff0c;它的前身是XFree86。 Xorg是在桌面环境中提供显示和图形输入设备支持的主要架构。 它支持多种输入设备&#xff0c;如键盘&#xff0c;鼠标&#xff0c;触摸屏&#xff0c;手写板…

河南理工大学高校专区入驻飞桨AI Studio,优质教育资源等你来学!

近日&#xff0c;河南理工大学高校专区在飞桨人工智能学习与实训社区AI Studio上线&#xff0c;双方将携手搭建人工智能教学实训平台专区&#xff0c;汇集优质教学实训资源&#xff0c;校企共同培育复合型 AI 人才&#xff0c;为国家输送高质量人才&#xff0c;促进国家智能化进…

放射医学、影像医学、数字图像技术(采集和处理)PACS源码

PACS是一个涉及放射医学、影像医学、数字图像技术(采集和处理)、计算机与通讯、C/S体系结构的多媒体数据库管理信息系统&#xff0c;涉及软件工程、图形图像的综合及后处理等多种技术&#xff0c;是一个技术含量高、实践性强的高技术复杂系统。 系统概述&#xff1a; 1&#x…

编译原理(双语) 期末复习

在我的博客查看&#xff1a; https://chenhaotian.top/study/compilation-principle-final-review/ 编译原理&#xff08;双语&#xff09; 期末复习 注意&#xff1a;部分资料来自 chouxianyu.github.io&#xff0c;版权归原作者所有。 本文图片较多&#xff0c;加载速度受…

轻松实现文件改名——批量将日语文件名翻译成中文命名

文件改名是在处理大量文件时常见的需求&#xff0c;特别是当文件名用外语表示时&#xff0c;不太方便理解或分类。本教程将介绍如何使用便捷工具&#xff0c;批量将日语文件名翻译成中文命名&#xff0c;以提高文件的可读性和管理效率。 首先&#xff0c;第一步进入文件批量改…

走进分布式系统(分布式系统简介)

走进分布式系统 分布式系统简介分布式系统的架构演变过程初创期发展期成熟期 分布式系统的特性什么是分布式系统特性 分布式系统带来的问题 分布式中间件简介什么是分布式中间件常用的分布式中间件 分布式系统简介 分布式系统的架构演变过程 讲在前面&#xff0c;首先我们要了…

【uniapp】文件授权验真系统(含代码)

文章目录 前言一、框架选用二、数据库设计三、设计上传列表四、上传操作1.前端2.后端 五、修改操作六、访问操作七、二维码生成八、二维码访问九、删除操作总结 前言 吐槽&#xff1a;终于开通了【资源绑定】的功能了&#xff0c;之前还要一个一个的去贴链接 之前的同学联系…

ts学习基础篇(一)

旨在记录&#xff01; 这篇人都学废了&#xff0c;本想记录常用类型&#xff0c;越学越多&#xff0c;每一个都很重要… 一、string: 字符串类型二、number: 数字类型三、boolean: 布尔值四、array:数组五、tuple: 元组六、字面量七、object:对象八、any: 任意类型九、unknown:…

【KingFusion】用趋势曲线组件实现实时曲线的步骤

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 本节学习测试用KingFusion趋势曲线组件实现电流的实时曲线的展示。 一、效果演示&#xff1a; 展示实时曲线的运行效果&#xff0c;效果为KingFunsion3.6通过KingIOServer连接现场系统中实际数据的演示效果。 二、…

代码随想录-单调栈|ACM模式实践

代码随想录感想 ​​​​​​739. 每日温度 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 496. 下一个更大元素 I 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 503. 下一个更大元素 II 题目描述&#xff1a; …

我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater

我们现在使用SpringBoot 做Web 开发已经比之前SprngMvc 那一套强大很多了。 但是 用SpringBoot Web 做API 开发还是不够简洁有一些。 每次Web API常用功能都需要重新写一遍。或者复制之前项目代码。于是我封装了这么一个 抽出SpringBoot Web API 每个项目必备需要重复写的模块…