微服务篇-C 深入理解第一代微服务(SpringCloud)_IV 深入理解Hystrix断路器

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

Part 1 理论部分

1 什么是微服务系统中的高可用?

在复杂的大型微服务系统中,高可用相关的技术方案非常重要,高可用架构中非常重要的一个环节,就是如何将微服务系统中的各个服务打造成高可用服务集群,从而可以从容应对在微服务环境下可能会遇到的各种各样的问题,避免整个微服务系统被某个服务的故障给拖垮,比如:服务间的调用超时、调用失败等等。

要解决这些棘手的、影响微服务系统可用性的问题,就要涉及到高可用解决方案中很多非常重要的技术点,包括:

资源隔离、

服务限流和过载保护、

熔断、

优雅降级、

容错、

超时控制、

监控运维等。

2 什么是服务雪崩效应?

服务雪崩效应产生于所有服务的请求都堆积在同一个线程池中的情况,因为所有的请求都是同一个线程池进行处理,如果在高并发情况下,所有的请求全部访问某个服务的同一个接口,达到线程池默认的最大极限后,会导致其他的服务也无法访问,这就是服务雪崩效应。

解决服务雪崩效应可以使用服务隔离机制实现(线程池隔离和信号量拦截)。

3 什么是服务降级?

在高并发情况下,为了防止用户一直等待,当响应时间过长时(可以设置一个最大响应等待时间),需要使用服务降级的方式调用fallBack方法,直接返回一个友好的提示给客户端,从而减少响应时间。

4 什么是服务熔断?

服务熔断的目的是为了保护服务,在高并发情况下,如果请求数量达到了服务能承受的最大极限(这个最大极限可以自行手动设置,也叫最大阈值),如果流量超出了设置的最大阈值,则直接拒绝访问,保护当前服务。然后可以使用服务降级来返回一个友好提示,所以推荐服务熔断和服务降级一起使用。

5 什么是服务隔离?

默认情况下,只有一个线程池来维护所有的服务接口,如果大量的请求访问同一个服务接口,达到Tomcat线程池默认的最大极限后,可能会导致其他服务也无法访问。因此需要基于服务隔离机制保证服务和服务之间相互独立,互不影响。

可以使用独立的线程池实现服务隔离,相当于每个接口(服务)都有自己独立的线程池,因为所有线程池互不影响,这样也就可以用来解决服务雪崩效应。

服务隔离最常用的实现方案有两种:线程池隔离和信号量拦截。

线程池隔离:每个服务接口都有自己独立的线程池,线程池之间完全隔离,互不影响,这样即使一个服务的线程池满了也不会影响到其他服务。

信号量拦截:使用一个原子计数器(或信号量)记录当前运行的线程个数,当请求进来时先判断计数器的数值,若超过了设置的最大线程数则直接拒绝该请求,若没有超过则放行,然后计数器+1,当请求返回响应成功后计数器-1。

6 什么是服务限流?

服务限流就是对每个接口的访问量进行限制,常用的服务限流算法有漏桶、令牌桶,计数器也可以实现粗暴限流。

7 什么是Hystrix?

Hystrix是由国外知名的影视网站Netflix提供的开源的高可用断路器框架,Hystrix能够完美地解决微服务系统中打造高可用服务集群所要面对的一系列技术难题。

在微服务架构中,我们把每块业务都拆成单个的服务模块,当需求需要的时候,服务之间可以互相调用,但是,由于网络原因或其它的一些因素,有可能会出现服务不可用的情况,当某个服务出现问题时,如果其他服务继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应,导致整个系统宕掉。因此,就有人提出用断路器来解决这一问题。

Hystrix“豪猪”,具有自我保护的能力,Hystrix可以通过以下几种机制来解决服务雪崩效应:

1 资源隔离:包括线程池隔离和信号量拦截,限制调用分布式服务的资源运行,某一个调用的服务出现问题不会影响到其他服务调用。

2 降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

3 熔断:当失败率达到阈值自动触发服务降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败能够快速恢复。

4 缓存:提供了请求缓存、请求合并实现。

Part 2 实践部分

Hystrix环境搭建

