Spring Cloud Netflix 熔断组件 — Hystrix入门案例

Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方,防止级联失败,从而提高系统的可用性和容错性。Hystrix主要通过一下几点实现延迟或者容错:

包裹请求:使用HystrixCommon的或者HystrixObservableCommond包裹对依赖的调用逻辑,每个命令在独立线程执行,即设计模式中的命令模式。

跳闸机制:当某服务错误率超过一定阀值,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。

资源隔离:Hystrix为每个依赖都维护了一个小型线程池,如果该线程池已满,发往该依赖的请求就立即被拒绝,而不是排队等候,从而加速失败判定。

回退机制:当请求失败,超时、被拒绝或断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。

监控:Hystrix可以近乎实时的监控运行指标和配置的变化,例如成功、失败、超时以及被拒绝的请求。

自我修复:断路器打开一段时间后,会自动进入"半开"状态。

看着上面的官方描述可能会比较模糊,还是不清楚到底做的是什么事,其实简单的来讲,就是调用服务提供方时,调用失败后,客户端的处理方式。下面我们以一个简单的例子介绍Hystrix的使用。

要在项目中引用Hystrix,请使用group ID为org.springframework.cloud和artifact ID为spring-cloud-starter-netflix -hystrix的starter。

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

该项目同样需要注册服务,服务提供者 服务消费方,以及负载均衡策略,模块如下:eureka-server、hystrix-provider、hystrix-consume三个模块,eureka-server模块代码这里不再展示,hystrix-provider模块代码与ribbon-provider代码一样,创建一个restful接口返回hello+name。这里主要介绍coneume模块代码,也就是hystrix-consume调用hystrix-provider失败时要做的处理,因此我们需要在hystrix-consume模块引入hystrix的starter包。

同样我们也需要在服务调用方即hystrix-consume编写一个restful接口,与ribbon不同的是,我们创建一个Service接口,在Service接口中调用服务提供方,restful接口中调用该Service实例,Service代码如下所示:

@Service
public class HelloServiceImpl implements HelloService {
    @Autowired
    private RestTemplate restTemplate;

    @Override
    @HystrixCommand(fallbackMethod = "backMethod")
    public String sayHello(String name) {
        return restTemplate.getForObject("http://hystrix-provider//hello/"+name, String.class);
    }

    private String backMethod() {
        return "hello world";
    }
}

如上代码所示,在方法上添加@HystrixCommand注解,即可在调用服务失败时做出其他的处理方式,上面的方法中在调用服务方失败时调用本地的backMethod方法,并且返回hello world 字符串。至于@HystrixCommand的使用以及原理,我们会在下一篇博客中讲解。在讲解之前我们先了解一下HystrixCommand源代码如下:

public @interface HystrixCommand {
    //定义分组
    String groupKey() default "";
    //命名名称
    String commandKey() default "";
    //线程池划分
    String threadPoolKey() default "";
    //请求失败的回调方法名称
    String fallbackMethod() default "";
    //HystrixCommand注解使用到的一些自定义属性
    HystrixProperty[] commandProperties() default {};
    //HystrixCommand 线程池使用到的一些自定义属性
    HystrixProperty[] threadPoolProperties() default {};
    //忽略指定异常
    Class<? extends Throwable>[] ignoreExceptions() default {};
    // @HystrixCommand注解实现响应式命令时,可以通过 observableExecutionMode参数来控制是使用             
    //observe()还是toObservable()的执行方式。
    ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
    HystrixException[] raiseHystrixExceptions() default {};
    //请求失败默认回调方法名称
    String defaultFallback() default "";
}

fallBackMethod与defaultFallMethod配置的为调用服务端错误时要调用的方法名称,其中,defaultFallMethod为全局配置,fallBackMethod为单个实例。

ignoreExceptions配置被忽略的异常,配置异常之后,当该抛出该异常时不会触发配置fallBackMethod的方法的调用。

commandKey、 groupKey 以及 threadPoolKey 它们分别表示了命令名称、 分组以及线程池划分。

observableExecutionMode 参数用来控制是使用 observe ()还是toObservable()的执行方式。ObservableExecutionMode. EAGER表示使用 observe ()执行方式;ObservableExecutionMode.LAZY表示使用 toObservable()执行方式。

raiseHystrixExceptions用于配置将哪些运行时异常封装为HystrixRuntimeException

commandProperties和threadPoolProperties分别用于指定Command属性和线程池属性,属性的具体内容我们下一篇讲解。

本篇只是简单讲解一下Hystrix的使用,了解Hystrix的核心为@HystrixCommand注解,至于@HystrixCommand注解的详细介绍会在下一篇详细介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值