【Spring Cloud 六】Hystrix熔断

这篇具有很好参考价值的文章主要介绍了【Spring Cloud 六】Hystrix熔断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

【Spring Cloud一】微服务基本知识
【Spring Cloud 三】Eureka服务注册与服务发现
【Spring Cloud 四】Ribbon负载均衡
【Spring Cloud 五】OpenFeign服务调用

背景

目前开发的项目其微服务之间的熔断处理方式使用的就是Hystrix的方式,为了更加的体会到它代码的便捷和高效,所以博主对Hystrix进行了再次学习和实践,加强对Hystrix的整体理解。

一、Hystrix是什么

Hystrix是Netflix开源的一款用于处理分布式系统故障容错延迟容错的工具。它提供了熔断器的功能,能够阻止分布式系统中出现级联故障。

服务雪崩

如下发的图所示:

  1. 用户去请求A服务,A服务web服务器会分配一个线程支持用户的访问
    A发现需要完成用户的操作需要去调用B服务。
  2. A去请求B服务,B的web服务器也会分配一个线程支持A的访问
    B发现需要完成A的操作需要去调用C。
  3. B去调用C但是C宕机了,B并不知道,还是一如既往的去调用C
  4. 导致A和B的线程都没有回收
    但是此时又有大量请求进入A服务或者B服务,当将web容器的线程资源会被消耗完,服务就会瘫痪。服务A和服务B也就瘫痪了

这种由于一个服务出现故障,导致其余服务跟着产生故障,最后导致整个系统出现严重故障的现象就是服务雪崩
【Spring Cloud 六】Hystrix熔断,微服务,spring cloud,hystrix,spring

服务容错的相关概念

服务容错是确保系统在出现故障或异常情况继续保持可用性的一系列技术和方法。

熔断器

熔断器是一种防止故障蔓延的模式,在一个系统中,当其中一个服务发送故障的时候,熔断器会中断对该服务的请求,并返回预先设定的降级措施,从而防止对整个系统造成影响。

降级

降级是一种在服务发生故障时提供的备选响应的策略,确保用户在服务故障时依然能够得到响应。

超时控制

一个服务的响应时间可能因网络、资源等问题而增加。超时控制是指在发起请求后设置一个合理的超时时间,如果服务在规定时间内没有响应,就人物请求超时,并根据预定策略进行处理,如降级响应。

限流

限流是一种用于控制系统访问速率的策略,防止过多的请求同时涌入系统,导致系统过载而崩溃。通过限制请求的速率,可以保证系统在承受能力范围内稳定运行。

二、会什么要有Hystrix

为什么要有Hystrix,Hystrix解决了什么问题?

Hystrix在分布式系统中解决了故障容错、延迟容错、请求合并与缓存、实时监控、异常处理等问题,保证系统在出现故障是一眼能够保持可用性,防止级联故障的发生。

三、如何使用Hystrix进行熔断处理整体

整个系统中有三个服务,Eureka服务,一个服务提供者,一个服务消费者

【Spring Cloud 六】Hystrix熔断,微服务,spring cloud,hystrix,spring
如何搭建Eurka服务可以访问这篇博客【Spring Cloud 三】Eureka服务注册与服务发现


补充:Hystrix是通过隔离服务的访问点阻止级联故障(熔断器Circuit Breaker),并提供了故障的解决方案(服务降级FallBack),从而提高整个分布式系统的高可用。

项目代码

服务提供者

pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wangwei</groupId>
    <artifactId>rent-car-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rent-car-service</name>
    <description>rent-car-service</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

yml配置文件
server:
    port: 8080

spring:
    application:
        name: rent-car-service
eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔

启动类
@SpringBootApplication
@EnableEurekaClient
public class RentCarServiceApplication {

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

}

controller
@RestController
public class RentCarController {

    @GetMapping("rent")
    public String rent(){
        return "租车成功";
    }
}

服务消费者

pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.wangwei</groupId>
	<artifactId>customer-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>customer-service</name>
	<description>customer-service</description>
	<properties>
		<java.version>8</java.version>
		<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
	</properties>
	<dependencies>


		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

yml配置文件

server:
  port: 8081

spring:
  application:
    name: customer-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔
feign:
  hystrix:
    enabled: true  # 开启熔断


启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker //开启断路器
public class CustomerServiceApplication {

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

}
feign
/**
 * 这里需要制定熔断类
 */
@FeignClient(value = "rent-car-service",fallback = CustomerRentFeignHystrix.class)
public interface CustomerRentFeign {

    @GetMapping("rent")
     String rent();


}
hystrix
@Component
public class CustomerRentFeignHystrix implements CustomerRentFeign {

    /**
     * 这个方法是备选方案
     * @return
     */
    @Override
    public String rent() {
        return "备选方案";
    }
}
controller
@RestController
public class CustomerController {

    @Autowired
    private CustomerRentFeign customerRentFeign;

