0、前提
你要会使用服务调用组件、服务注册组件,因为hystrix是在对他们出现问题的一个解决实现。
1、简介
这是我们的服务的调用流程,我们首先是接口化的请求调用,使用的是Feign,然后我们hystrix处理熔断,然后就是ribbon去找到合适的服务提供端,然后再去有底层的okhttp或httpclient来实际完成请求的流程。
那我们可能会有一个问题,就是服务端集群的环境如何处理,如何达到负载均衡,那这些都是由Ribbon来完成,我们的Feign只是提供一个接口化的调用方式,方便操作。
还有一个问题,我们如果服务都挂了,那这个调用的流程怎么办?用户请求的线程会不会直接卡在这里?长时间未完成调用过程的话,用户体验如何处理?
使用Hystrix就可以处理这些情况,服务挂掉则会执行我们指定的回调,请求的线程会直接停止,这样尽量减少浪费性能,提供调用超时机制,超过指定时间则代表此服务挂了及时止损。
现在我们再来看其Hystrix的概念:
Hystrix 是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,
从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败
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中的内容。