美文网首页
SpringCloud 之Hystrix(断路由)

SpringCloud 之Hystrix(断路由)

作者: 索性流年 | 来源:发表于2020-05-09 10:58 被阅读0次

简介

Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。。
Hystrix“豪猪”, 具有自我保护的能力。hystrix通过如下机制来解决雪崩效应问题。。
在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,

基本概念

微服务高可用技术:

大型复杂的分布式系统中,高可用相关的技术非常重要。
高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务器打造成高可用服务器,从而足以应对分布式系统环境中各种各样的问题,避免整个分布式系统被一个服务的故障拖垮。
如:服务调用超时,服务调用失败

断路器:

在分布式架构中,断路器模式的作用类似于保险丝,当某个服务单元发生故障)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

服务降级:

在高并发情况下,防止用户一直等待,使用服务降级方式,给客户端一个友好提示,调用fallback本地方法告诉客户端不会去处理请求,目的是为了用户体验。

服务熔断机制:

服务熔断目的是为了保护服务,在高并发情况下,如果流量超出阈值(请求达到了一定极限),会自己开启服务保护功能,拒绝额外服务访问,使用服务降级方式,一般服务熔断和降级一起使用

服务隔离机制:

线程池隔离:不同的服务使用不同的线程池,彼此间不受影响,达到隔离效果。线程池隔离把执行依赖代码的线程与请求线程(如tomcat线程)分离。以上文中HelloWorld为例,调用execute方法执行hystrix命令后,请求线程在此阻塞等待,然后由hystrix从线程池中取出一个线程来执行run(),直到返回结果。每个服务接口,都有独立的线程池,每个线程池互不影响,缺点,CPU占用率非常高

信号量隔离:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返回成功后计数器-1。
线程池隔离与信号量隔离的最大区别在于:线程池隔离时执行依赖代码的线程是hystrix线程池中的新线程,而信号量隔离时仍然是请求线程。

服务雪崩效应:

默认情况下Tomcat只有一个线程去处理所有客户端发送服务请求,这样的话在高并发情况下,如果客户端所有的请求堆积到同一个服务接口上,就会产生Tomcat的所有线程池去处理该服务接口,可能会导致其他服务接口无法访问。假设Tomcat最大请求数20客户端发送请求100个请求J会发生80个请求产生延迟等待。

pom 文件配置


<!--配置hystrix断路由-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
<dependency>

yml配置以


#配置会员服务端口号
server:
  port: 8000
#服务别名不区分大小写
spring:
  application:
    name: app-member

eureka:
  client:
    #注册中心地址
    service-url:
      defaultZone: http://localhost:8100/eureka
    #是否需要添加到注册中心
    register-with-eureka: true
    #是否需要检索配置中心信息
    fetch-registry: true
#开启hystrix断路器
hystrix:
  metrics:
    enabled: true

1 在启动类中添加 @EnableHystrix


@SpringBootApplication
//开启Hystrix服务保护功能
@EnableHystrix
public class EurekaProducerApplication {

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

}

2在需要服务降级的地方

@RequestMapping("/hello")
//    fallbackMethod作用服务降级执行方法
//    HystrixCommand 默认开启服务熔断,默认开启服务降级,默认开启线程池隔离方式
@HystrixCommand(fallbackMethod = "helloFallback")
public String hello() {
  return "测试服务降级 " + new Date().toString();
}

public String helloFallback() {
  return "服务降级执行";
}

相关文章

网友评论

      本文标题:SpringCloud 之Hystrix(断路由)

      本文链接:https://www.haomeiwen.com/subject/vuhdgctx.html