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

本文主要是介绍微服务篇-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("系统错误,请稍后重试!");

    }

}

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

这篇关于微服务篇-C 深入理解第一代微服务(SpringCloud)_IV 深入理解Hystrix断路器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824881

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu