SpringCloud 进阶之Hystrix(断路器)

Easter79
• 阅读 420

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

SpringCloud 进阶之Hystrix(断路器)

1.2 服务降级

  • 服务降级:整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来;

  • 服务降级处理是在客户端实现完成的,与服务端没有关系;

  • 当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值;

    // 修改microservicecloud-api工程 // 根据已有的DeptClientService接口,新建一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory @Component // 不要忘记添加 public class DeptClientServiceFallbackFactory implements FallbackFactory {

    @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

SpringCloud 进阶之Hystrix(断路器)

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

SpringCloud 进阶之Hystrix(断路器)

参考资料:

点赞
收藏
评论区
推荐文章
Stella981 Stella981
2年前
Hystrix的介绍和简单使用
这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下。一、什么是Hystrix  Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?其次,我们如何管理对远程微服务的调用性能,以保证每个微服务以最小延迟最快性能
Stella981 Stella981
2年前
Hystrix——让你的服务更稳一点
摘要:1、为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行...
Easter79 Easter79
2年前
SpringCloud之Hystrix服务降级(七)
Hystrix设计原则1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败。通过第三方客户端访问(通常是通过网络)依赖服务出现失败、拒绝、超时或短路时执行回退逻辑2.用快速失败代替排队(每个依赖服务维护一个小的线程池或信号量,当线程池满或信号量满,会立即拒绝服务而不会排队等待)和优雅的服
Stella981 Stella981
2年前
Hystrix详述(一)
Hystrix详述(一)博客分类:架构 一、hystrix的作用控制被依赖服务的延时和失败防止在复杂系统中的级联失败可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的线程,相对于整个Tomcat容器的线程池被占满需要耗费更长时间以
Easter79 Easter79
2年前
SpringCloud系列十五:使用Hystrix实现容错
1\.回顾上文讲解了容错的重要性,以及容错需要实现的功能。本文来讲解使用Hystrix实现容错。2\.Hystrix简介Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提高系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错:
Easter79 Easter79
2年前
SpringCloud笔记六:Hystrix
\TOC\Hystrix是什么?Hystrix是一个断路器,主要作用是服务熔断。我举个例子,比如我想访问服务A,但是服务A依赖服务B,服务B依赖服务C...这种多个服务之间依赖调用称为扇出(就像一把折扇缓缓打开一样)倘若某个服务反应的时间很长,或者服务不可用了,那么对服务A的调用会占用系统越来越多的资源,直至系统崩
Stella981 Stella981
2年前
Hystrix异常处理及线程池划分
异常处理异常传播在HystrixCommand实现的run()方法中抛出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并触发服务降级的处理逻辑,所以当需要在命令执行中抛出不触发服务降级的异常时来选择它。在使用注解配置实现Hystrix命令时,可以忽略指定的异常
Easter79 Easter79
2年前
SpringCloud课程:15.Hystrix断路器简介 与 服务降级
Hystrix断路器一、概述分布式系统面临的问题复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候不可避免地失败。服务雪崩多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出效应” 如果扇出的链路上某个微服务的调用响应
Easter79 Easter79
2年前
SpringCloud介绍
自己通俗的理解只能是Http协议调用,Dubbo可以支持多种协议就是RPC远程调用就是提供服务注册,服务发现,断路器,网关系统和自动配置的工具,底层采用http协议实现采用Eureka注册中Ribbon实现负载均衡Feignhttp协议调用工具Hystrix断路器Zuul网关系统就是把API服务通过注册中心
京东云开发者 京东云开发者
9个月前
SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队
在生活中,如果电路的负载过高,保险箱会自动跳闸,以保护家里的各种电器,这就是熔断器的一个活生生例子。在Hystrix中也存在这样一个熔断器,当所依赖的服务不稳定时,能够自动熔断,并提供有损服务,保护服务的稳定性。在运行过程中,Hystrix会根据接口的执行状态(成功、失败、超时和拒绝),收集并统计这些数据,根据这些信息来实时决策是否进行熔断。
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k