美文网首页
2020-09-12Hystrix

2020-09-12Hystrix

作者: 喵喵不吃鱼哦 | 来源:发表于2020-09-14 21:42 被阅读0次

什么是Hystrix:

在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix 是一个库,它通过添加延迟容差和容错逻辑,帮助您控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止服务之间的级联故障以及提供回退选项来为此提供,所有这些都可提高系统的整体恢复能力。

做什么用

1.保护和控制通过第三方客户端库访问(通常通过网络)访问的依赖项的延迟和故障。
2.停止复杂分布式系统中的级联故障。
3.失败,快速恢复。
4.回退,并尽可能正常降级。
5.实现近乎实时的监控、警报和操作控制。

问题

正常情况
某个服务出现问题

Hystrix重要概念:

-服务降级
服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback
(可能出现原因:程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会导致服务降级)
-服务熔断
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
(服务的降级->进而熔断->恢复调用链路)
-服务限流
秒杀高并发等操作,严禁一窝蜂的过来拥挤,使得调用排队,一秒钟N个,有序进行

使用:

<dependencies>
        <!--新增hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
<!--添加Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
<!--web-->
        <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>

YML配置文件:

server:
  port: 8001
eureka:
  client:
    register-with-eureka: true    #表识不向注册中心注册自己
    fetch-registry: true   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      # defaultZone: http://eureka7002.com:7002/eureka/    #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,
#  server:
#    enable-self-preservation: false
spring:
  application:
    name: cloud-provider-hystrix-payment
  #    eviction-interval-timer-in-ms: 2000

服务降级:添加注解HystrixCommand
例如:业务类中

@Service
public class PaymentService {

    //成功
    public String paymentInfo_OK(Integer id){
        return "线程池:"+Thread.currentThread().getName()+"   paymentInfo_OK,id:  "+id+"\t"+"Success"  ;
    }

    //失败
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")  //3秒钟以内就是正常的业务逻辑
    })
    public String paymentInfo_TimeOut(Integer id){
       // int timeNumber = 5;
        int age = 10/0;
       // try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
        //return "线程池:"+Thread.currentThread().getName()+"   paymentInfo_TimeOut,id:  "+id+"\t"+"嘤嘤嘤"+" 耗时(秒)"+timeNumber;
        return "线程池:"+Thread.currentThread().getName()+"   paymentInfo_TimeOut,id:  "+id+"\t"+"嘤嘤嘤"+" 耗时(秒)";
    }

    //兜底方法
    public String paymentInfo_TimeOutHandler(Integer id){
        return "线程池:"+Thread.currentThread().getName()+"   系统繁忙, 请稍候再试  ,id:  "+id+"\t"+"嘤嘤哇呜";
    }

}
//当服务不可用,或者出现问题的时候,在添加了HystrixCommand注解之后,会有一个兜底方法来处理之后的问题。问题:服务超时、程序运行故障
//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法

主启动类需要添加新注解@EnableCircuitBreaker

@EnableCircuitBreaker

服务消费者若需要添加降级保护

feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。

消费者主启动添加

 @EnableHystrix

业务类:

@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")  //3秒钟以内就是正常的业务逻辑
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
    String result = paymentHystrixService.paymentInfo_TimeOut(id);
    return result;
}

//兜底方法
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
    return "我是消费者80,对付支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己";
}

这样我们需要为每一个需要的方法都添加一个HystrixCommand注解,并写上相应的兜底方法。
解决方法:在类上添加默认的处理方法

@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")  //全局的
关系

上面这样做原理上可以,但是会造成处理降级和业务逻辑等糅杂到一起,比较混乱。
对接口进行实现,将降级的处理写在接口实现类中

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}

@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
fallback=接口实现类.class,这样在出现问题时,就会自动调用实现类中的降级方法

@Component
public class PaymentFallbackService implements PaymentHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
    }

    @Override
    public String paymentInfo_TimeOut(Integer id) {
        return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
    }
}

YML开启处理自身容错:

feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。

服务熔断:

服务熔断

熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入熔断状态
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断
熔断器配置:


服务熔断 1
2
3
4

工作流程步骤说明:

流程步骤 服务监控hystrixDashboard

相关文章

  • 2020-09-12Hystrix

    什么是Hystrix: 在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix 是一个库,它通过添...

网友评论

      本文标题:2020-09-12Hystrix

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