Maven依赖信息

   <!-- hystrix断路器 -->

      <dependency>

          <groupId>org.springframework.cloud</groupId>

          <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

      </dependency>

开启Hystrix断路器

feign:

  hystrix:

enabled: true

   

#### hystrix禁止服务超时时间

hystrix: 

 command:

   default:

      execution:

       timeout:

        enabled: false

@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

@EnableHystrix

public class AppOrder {

   public static void main(String[] args) {

      SpringApplication.run(AppOrder.class, args);

   }

}

服务降级处理

   @HystrixCommand(fallbackMethod = "orderToUserInfoFallback")

   @GetMapping("/orderToUserInfo")

   public ResponseBase orderToUserInfoHystrix() {

      System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());

      return memberServiceFeigin.getUserInfo();

   }

   @RequestMapping("/orderToUserInfoFallback")

   public ResponseBase orderToUserInfoFallback() {

      return setResultError("系统错误!!!!");

   }

Fallback回调

   @RequestMapping("/orderToUserInfo")

   public ResponseBase orderToUserInfo() {

      return memberServiceFeigin.getUserInfo();

   }

  @Component

public class MemberServiceFallback extends BaseApiService implements   MemberServiceFeigin {

    public ResponseBase getUserInfo() {

        // 服务降级处理

        return setResultError("系统错误,请稍后重试!");

    }

}

本文部分素材转载自蚂蚁课堂

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

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

相关文章

怎样隐藏查询和分组?

发布查询时&#xff0c;遇到信息量较大需要提前制作好&#xff0c;但不用马上发布的查询&#xff0c;该怎样隐藏查询和分组&#xff1f; &#x1f4cc;使用教程 01“开始”和“暂停”查询 如果想要隐藏查询&#xff0c;可以通过点击绿色开始按钮来暂停查询&#xff0c;暂停后的…

C++多态实现原理深度解析

C多态实现原理深度解析 目录 C多态实现原理深度解析 一、引言&#xff1a;多态性的基本概念与重要性 二、虚函数表&#xff08;VTable&#xff09;与虚函数指针&#xff08;VPtr&#xff09; 三、动态绑定与静态绑定 四、纯虚函数与抽象基类 五、继承与多态的关系 六、多…

【软考高项】十五、信息系统工程之系统集成

1、集成基础 定义&#xff1a;通过硬件平台、网络通信平台、数据库平台、工具平台、应用软件平台将各类资源有机、高效地集成到一起&#xff0c;形成一个完整的工作台面 基本原则包括:开放性、结构化、先进性和主流化 2、网络集成 包括&#xff1a;传输子系统、交换子系统、…

调试西门子G120STO模式出现O.F1600等一系列报警

目录 一、现象描述 二、 解决经历 三、结果展示 四、总结 一、现象描述 在调试使用西门子G120的STO功能时&#xff0c;一直无法使用&#xff0c;变频器也一直在报警(RDY灯红灯快闪、SAFE灯黄灯快闪)。在博图上查询发现下面一系列的故障报警。 二、 解决经历 也查询了很多网…

Vue中的状态管理Vuex,基本使用

1.什么是Vuex? Vuex是专门为Vue.js设计的状态管理模式;特点:集中式存储和管理应用程序中所有组件状态,保证状态以一种可预测的方式发生变化。 1.1.什么是状态管理模式? 先看一个单向数据流的简单示意图 state:驱动应用的数据源 view:以声明方式将state映射到视图 actions:…

实施业务连续性方案

实施业务连续性方案&#xff0c;可以提高组织在面对突发事件和业务中断时的韧性和恢复能力&#xff0c;保障业务的持续运行和服务的可用性。请注意&#xff0c;具体的方案内容应根据组织的特点、业务需求和风险状况进行定制化。 一、目标与范围 确定业务连续性方案的目标&#…

导入GPG密钥的方法

在配置Docker时&#xff0c;发现Docker官方和阿里云导入gpg秘钥的方法不同&#xff0c;借此记录。 Docker官方 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg 优点: 安全性: 这种方法不会直接将密钥添加到APT的密…

SAP前台处理:物料主数据创建<MM01>之会计视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

c语言扫雷改进版

