SpringCloud——Hystrix详解

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

目录

一、Hystrix介绍

1、分布式系统面临问题

2、Hystrix概念

3、Hystrix作用

(1)服务降级

(2)服务熔断

二、服务降级案例

1、搭建Eureka服务端

(1)创建maven工程

(2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)启动Eureka注册中心

2、搭建服务提供者Provider80

(1)创建maven工程

(2)导入依赖

(3)配置application.yml

(4)创建启动类

(5)创建controller(设置自身降级方法)

(6)测试自身降级

  3、搭建服务消费者Consumer83

(1)创建maven工程

(2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)创建远程调用服务接口

(6)创建controller

4、测试案例

 三、服务熔断

1、熔断设置参数

2、熔断类型

(1)熔断打开

(2)熔断关闭

(3)熔断半开


 文章来源地址https://www.toymoban.com/news/detail-415441.html

一、Hystrix介绍

1、分布式系统面临问题

        多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"。

        如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即"雪崩效应"。

        对于高流量的应用来说,单一的后端依赖可能会导致所有的服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

        所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

2、Hystrix概念

①Hystrix是一个用于处理分布式系统的延迟和容错的开源库,可以保证一个服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性;

②作为“断路器”,在一个服务出现故障时,可以通过短路器监控,返回一个可以处理的响应结果,保证服务调用线程不会长时间被占用,避免故障蔓延。

3、Hystrix作用

(1)服务降级

服务出现故障时,给故障服务降级到事先准备好的故障处理结果,将此结果返回给服务消费者,如:

 

客户端访问服务1,服务1调用服务2,服务2出现故障,Hystrix服务降级,返回一个可以处理的结果给服务1,服务1再以友好的错误界面返回给客户端。

SpringCloud——Hystrix详解

 

(2)服务熔断

熔断机制是应对服务雪崩的一种链路保护机制,当服务出现故障时,服务会进行降级,熔断该服务节点,迅速返回错误响应信息。当检测到服务访问正常时,恢复其链路节点。

SpringCloud——Hystrix详解

 

二、服务降级案例

1、搭建Eureka服务端

(1)创建maven工程

SpringCloud——Hystrix详解

 (2)导入依赖

导入Eureka服务端、web模块依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <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>
    </dependencies>

(3)配置application.yml

①服务端口为7001;

②Eureka服务端主机名;

③Eureka客户端:

register-with-eureka:是否在服务中心注册

fetchRegistry:是否可以在注册中心被发现

service-url:服务中心url地址

server:
  port: 7001

eureka:
  instance:
    hostname: localhost

  client:
    register-with-eureka: false
    fetchRegistry: false
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建主启动类

@EnableEurekaServer:Eureka服务端注解

@SpringBootApplication
@EnableEurekaServer
public class Eureka7001 {
    public static void main(String[] args) {
        SpringApplication.run(Eureka7001.class,args);
    }
}

(5)启动Eureka注册中心

访问http://localhost:7001

SpringCloud——Hystrix详解

2、搭建服务提供者Provider80

(1)创建maven工程

SpringCloud——Hystrix详解

 

(2)导入依赖

导入Eureka客户端、web模块、监控,Htstrix依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
 </dependencies>

 (3)配置application.yml

①配置服务端口号为80;

②配置服务应用名称;

③配置Eureka注册中心,开启注册,指明注册中心地址。

server:
  port: 80

spring:
  application:
    name: provider

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建启动类

@EnableEurekaClient:指明该服务为Eureka客户端

@EnableCircuitBreaker:开启Hystrix

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class Provider80 {
    public static void main(String[] args) {
        SpringApplication.run(Provider80.class,args);
    }
}

(5)创建controller(设置自身降级方法)

@HystriCommand注解:

fallbackMethod:指定服务降级后调用方法,降级方法参数一定要和controller方法参数一致

commandProperties:相关参数。

@RestController
public class FeignController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/provider")
    public String hello(){
        return "访问端口号为:"+port;
    }

    @HystrixCommand(fallbackMethod = "TimeoutHandler",commandProperties = {
            //2秒钟以内就是正常的业务逻辑
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="2000")
    })
    @GetMapping("timeout")
    public String timeout(){
        try {
            //睡眠3秒
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello";
    }

    //降级后方法,上面方法出问题,我来处理,返回一个出错信息
    public String TimeoutHandler() {
        return "访问请求失败了,服务不可用";
    }
}

(6)测试自身降级

因为服务延迟3秒后执行,而降级设置时间为2秒,所以访问该请求时,服务降级

SpringCloud——Hystrix详解

 测试完成后,为方便后边测试服务消费者降级,我们将服务提供者controller中时间设置为5秒以内业务为正常

@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")

  3、搭建服务消费者Consumer83

(1)创建maven工程

SpringCloud——Hystrix详解

 (2)导入依赖

引入OpenFeign、Eureka、web,服务监控,Hystrix依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  </dependencies>

(3)配置application.yml

①配置服务·端口号为83;

②配置服务名称为:Consumer83;

③配置Eureka客户端,开启注册。配置注册中心地址;

④开启Hystrix降级服务。

server:
  port: 83
spring:
  application:
    name: consumer83
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka  
feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。

(4)创建主启动类

开启Eureka客户端,远程条用Feign客户端,Hystrix服务

@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class Consumer83 {
    public static void main(String[] args) {
        SpringApplication.run(Consumer83.class,args);
    }
}

(5)创建远程调用服务接口

