SpringCloud Hystrix 断路器介绍以及配置使用

2024-03-18 14:59

本文主要是介绍SpringCloud Hystrix 断路器介绍以及配置使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Hystrix 断路器介绍

Hystrix的断路器为服务级别的断路器,每个配置有HystrixCommand注解的接口都有自己独立的断路器,断路器非应用级别。每个服务的断路器控制着对应服务对外提供服务的状态。即正常对外提供调用,或打开断路器状态即跳闸状态不能进行正常调用,或半开状态允许一个服务调用用来进行服务可用性测试。

二、Hystrix断路器状态

断路器有三种状态 关闭(CLOSE)、开启(OPEN)、半开状态(HALF_OPEN)。断路器默认关闭状态,即非工作中状态,当触发熔断后状态变更为开启(OPEN)状态。在等待到指定时间后Hystrix会放测试请求 测试服务是否开启,这期间断路器会变为半开状态(HALF_OPEN),熔断测试服务调用可用则变更断路器状态为关闭状态(CLOSE),若不可用则状态变更为开启状态(OPEN),再继续等到指定时间后放测试请求。。。

  • Closed:关闭状态(断路器关闭),所有请求都正常访问。代理类维护了最近失败的调用次数,如果某次调用失败,则使失败次数加一,如果最近失败次数超过了在给定时间内允许失败的阈值,则代理类切换到断开(OPEN)状态。此时代理类开启了一个超时时钟,当超时时钟超过了该时间,则切换到半开(HALF_OPEN)状态。该超时时间的设定是给系统一个时机来减轻系统压力或给系统一个修正错误的机会。
  • OPEN:打开状态(断路器开启),所有的请求都会被降级。 在关闭状态的短路器上,默认值:10s 内,有20次请求,有超过50%的错误调用则会触发断路器进入打开状态。默认5秒后进入半开状态。默认值参考类:com.netflix.hystrix.HystrixCommandProperties
  • HALF_OPEN:半开状态。半开状态不是永久的,打开后会进入休眠时间(默认5S),随后断路器进入半开状态。此时会释放一个请求通过,若这个请求是健康的,则会关闭断路器,否则又进入开启状态,然后进行休眠一段时间,如此重复。。。。

注意:在单次的调用失败或者超时时,也会走服务得降级方法。但并不一定会打开断路器。所以反过来说,当发生了服务降级,并不一定触发打开了断路器。

三、使用注解方式配置短路器

