Springcloud学习笔记-服务容错-Hystrix

Hystrix体系架构和核心功能解析

Hystrix核心功能主要为服务降级、服务熔断、线程隔离。

  • 服务降级:当Hystrix调用目标请求发生异常时,这时候hystrix会自动把这个请求转发到降级逻辑中,降级逻辑是由服务调用方来编写异常处理逻辑。
  • 服务熔断:服务熔断是建立在服务降级之上的一个异常处理措施。服务降级需要等待HTTP请求从服务节点返回异常或超时,再转发到fallback逻辑。但服务熔断引入了一个叫“断路器/熔断器”的机制,当熔断器打开时,对服务的调用将不再发送至目标服务节点,直接转向fallback逻辑。
  • 线程隔离:Hystrix的线程隔离方案可以将执行服务调用的代码和容器本身的线程池进行隔离,可以配置每个服务所需线程的最大数量,这样即使一个服务线程池被吃满也不会影响其他服务。

服务降级

服务降级常用方案

  • 静默处理:在fallback逻辑中直接返回一个null。
  • 默认值:在不确定真实结果的情况下返回一个默认值。
  • 在降级逻辑中想办法恢复服务:如缓存异常可以转而访问数据库。切换备库,重试,人工干预。
  • 多次降级:在fallback逻辑里如果又发生异常可以再次降级。

服务降级实现代码

第一种是在方法上加@HystrixCommand(fallbackMethod = “myFallback”),当服务出现异常时会执行myFallback方法中的逻辑。

@HystrixCommand(fallbackMethod = "myFallback")
public String error(){
    throw new RuntimeException("服务抛出异常!!!");
    }

第二种是在FeignClient注解中指定一个class,在这个类里可以处理Feign接口中声明的所有方法的降级需求。

@FeignClient(name = "feign-client",fallback = MyFallBack.class)
public interface MyService extends IService{
}

Request Cache减压

@CacheResult注解的意思是该方法的结果可以被Hystrix缓存起来,@CacheKey指定了根据哪个key来缓存结果。在一个Hystrix上下文中,如果使用相同参数对@CacheResult修饰的方法进行多次调用,hystrix只会首次调用的时候像服务节点发生请求,后几次都是从Hystrix的本地缓存里读取数据。

    @CacheResult
    @HystrixCommand(commandKey = "cacheKey") //方法级降级参数
    public Demo requestCache(@CacheKey String name){
        log.info("开始请求requestCache,name={}",name);
        Demo demo = new Demo();
        demo.setName(name);

        demo = service.sayHi(demo);
        log.info("结束请求requestCache,name={}",name);
        return demo;
    }

多级降级

如果在降级逻辑中出现异常可以进行再一次降级。

/**
 * @author lank
 * @since 2020/12/6 16:40
 * 降级逻辑方法
 */
@Slf4j
@Component
public class MyFallBack implements MyService {

    @HystrixCommand(fallbackMethod = "error2")
    public String error() {
        log.info("hystrix 进行降级流程!");
        //return "已经调用降级流程";
        throw new RuntimeException("第一次降级!");
    }

    @HystrixCommand(fallbackMethod = "error3")
    public String error2(){
        log.info("hystrix 进行降级流程!222");
        throw new RuntimeException("第二次降级!");
    }

    public String error3(){
        return "成功!";
    }

    public String sayHi() {
        return null;
    }

    public Demo sayHi(Demo demo) {
        return null;
    }

    public String retry(Integer timeout) {
        return "你已经超时了!!!";
    }


}

超时降级配置

  1. Hystrix默认全局超时配置
#全局超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
  1. Hystrix方法级别超时配置该配置是基于方法签名的,MyService下的参数为Integer的retry方法。可以使用Feign.configKey(MyService.class,MyService.class.getMethod(“retry”, Integer.class))获取。
hystrix.command.MyService#retry(Integer).execution.isolation.thread.timeoutInMilliseconds=3000
  1. 基于CommandKey的配置

方法级别注解

@HystrixCommand(commandKey = "cacheKey",fallbackMethod="fallback")

配置文件

hystrix.command.MyService#retry(Integer).execution.isolation.thread.timeoutInMilliseconds=5000

服务熔断

熔断器有三个状态:

  1. 熔断器open状态,该状态时服务在一定的时间内不会发起外部调用,而是直接转向fallback里。
  2. 熔断器half-open状态,会尝试发起一次真实的服务调用
  3. 熔断器closed,上一步调用成功,关闭熔断器,以后服务正常调用。

熔断器的判断阈值

  • 在一定时间内,发生异常的请求数量达到临界值。
  • 在一定时间内,发生异常的请求数量占请求总数量达到一定比例。
#==================熔断器配置
#熔断的前提条件(请求的数量),在一定的时间窗口内,请求打到5个后,才进行熔断判断
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
#超过50%的失败请求,则熔断开启
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
#当熔断开启后,经过多少秒再进入半开状态
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=15000
#配置时间窗口
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=20000

相关代码GitHub:https://github.com/lank-java/springcloud

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值