0、前提

你要会使用服务调用组件、服务注册组件,因为hystrix是在对他们出现问题的一个解决实现。

1、简介

Hystrix初识_其他

这是我们的服务的调用流程,我们首先是接口化的请求调用,使用的是Feign,然后我们hystrix处理熔断,然后就是ribbon去找到合适的服务提供端,然后再去有底层的okhttp或httpclient来实际完成请求的流程。

那我们可能会有一个问题,就是服务端集群的环境如何处理,如何达到负载均衡,那这些都是由Ribbon来完成,我们的Feign只是提供一个接口化的调用方式,方便操作。

还有一个问题,我们如果服务都挂了,那这个调用的流程怎么办?用户请求的线程会不会直接卡在这里?长时间未完成调用过程的话,用户体验如何处理?

使用Hystrix就可以处理这些情况,服务挂掉则会执行我们指定的回调,请求的线程会直接停止,这样尽量减少浪费性能,提供调用超时机制,超过指定时间则代表此服务挂了及时止损。

现在我们再来看其Hystrix的概念:

Hystrix 是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。

比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,
从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败

Hystrix初识_断路器_02

2、基本使用

1、引入依赖

<!--Spring Cloud依赖版本-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、配置文件加入配置

#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

3、启动类加入注解

@EnableCircuitBreaker

4、给我们的client接口创建实现类

创建实现类后,如果接口中方法为a的服务调用调用出现问题,那么则会去回调我们实现类中的a方法。

Client:

/**
 * @author vod服务的客户端
 */
@FeignClient(name = "service-vod",fallback = VodDegradeClient.class) /*加入fallback后当服务调用出问题时就会去调用此类中对应的实现方法*/
@Component
public interface VodClient {
    @GetMapping("/vod/say")
    R hello();
}

实现Client:

/**
 * @author
 * VodClient熔断处理
 */
@Component
public class VodDegradeClient implements VodClient {
    @Override
    public R hello() {
        return R.ERROR().message("网络超时,请稍后重试!");
    }
}

5、测试

如果service-vod服务出现问题,那么则会去调用VodDegradeClient中的内容。