@HystrixCommand(fallbackMethod = "getPaymentFallBack",commandProperties = {@HystrixProperty(name="circuitBreaker.enabled",value = "true"),//开启断路器@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),//打开断路器的单位时间内最小请求数@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //开启断路器的单位时间@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60") //开启断路器的最小失败率60%
})
@GetMapping("/consumer/get2/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){

解释:在HystrixCommand注解的 fallbackMethod属性中指定了失败的降级方法。

commandProperties 属性中 

 @HystrixProperty(name="circuitBreaker.enabled",value = "true") 表示是否开启断路器功能;

@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10") 表示指定触发断路器打开的单位时间内的最小请求数;

@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000") 表示打开断路器多久后会进入半开状态,进行再次进行一次测试该服务请求。单位毫秒。

@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60") 表示在上面10秒内的最小请求数为10次的情况下达到最小失败率60%时,会打开断路器。

四、测试验证短路器工作状态

测试步骤:

1,启动Eureka服务,启动监控服务,启动生产者服务工程,启动消费者工程服务。

2,访问一次请求接口http://127.0.0.1/consumer/product/get/6203063

3,打开仪表盘监控页面进行查看当前监控界面

4,根据服务设置的打开断路器的场景:10秒内进行6次以上的错误请求,然后查看该服务的断路器状态;

连续快速访问 http://127.0.0.1/consumer/product/get2/999 会进行触发报错。

通过上图我们可以看出,当出现6次失败时,仪表盘中断路器状态变更为OPEN,在OPEN的状态下,我们访问正常的参数6203063时,也不能进行了降级处理,但是隔了大约5秒我们访问正常参数时进行了正常返回后,断路器的状态变更为关闭状态。符合之前配置的效果。

五、项目完整目录结构文件如下

1.pom.xml  其中cloud-api-common 依赖为实体类公共jar包 代码参考《公共代码子模块创建》

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>SpringCloud</artifactId><groupId>com.xiaohui.springCloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>hystrix_order_service_rest</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>com.xiaohui.springCloud</groupId><artifactId>cloud-api-common</artifactId><version>${project.version}</version></dependency><!-- Eureka 客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><!-- web依赖开始 --><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><!-- web依赖结束 --><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>
</project>

2,application.yml 改配置文件中的配置为全局服务配置,优先级别低于Hystrix服务级别上的注解配置

server:port: 80 #服务端口
spring:application:name: cloud-order-rest-service #服务名称
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka1.com:9000/eureka/instance:prefer-ip-address: true #使用ip进行注册instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册服务IDlease-renewal-interval-in-seconds: 5 #发送心跳间隔时间 秒lease-expiration-duration-in-seconds: 10 # 服务续约时间 10秒内没有发送心跳(宕机)hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000circuitBreaker:requestVolumeThreshold: 5 #触发熔断的最小请求次数每10秒,默认20 /10ssleepWindowInMilliseconds: 10000 #熔断多少秒后去重新尝试请求,默认 5s。打开状态的持续时间errorThresholdPercentage: 50 #触发熔断的失败请求数最小占比,默认50%#actuator配置暴露的端点 * 表示全部。 还有 info、health、beans等
management:endpoints:web:exposure:include: '*'

3,启动类 com.xiaohui.hystrix.RestOrderApplication

package com.xiaohui.hystrix;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class RestOrderApplication {public static void main(String[] args) {SpringApplication.run(RestOrderApplication.class,args);}
}

4,配置类 com.xiaohui.hystrix.config.ApplicationContextConfig,主要为在spring容器中注入 RestTemplate  对象,并进行配置负载均衡注解。

package com.xiaohui.hystrix.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/**** 相当于 spring的 application.xml bean注解相当于 bean 标签*/
@Configuration
public class ApplicationContextConfig {@LoadBalanced@Beanpublic RestTemplate getRestTemplate(){return  new RestTemplate();}
}

5,业务类 Controller,  com.xiaohui.hystrix.controller.OrderAntoController

package com.xiaohui.hystrix.controller;import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.xiaohui.springcloud.entities.CommonResult;
import com.xiaohui.springcloud.entities.Payment;
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.RestController;
import org.springframework.web.client.RestTemplate;import java.util.concurrent.TimeUnit;@RestController
@DefaultProperties(defaultFallback = "defaultFallBack")
public class OrderAntoController {@Autowiredprivate RestTemplate restTemplate;/*** 使用注解配置熔断保护* @param id* @return*/@HystrixCommand(fallbackMethod = "getPaymentFallBack",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "5000")})@GetMapping("/consumer/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){if(id != 6203063L){throw new RuntimeException("查询商品服务挂了.....");}try{TimeUnit.SECONDS.sleep(4);}catch (Exception e){}CommonResult<Payment> commonResult = restTemplate.getForObject("http://cloud-payment-service/payment/get/"+id,CommonResult.class);return  commonResult;}/*** 降级方法,需要和降级的方法入参和返回值一致* @param id* @return*/public CommonResult<Payment> getPaymentFallBack( Long id){System.out.println("触发了降级逻辑");return new CommonResult<>(400,"触发了FallBack降级逻辑。。。",null);}@HystrixCommand(fallbackMethod = "getPaymentFallBack",commandProperties = {@HystrixProperty(name="circuitBreaker.enabled",value = "true"),//开启断路器@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),//打开断路器的单位时间内最小请求数@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //开启断路器的单位时间@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60") //开启断路器的最小失败率60%})@GetMapping("/consumer/get2/{id}")public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){if(id != 6203063L){throw new RuntimeException("查询商品服务挂了.....");}CommonResult<Payment> commonResult = restTemplate.getForObject("http://cloud-payment-service/payment/get/"+id,CommonResult.class);return  commonResult;}/*** 统一降级方法不需要入参* @return*/public CommonResult<Payment> defaultFallBack(){System.out.println("触发了统一降级逻辑");return new CommonResult<>(400,"触发了defaultFallBack降级逻辑。。。",null);}
}

 

 

这篇关于SpringCloud Hystrix 断路器介绍以及配置使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题