目录 文章目录 主体 整体架构流程 技术名词解释 技术细节 测试情况 文章目录 概要整体架构流程技术名词解释技术细节测试情况 主体 主体包括菜单&#xff0c;游戏规则简绍&#xff0c;选择进行与否 int main() {int input;srand((unsigned int)time(NULL));do{ menu()…

GPT实战系列-LangChain的Prompt提示模版构建

GPT实战系列-LangChain的Prompt提示模版构建 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

科技云报道:造完“大模型”,“具身智能”将引领AI下一个浪潮?

科技云报道原创。 资深机器人专家Eric Jang不久前曾预言&#xff1a;“ChatGPT 曾在一夜之间出现。我认为&#xff0c;有智慧的机器人技术也将如此。” 3月13日深夜&#xff0c;一段人形机器人的视频开始热传。 在视频中&#xff0c;Figure的人形机器人&#xff0c;可以完全…

postgresql查看数据库占用空间大小

在PostgreSQL中&#xff0c;查看数据库及数据表当前数据的占用量可以通过执行特定的SQL查询来实现。以下是几种常用的方法&#xff1a; 1.查看单个数据表的占用空间大小&#xff1a; 使用pg_size_pretty和pg_total_relation_size函数可以获取特定数据表的占用空间大小&#xf…

H12-821_887

887.当业务饥配置为VLANPool时&#xff0c;若用户在一定时间内连续获取IP地址失败且配置了dhcp update vlan assignment threshold命令&#xff0c;则会触发VLANPoo1为用户分配新的VLAN&#xff0c;使用户在新VLAN中重新获取IP地址。 A.TRUE B.FALSE 答案&#xff1a;A 注释&a…

【算法】差分算法详解(模板)

类似于数学中的求导和积分之间的关系&#xff0c;差分可以看成前缀和的逆运算。 差分数组&#xff1a; 首先给定一个原数组a&#xff1a;a[1], a[2], a[3],,,,,, a[n]; 然后我们构造一个数组b &#xff1a; b[1] ,b[2] , b[3],,,,,, b[i]; 使得 a[i] b[1] b[2 ] b[3] ,,,…

Java实现10万,并发去重,优雅地处理重复请求!

对于一些用户请求&#xff0c;在某些情况下是可能重复发送的&#xff0c;如果是查询类操作并无大碍&#xff0c;但其中有些是涉及写入操作的&#xff0c;一旦重复了&#xff0c;可能会导致很严重的后果&#xff0c;例如交易的接口如果重复请求可能会重复下单。 重复的场景有可…

C语言实现飞行小游戏

以下是一个简单的C语言实现飞行小游戏的代码示例。这个游戏中&#xff0c;一个飞机需要控制左右移动来避开悬挂在屏幕上方的飞行杂物&#xff0c;代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h&…

CAD建筑版2024 安装教程

CAD建筑版是一种专门用于建筑设计和绘图的CAD软件版本。它提供了专业的建筑设计工具和功能&#xff0c;帮助建筑师、设计师和工程师在建筑领域进行快速、准确和高效的设计工作。 CAD建筑版具备建筑相关的库和元素&#xff0c;用户可以方便地使用预定义的建筑符号和元素进行建筑…

网络基础(二)

1、应用层 程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层&#xff1b; 1.1、再谈 "协议" 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些 "…

设计模式学习笔记 - 设计原则与思想总结:2.运用学过的设计原则和思想完善之前性能计数器项目

概述 在 《设计原则 - 10.实战&#xff1a;针对非业务的通用框架开发&#xff0c;如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器》中&#xff0c;我们讲解了如何对一个性能计数器框架进行分析、设计与实现&#xff0c;并且实践了一些设计原则和设计思想。当…

IP代理技术革新:探索数据采集的新路径

引言&#xff1a; 随着全球化进程不断加深&#xff0c;网络数据采集在企业决策和市场分析中扮演着愈发重要的角色。然而&#xff0c;地域限制和IP封锁等问题常常给数据采集工作带来了巨大挑战。亿牛云代理服务凭借其强大的网络覆盖和真实住宅IP资源&#xff0c;成为解决这些问…