SpringCloud 进阶之Hystrix(断路器)

1. Hystrix 断路器

  • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,
    比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分
    布式系统的弹性;
  • "断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方
    返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就
    保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

1.1 服务熔断

  • 熔断机制是应对雪崩效应的一种微服务链路保护机制;
  • 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"
    的响应信息;当检测到该节点微服务调用正常后恢复调用链路;

新建microservicecloud-provider-dept-hystrix-8001

// 参考 microservicecloud-provider-dept-8001

// pom.xml
<!-- hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

// application.yml
eureka:
  client: # 客户端注册进eureka服务列表内
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
  instance:
    instance-id: microservicecloud-dept8001-hystrix # 自定义hystrix相关的服务名称信息
    prefer-ip-address: true  # 访问路径可以显示IP地址

// 修改DeptController
@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
    // 一旦调用服务方法失败并抛出错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
    @HystrixCommand(fallbackMethod="processHystrix_Get")
    public Dept get(@PathVariable("id") Long id) {
        Dept dept = this.deptService.get(id);
        if(null == dept) {
            throw new RuntimeException("该ID:"+id+"没有对应的信息");
        }
        return dept;
    }

    public Dept processHystrix_Get(@PathVariable("id") Long id) {
        return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,null -- @HystrixCommand")
                .setDb_source("no this database in MySQL");
    }
}

// 修改主启动类DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient // 本服务启动后,自动注册进eureka服务中
@EnableDiscoveryClient // 服务发现
@EnableCircuitBreaker // 对Hystrix熔断机制的支持
public class DeptProvider8001_Hystrix_App {

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

// 测试访问:
// http://localhost:8082/consumer/dept/get/112

1.2 服务降级

  • 服务降级:整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来;
  • 服务降级处理是在客户端实现完成的,与服务端没有关系;
  • 当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值;
// 修改microservicecloud-api工程
// 根据已有的DeptClientService接口,新建一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory
@Component  // 不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {

    @Override
    public DeptClientService create(Throwable arg0) {

        return new DeptClientService() {

            @Override
            public Dept get(long id) {
                return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
                        .setDb_source("no this database in MySQL");
            }

            @Override
            public List<Dept> list() {

                return null;
            }

            @Override
            public boolean add(Dept dept) {

                return false;
            }
        };
    }
}

// 修改microservicecloud-api工程, DeptClientService接口
// 在注解@FeignClient中添加 fallbackFactory 属性值
@FeignClient(value="MICROSERVICECLOUD-DEPT",
            fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

    @RequestMapping(value="/dept/get/{id}", method= RequestMethod.GET)
    public Dept get(@PathVariable("id") long id);

    @RequestMapping(value="/dept/list", method= RequestMethod.GET)
    public List<Dept> list();

    @RequestMapping(value="/dept/add", method= RequestMethod.POST)
    public boolean add(Dept dept);
}

// mvn clean
// mvn install

// 修改microservicecloud-consumer-dept-feign 工程
// application.yml
feign:
  hystrix:
    enabled: true

// 测试访问:
// http://localhost:8082/consumer/dept/get/1
// 然后手动关闭工程:microservicecloud-provider-dept-8001

1.3 服务监控(hystrixDashboard)

新建工程microservicecloud-consumer-hystrix-dashboard

// pom.xml
<!-- hystrix和hystrix-dashboard 相关 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>

// application.yml
server:
  port: 9001

// 主启动类:
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App {

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

// 所有Provider微服务提供类(8001/8002/8003)都需要提供监控依赖配置
// (8001/8002/8003)pom.xml
<!-- actuator 监控信息完善 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

// 启动相关工程
// microservicecloud-consumer-hystrix-dashboard   // 访问: http://localhost:9001/hystrix
// 3个Eureka集群
// microservicecloud-provider-dept-hystrix-8001
    // 访问: http://localhost:8001/dept/get/1
    // 访问: http://localhost:8001/hystrix.stream

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/9191547.html

时间: 2024-08-28 08:47:38

SpringCloud 进阶之Hystrix(断路器)的相关文章

SpringCloud学习系列-Hystrix断路器(1)

Hystrix断路器  1.是什么    分布式系统面临的问题 服务雪崩多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”.如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”. 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和.比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他

SpringCloud学习系列-Hystrix断路器(2)

服务熔断 1.是什么 服务熔断熔断机制是应对雪崩效应的一种微服务链路保护机制.当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息.当检测到该节点微服务调用响应正常后恢复调用链路.在SpringCloud框架里熔断机制通过Hystrix实现.Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制.熔断机制的注解是@HystrixCommand. 2.实验代码   1.

springCloud进阶(微服务架构&amp;Eureka)

springCloud进阶(微服务架构&Eureka) 1. 微服务集群 1.1 为什么要集群 为了提供并发量,有时同一个服务提供者可以部署多个(商品服务).这个客户端在调用时要根据一定的负责均衡策略完成负载调用. 1.2 服务提供者集群-同一种服务(服务名)部署多个 实际生产就是同一种服务多部署几台服务器,开发时就是用端口来区分. 1) 拷贝一份8001 2) 修改主类-改名 3) 改8002yml,端口 4) 服务提供者 1.3 服务消费者负载均衡调用 1)常见的负载均衡技术 Ribbon

SpringCloud 进阶之SpringCloud

1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心; Eureka包含两个组件:Eureka Server 和 Eureka Client Eureka Server提供服务注册和发现; Eureka Client是一个java客户端; 1.1 三大角色 Eureka Server提供服务注册和发现; Service Provider服务提供方

SpringCloud学习系列之三----- 断路器Hystrix和断路器监控Dashboar

前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模式.主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线. 开发准备 开发环境 JDK:1.8 SpringBoot:2.1.1.RELEASE SpringCloud:Finchley 注:不一定非要用上述的版本,可以根据

Spring Cloud构建微服务架构—Hystrix断路器

断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,"断路器"能够及时的切断故障电路,防止发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),直接切断原来的主逻辑调用.但是,在Hystrix中的断路器除了切断主逻辑的功能之外,还有更复杂的逻辑

SpringCloud中使用Hystrix

引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gateway,再加一个Eureka Server 服务搭建 2.1. 注册中心 关于这一部分,参见<SpringCloud学习笔记(1)--Eureka> 2.2. 服务提供方 复制代码<?xml version="1.0" encoding="UTF-8"?>

Hystrix断路器配置属性解析

HystrixCommand 配置方式 我们的配置都是基于 HystrixCommand 的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置,但有的时候一个类里面会有多个 Hystrix 方法,每个方法都是类似配置的话会冗余很多代码,这时候我们可以在类上使用 @DefaultProperties 注解来给整个类的 Hystrix 方法设置一个默认值. 配置项 下面是 HystrixCommand 支持的参数,除了 commandKey/observableE

Hystrix断路器

分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 上图图中的请求需要调用A,P, H,I四个服务,如果一切顺利则没有什么问题,关键是如果I服务超时或者无响应会出现什么情况呢? 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”.如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