    @GetMapping("customerRent")
    public String CustomerRent(){
        System.out.println("客户来租车了");
        String rent = customerRentFeign.rent();
        return rent;
    }

}

服务启动

先启动Eureka服务端再启动服务提供者最后启动服务消费者

【Spring Cloud 六】Hystrix熔断,微服务,spring cloud,hystrix,spring
当我们将服务提供者进行下线之后,服务消费者再调用服务提供者的时候,先进行了熔断,再执行了降级处理(执行备选方案)。
【Spring Cloud 六】Hystrix熔断,微服务,spring cloud,hystrix,spring文章来源地址https://www.toymoban.com/news/detail-625774.html

总结

  1. 以上就是Hystrix的基本使用,当服务出现故障时,开启熔断器执行降级方案。
  2. 后序博主会手动实现熔断器来加强对熔断器的理解。
  3. 由于Netflix已经宣布停止维护Hystrix,推荐使用Resilience4j或Sentinel等其他替代方案来处理容错和熔断问题。

到了这里,关于【Spring Cloud 六】Hystrix熔断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务 – Spring Cloud – Hystrix

    hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。 Hystrix is no longer in active development, and is currently in maintenance mode. Hystrix 已经停更 服务降级 服务熔断 服务限流 服务超时 服务宕机(服务崩掉、机房断电、服务故

    2024年02月11日
    浏览(45)
  • Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

    雪崩效应:   如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉 , 这就是雪崩效应 , 那么其实短信服务又不是我们主要业务 , 这个时候我们可以采用服务降级 , 服务降级就是暂时的把短信服务停掉能用就返回不能用就返回个错误 , 但是它也不会影响

    2024年02月07日
    浏览(43)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级

    直击微服务作用     遇到了什么问题?         将单体架构拆分成微服务架构后,如果保证多个服务(项目)正常运行?     哪个技术可以解决这个问题?         微服务技术         服务治理: 服务管理,维护服务与服务之间的关系     这个技术如何使用?         netflix/网飞:

    2024年02月03日
    浏览(67)
  • Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud OpenFeign是一个声明式的服务调用框架,基于Feign并整合了Ribbon和Hystrix;目标是简化分布式系统中编写服务间调用的代码,并提供一种更加优雅和便捷的方式来进行服务之间的通信 依赖导入 application.yml配置 启

    2024年02月05日
    浏览(52)
  • spring cloud 之 Hystrix

    Hystrix是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败是时,仍具有弹性。 当服务器A调用服务器B时,如果服务器B宕机,则服务器A不去调用。当服务器B在时间范围内未响应,服务器A延迟时间等待服务器B的响应,在SpringCloud框架里

    2024年02月16日
    浏览(37)
  • 【Spring Cloud系列】Hystrix应用详解

    在一个分布式系统中,每个服务都可能会调用其它的服务器,服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。 如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调

    2024年02月16日
    浏览(55)
  • 第十一章 : Spring Cloud Hystrix 实战运用

    第十一章 : Spring Cloud Hystrix 实战运用 前言 本章知识点:本章将系统全面地介绍Spring Cloud Hystrix的相关知识点,包括Hystrix、设计目标,以及Spring Cloud Hystrix的基础用法和实战技巧,同时演示了Hystrix Dashboard的监控集成以及Turbine聚合Hystrix的监控。 Hystrix是由Netflix开源的一个针对

    2024年01月16日
    浏览(37)
  • Spring Boot 中的 Spring Cloud Hystrix 是什么,原理,如何使用

    在分布式系统中,服务之间的调用是不可避免的。但是,当一个服务调用另一个服务时,如果被调用的服务出现了故障或者延迟,那么调用者也会受到影响,甚至会导致整个系统的崩溃。为了解决这个问题,Netflix 提供了一种解决方案:Hystrix。 在 Spring Cloud 中,Hystrix 是一个

    2024年02月12日
    浏览(46)
  • Spring Cloud Feign实战来袭:工程中配置断路器Hystrix报错NoClassDefFoundError:HystrixCommandAspect解决方案

    在Spring Cloud Feign工程中配置断路器Hystrix的时候,pom.xml文件已经加入Hystrix相关的jar: Application.java: 可以看出来是找不到HystrixCommandAspec.java这个类,于是在github上找到这个源文件: https://github.com/dmgcodevil/Hystrix/blob/958ec5d7b4bb967be077a4c2bbcdc71e7a7f5248/hystrix-contrib/hystrix-javanica/src/mai

    2024年02月16日
    浏览(48)
  • 【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制

    目录 前言 一、Sentinel 入门 1.1 什么是 Sentinel ? 1.2 微服务集成 Sentinel  1.3 安装Sentinel控制台 二、Jmeter 压力测试工具 2.1 Jmeter 介绍  2.2 Jmeter 安装 2.3 接口测试 三、Sentinel 使用 3.1 限流规则 3.1.1 warm up(预热模式) 3.1.2 排队等待 3.1.3 关联 3.1.4 链路 3.2 熔断规则 3.3 服务降级     

    2024年02月01日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包