Hystrix

1,分布式面临的问题
复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候有可能会失败。
2,服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的扇出。
如果扇出的链路上某个微服务调用向阳的时间过长或不可用,对微服务Ade调用就会占用越来越多的资源,从而引起系统崩溃,这就是雪崩效应。
通常当你发现一个模块下的某个实例失败之后,这个时候这个模块还会接受流量,然后这个有问题的模块还调用其他模块,这样就发生级联故障,或者叫雪崩
3,Hystrix是什么?
Hystrix是一个用于处理分布式系统的延迟或容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
断路器本身是开关设置,当某一个服务单元发生故障之后,通过断路器的故障监控类似熔断保险丝,想调用方返回一个复合预期,可处理备选响应,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证服务调用方的线程不会被长时间,不必要的占用,从而避免故障在分布式系统中蔓延,甚至雪崩
4,Hystrix能干嘛?
服务降级
服务熔断
可接近实时的监控
5,Hystrix的重要概念
1),服务降级 fallback:向调用方返回一个FallBack,比如服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示。
哪些情况会服务降级:程序运行异常,超时,服务熔断触发服务降级,线程池及信号量打满也会导致服务降级。
2),服务熔断 break:类似保险丝达到最大访问,直接拒绝访问,拉闸限电,然后调用服务降级方法并返回友好提示。
3),服务限流 flowLimit:秒杀,高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序运行。
6,使用服务降级,
主启动类激活

@EnableCircuitBreaker

服务提供方可能出现问题的某个方法

 
    @HystrixCommand(fallbackMethod = "paymentInfo_TimenHandler",commandKey="paymentInfo_timeout",groupKey="PGroup",
            threadPoolKey="paymentInfo_timeoutThread",commandProperties = {
            @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440"),

    })
    public String paymentInfo_timeout(Integer id) {
        int timeNumber = 5;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (Exception e) {

        }
       // int  age=10/0;
        return "线程池" + Thread.currentThread().getName() + "paymentInfo_error,id" + id + "\t" + "o(╥﹏╥)o哼哼" + "h耗时:"+timeNumber ;
    }
    public String paymentInfo_TimenHandler(Integer id) {

        //温馨友好提示
        return "线程池" + Thread.currentThread().getName() + "paymentInfo_TimenHandler,id" + id + "\t" + "服务器在忙,请稍后尝试";
    }

客户端也可以进行类似保护
问题:每个方法都有一个兜底方法进行服务降级,会导致代码膨胀,统一和自定义的分开,和业务逻辑在一起比较混乱
7,对6步骤进行优化
//global fallback
使用@DefaultProperties(defaultFallback="")
创建一个类实现调用服务的接口

@Component
public class PaymentFallback implements PaymentHystriService{
    @Override
    public String paymentInfo_ok(Integer id) {
        return "ok  fasdkfjasd";
    }

    @Override
    public String paymentInfo_timetout(Integer id) {
        return "timeout fadsfdsa";
    }
}

在调用服务的接口加上
@FeignClient(value = "cloud-provider-hystrix-service",fallback = PaymentFallback.class)

8,服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制,当链路的某个微服务不可用的时候,会出现服务降级,进而熔断该节点的微服务调用,快速返回错误的响应信息
在spring cloud框架中,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用状况,当失败的调用到一定阈值,缺省是5秒20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {

    /**
     * The command group key is used for grouping together commands such as for reporting,
     * alerting, dashboards or team/library ownership.
     * <p/>
     * default => the runtime class name of annotated method
     *
     * @return group key
     */
    String groupKey() default "";

    /**
     * Hystrix command key.
     * <p/>
     * default => the name of annotated method. for example:
     * <code>
     *     ...
     *     @HystrixCommand
     *     public User getUserById(...)
     *     ...
     *     the command name will be: 'getUserById'
     * </code>
     *
     * @return command key
     */
    String commandKey() default "";

    /**
     * The thread-pool key is used to represent a
     * HystrixThreadPool for monitoring, metrics publishing, caching and other such uses.
     *
     * @return thread pool key
     */
    String threadPoolKey() default "";

    /**
     * Specifies a method to process fallback logic.
     * A fallback method should be defined in the same class where is HystrixCommand.
     * Also a fallback method should have same signature to a method which was invoked as hystrix command.
     * for example:
     * <code>
     *      @HystrixCommand(fallbackMethod = "getByIdFallback")
     *      public String getById(String id) {...}
     *
     *      private String getByIdFallback(String id) {...}
     * </code>
     * Also a fallback method can be annotated with {@link HystrixCommand}
     * <p/>
     * default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}
     *
     * @return method name
     */
    String fallbackMethod() default "";

    /**
     * Specifies command properties.
     *
     * @return command properties
     */
    HystrixProperty[] commandProperties() default {};

    /**
     * Specifies thread pool properties.
     *
     * @return thread pool properties
     */
    HystrixProperty[] threadPoolProperties() default {};

    /**
     * Defines exceptions which should be ignored.
     * Optionally these can be wrapped in HystrixRuntimeException if raiseHystrixExceptions contains RUNTIME_EXCEPTION.
     *
     * @return exceptions to ignore
     */
    Class<? extends Throwable>[] ignoreExceptions() default {};

    /**
     * Specifies the mode that should be used to execute hystrix observable command.
     * For more information see {@link ObservableExecutionMode}.
     *
     * @return observable execution mode
     */
    ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;

    /**
     * When includes RUNTIME_EXCEPTION, any exceptions that are not ignored are wrapped in HystrixRuntimeException.
     *
     * @return exceptions to wrap
     */
    HystrixException[] raiseHystrixExceptions() default {};

    /**
     * Specifies default fallback method for the command. If both {@link #fallbackMethod} and {@link #defaultFallback}
     * methods are specified then specific one is used.
     * note: default fallback method cannot have parameters, return type should be compatible with command return type.
     *
     * @return the name of default fallback method
     */
    String defaultFallback() default "";
}


