博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud Hystrix 容错保护
阅读量:2422 次
发布时间:2019-05-10

本文共 2659 字,大约阅读时间需要 8 分钟。

目录

 

雪崩效应:也叫作级联故障,下游服务故障,拖跨上游服务,沿着服务调用链路逐级向上传播,造成上游服务大规模故障。

容错: 在分布式系统中,某些服务出现问题时,不会影响、拖垮其它服务(上游服务),其它服务依然可用、可对外提供服务。

 

提高系统容错的常见方法

超时机制

设置超时时间,如果在指定时间内未完成自动释放占用的资源。

 

限流

限制请求数量,当大量请求涌入时使部分请求快速失败,防止大量请求涌入冲垮服务。

可以设置不同层面的限流

  • nginx
  • 网关:常见限流框架比如guava
  • 服务消费者:限制的是对提供者发起的调用请求

可用性指的是服务能完成请求的处理,快速失败也是一种处理方式,此时也认为服务是可用的。

 

服务降级

服务调用请求快速失败之后,执行预案(回退方法)代替服务调用。

 

断路器

监控服务调用的失败率,失败率达到阈值时断路器打开、熔断链路,防止下游服务的故障影响到上游服务,后续的服务调用请求直接快速失败。

断路器打开5min后,会开启5min的窗口期,窗口期内断路器半开、放行部分服务调用请求,以检测下游服务是否已修复,如果已修复则关路器关闭、链路恢复;如果未修复则打开断路器,等下一个窗口期再进行检测,循环往复,直到链路恢复。5min是默认值,数值可调。

 

常常多种方式搭配使用。

 

hystrix简介

hystrix是一个容错框架,提供了服务限流、服务降级、断路器、服务监控等功能。

hystrix将对不同的调用请求隔离开,某个调用请求失败时也不会影响到其它的调用请求。

hystrix的隔离策略有2种

  • THREAD:线程池,默认的隔离策略。将每个服务调用请求都包装为一个线程,放到线程池中。线程池中的服务调用请求都是正在执行的,线程池满了就放到队列中排队等待,如果队列也满了就让后续的服务调用请求直接快速失败。
  • SEMAPHORE:信号量,信号量即可同时执行的调用请求个数,默认值10。发起一个调用请求时,将信号量-1;完成一个调用请求时将信号量+1;信号量为0时使后续的调用请求直接快速失败。

信号量适用于高并发的调用,因为高并发时线程池中线程数极多,资源开销大。信号量一般只用于非网络调用。

 

hystrix的2种使用方式

feign集成了hystrix,可以使用feign内置的hystrix,也可以直接使用hystrix。

 

使用feign自带的hystrix

在消费者中搭配feign使用,只能对服务调用进行容错保护。

1、yml

feign:  hystrix:    enabled: true

 

2、在feign包下编写服务调用的回退类

@Component  //放到spring容器中public class OrderServiceFeignFallback implements OrderServiceFeign {
//实现feign接口 //实现的方法就是接口中对应方法的回退方法 @Override public List
findOrdersByUserId(Integer userId) {
}}

 

3、在feign接口中指定回退类

@FeignClient(name = "order-service", fallback = OrderServiceFeignFallback.class)  //指定回退类public interface OrderServiceFeign {
@GetMapping("/api/v1/order/list/{user_id}") List
findOrdersByUserId(@PathVariable("user_id") Integer userId);}

 

直接使用hystrix

不局限于服务调用,不局限于在消费者中使用,可以作用于所有的方法调用,可以给所有方法调用指定回退方法、添加容错保护。

 

1、创建时勾选Spring Cloud Circuit Breaker -> Hystrix [Maintenance],或者手动添加依赖

org.springframework.cloud
spring-cloud-starter-netflix-hystrix

 

2、引导类上加 @EnableCircuitBreaker或@EnableHystrix
 

3、指定回退方法

@Servicepublic class UserService {
  @Autowired private OrderServiceFeign orderServiceFeign; //注入要使用的Feign接口 @HystrixCommand(fallbackMethod = "findOrdersByIdFallback") //指定回退方法 public List
findOrdersById(Integer userId){
return orderServiceFeign.findOrdersByUserId(userId); } // 回退方法。参数表、返回值类型要与原方法相同 public List
findOrdersByIdFallback(Integer userId){
} }

 

4、yml

使用feign内置的hystrix时不能在yml配置hystrix的相关参数,直接使用hystrix则可以

hystrix:  command:    default:      execution:        isolation:          strategy: THREAD  #指定隔离策略,默认线程池          thread:            timeoutInMilliseconds: 4000  #指定方法执行的超时时间,默认1000,ms,指定时间内未完成就认为失败,执行回退方法            #semaphore:              #maxConcurrentRequests: 100  #如果使用信号量,可以指定信号数

转载地址:http://ukhlb.baihongyu.com/

你可能感兴趣的文章
Java 帝国对 Python 的渗透能成功吗?
查看>>
从培训机构出来的程序员,后来都怎么样了? | 程序员有话说
查看>>
程序员写代码没激情该怎么破?
查看>>
我是如何从低端面畜到高端面霸的?
查看>>
他修过车、杀过鱼,最终进入阿里巴巴打造 9 个本地版支付宝!
查看>>
百面机器学习!算法工程师面试宝典!| 码书
查看>>
苹果无人驾驶拿 124 个工程师祭天!
查看>>
漫画 | 一个前端渣渣的成功逆袭
查看>>
与吴恩达并肩战斗,她是 AI 界的女超人!|人物志
查看>>
微信手机 WeOS 的可行性到底有多大?
查看>>
阿里面试,我挂在了第四轮……
查看>>
C++ 程序员到高级架构师,必须经历的三个阶段
查看>>
和 Java、C# 等语言对比后,Python 简直酷上天了!
查看>>
程序媛到最后,拼的到底是什么?
查看>>
笑死!996 程序员竟然做了这个梦!| 每日趣闻
查看>>
“再见,微软!”
查看>>
ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!
查看>>
技术引路:机器学习仍大有可为,但方向在哪里?
查看>>
漫画:如何给女朋友解释什么是编译与反编译
查看>>
刷屏了!这篇 Python 学习贴,90% 的程序员都用的上!
查看>>