Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。
Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题:
资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
缓存:提供了请求缓存、请求合并实现。
Hystrix实现
一、ribbon实现
1.拷贝一份服务提供者:
2.导入依赖:
<dependencies>
<!--公共依赖-->
<dependency>
<groupId>com.zhengqing.springcloud</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--eureka客户端支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--hystrix断路器支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
3.代码方面:
4.测试: 启动 和
http://127.0.0.1:8002/provider/user/1 和 http://127.0.0.1:8002/provider/user/2
注意:
1.熔断是在服务提供方做
2.调用时不能使用feign调用(feign有自己的熔断机制),要用ribbon调用
二、Feign实现
为什么使用?
问题: 每个方法都要加回调并且耦合
解决方案: 可以使用spring面向切面编程,为feign的接口创建一个代理对象,完成对服务调用,当发现熔断后就调用同名托底方法.
feign服务消费者实现:
1.拷贝一份服务消费者:
2.导入依赖:
<dependencies>
<dependency>
<groupId>com.zhengqing.springcloud</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--
eureka客户端,服务消费者也要从注册中心获取可用服务列表
默认使用的就是ribbon,不用导入ribbon的都ok
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--feign支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
3.代码方面:
4.测试:启动 、 、
http://127.0.0.1:9003/consumer/user/1 正常访问
将服务提供者8001关闭然后刷新http://127.0.0.1:9003/consumer/user/1就可以得到测试效果 --> 异样,断点
最后小结:如果我们服务消费者实现的技术为ribbon,必须在服务提供者方通过Hystrix的断路器.
如果我们服务消费者实现的技术为feign,必须在服务消费者通过feign的断路器,feign断路器底层还是Hystrix的断路器.