①@FeignClient注解,指定远程调用的服务名称,服务提供者Provider80、Provider81对应名称为:provider。

②接口中方法为:调用服务的controller方法。

@Component
@FeignClient(value = "PROVIDER")
public interface FeignService {
    //调用远程接口
    @GetMapping("/provider")
    public String hello();
}

(6)创建controller

远程调用服务时间超过1.5秒就会自动降级。

@RestController
public class FeignController {
    //调用远程服务接口
    @Autowired
    private FeignService feignService;

    @GetMapping("consumer")
    public String hello(){
        //调用接口
        return feignService.hello();
    }

    //超时降级演示
    @HystrixCommand(fallbackMethod = "TimeoutHandler",commandProperties = {
            //超过1.5秒就降级自己
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
    })
    @GetMapping("time")
    public String time(){
        return feignService.timeout();
    }
    
    //降级方法
    public String TimeoutHandler(){
        return "远程调用服务超时,调用失败";
    }
}

4、测试案例

①启动Eureka7001

②启动Provider80

③启动·Consumer83

④访问http://localhost:83/time

由于远程服务需要3秒后才能处理结果,而设置超时时间为1.5秒,所以服务消费者自动调用降级后的方法。

SpringCloud——Hystrix详解 

 三、服务熔断

1、熔断设置参数

①circuitBreaker.enabled:是否开启熔断;

②circuitBreaker.requestVolumeThreshold:当前服务失败几次后开启断路,默认20次;

③circuitBreaker.sleepWindowInMilliseconds:设置断路时间,过了该时间后会尝试恢复,在断路时间内,即使请求正确也会走降级方法;

2、熔断类型

(1)熔断打开

熔断打开后,在此时间内不会对该服务进行调用,而是直接访问降级方法。通过设置熔断时间,当达到该时间后,会尝试恢复该服务。

(2)熔断关闭

熔断关闭代表服务正常,不会干扰正常服务调用。

(3)熔断半开

熔断半开时,请求可以访问服务,若请求正常访问,则熔断会关闭;若请请求不正常,继续熔断,调用降级方法。

 

 

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

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

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

相关文章

  • 【Springcloud】elk分布式日志

    (1)什么是分布式日志 在分布式应用中,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。所以我们使用集中化的日志管理,分布式日志就是对大规模日志数据进行采集

    2024年02月09日
    浏览(45)
  • 【Springcloud】分布式搜索elasticsearch

    先看下翻译: elasticsearch是一款非常强大的 开源搜索引擎 ,可以帮助我们 从海量数据中快速找到需要的内容 以下是生活中ES的使用场景: 项目在运行的时候会产生海量的日志信息,而elasticsearch结合kibana、Logstash、Beats,也就是elastic stack( ELK ),即ELK技术栈。被广泛应用在

    2024年02月08日
    浏览(42)
  • SpringCloud分布式配置中心——Config

    本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 由于微服务越来越多,项目越来越庞大,每一个项目都至少有两三个不同环境的application.properties文件,不易管理,假设我们数据库迁移,那么所有配置文件中有关数据库的地址都需要更改,不

    2023年04月22日
    浏览(38)
  • 分布式事务 —— SpringCloud Alibaba Seata

    传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚。随着公司的快速发展、业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的微服务,分别使用独立的数据源,业务操作需要调用三个服务来完成

    2024年02月08日
    浏览(44)
  • SpringCloud——分布式请求链路跟踪Sleuth

    SpringCloud从F版已不需要自己构建Zipkin Server,只需要调用jar包即可 https://dl.bintray.com/oenzipkin/maven/io/zipkin/java/zipkin-server/ 下载:zipkin-server-2.12.9-exec.jar 运行:java -jar zipkin-server-2.12.9-exec.jar 浏览器访问: ================================================================================ 一条链路通过

    2024年02月16日
    浏览(43)
  • springcloud sleuth分布式请求链路跟踪

    在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败. Spring Cloud Sleuth提供了一套完

    2024年01月16日
    浏览(47)
  • 【分布式微服务专题】从单体到分布式(四、SpringCloud整合Sentinel)

    相对来说,Sentinel的学习难度比之之前的Dubbo要低了不少。不过在学习过程中也遇到了一些认知局限带来的困难。比如,虽然还是学习了Sentinel,但是不知道生产环境该如何配置才是最佳的状态。 说到底,Sentinel还是没有提供很好的文档支持。比如:生产最佳实践方案。 官方也

    2024年01月23日
    浏览(51)
  • 【SpringCloud框架之Config分布式配置中心】

    本笔记内容为尚硅谷SpringCloud框架开发Config配置中心部分 目录 一、概述 1、是什么 2、作用 二、Config服务端配置与测试 1、建仓库并克隆 2、新建项目 1.新建Module 2.POM 3.YML 4.主启动类 5.windows下修改hosts文件,增加映射 6.测试通过Config微服务是否可以从GitHub上获取配置内容  7.配

    2023年04月15日
    浏览(46)
  • 微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

    聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如:最大值

    2024年03月26日
    浏览(65)
  • SpringCloud学习路线(13)——分布式搜索ElasticSeach集群

    前言 单机ES做数据存储,必然面临两个问题: 海量数据的存储 , 单点故障 。 如何解决这两个问题? 海量数据的存储问题: 将索引库从逻辑上拆分为N个分片(shard),存储到多个节点。 单点故障问题: 将分片数据在不同节点备份(replica) 缺点是什么? 造成资源的消耗的

    2024年02月15日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包