让我们来逐个介绍下@HystrixCommand注解的各个参数:

1:commandKey:配置全局唯一标识服务的名称,比如,库存系统有一个获取库存服务,那么就可以为这个服务起一个名字来唯一识别该服务,如果不配置,则默认是@HystrixCommand注解修饰的函数的函数名。

2:groupKey:一个比较重要的注解,配置全局唯一标识服务分组的名称,比如,库存系统就是一个服务分组。通过设置分组,Hystrix会根据组来组织和统计命令的告、仪表盘等信息。Hystrix命令默认的线程划分也是根据命令组来实现。默认情况下,Hystrix会让相同组名的命令使用同一个线程池,所以我们需要在创建Hystrix命令时为其指定命令组来实现默认的线程池划分。此外,Hystrix还提供了通过设置threadPoolKey来对线程池进行设置。建议最好设置该参数,使用threadPoolKey来控制线程池组。

3:threadPoolKey:对线程池进行设定,细粒度的配置,相当于对单个服务的线程池信息进行设置,也可多个服务设置同一个threadPoolKey构成线程组。

4:fallbackMethod:@HystrixCommand注解修饰的函数的回调函数,@HystrixCommand修饰的函数必须和这个回调函数定义在同一个类中,因为定义在了同一个类中,所以fackback method可以是public/private均可。

5:commandProperties:配置该命令的一些参数,如executionIsolationStrategy配置执行隔离策略,默认是使用线程隔离,此处我们配置为THREAD,即线程池隔离。参见:com.netflix.hystrix.HystrixCommandProperties中各个参数的定义。

6:threadPoolProperties:线程池相关参数设置,具体可以设置哪些参数请见:com.netflix.hystrix.HystrixThreadPoolProperties
  7:ignoreExceptions:调用服务时,除了HystrixBadRequestException之外,其他@HystrixCommand修饰的函数抛出的异常均会被Hystrix认为命令执行失败而触发服务降级的处理逻辑(调用fallbackMethod指定的回调函数),所以当需要在命令执行中抛出不触发降级的异常时来使用它,通过这个参数指定,哪些异常抛出时不触发降级(不去调用fallbackMethod),而是将异常向上抛出。
  8:observableExecutionMode:定义hystrix observable command的模式;
9:raiseHystrixExceptions:任何不可忽略的异常都包含在HystrixRuntimeException中;
10:defaultFallback:默认的回调函数,该函数的函数体不能有入参,返回值类型与@HystrixCommand修饰的函数体的返回值一致。如果指定了fallbackMethod,则fallbackMethod优先级更高。

大神解释

9,熔断打开:请求不在进行调用,内部设置时钟一般为MTTR(平均故障时间),当打开的时长长达到所设时钟则进入半熔断的状态
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则可以调用服务,
在这里插入图片描述
10,断路器关闭的条件:
在这里插入图片描述11,原来的主逻辑恢复
当断路器打卡,对主逻辑进行熔断之后,hystrix回启动一个休眠时间窗,在这个时间窗,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这个请求依然有问题,断路器继续进入打开状态,休眠时间重新计时

12,HystrixDashBoard监控
服务监控,
描述:准实时的调用监控,持续记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形展示给客户

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道至简@EveryDay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值