Hystrix
学习笔记
作用:断路器,保护系统,控制故障范围
简介:Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点,停止级联故障,并在复杂的分布式系统中实现弹性,在这些系统中,故障是不可避免的。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求
Hystrix特性
服务熔断: 目的是为了保护服务,在高并发的情况下,如果请求达到了一定的极限(可以自己设置阈值),如果流量超过了自己设置的阈值,自动开启保护功能,使用服务降级方式返回一个友好的提示。
服务降级:Fallback相当于是降级操作。在高并发的情况下、防止用户一直等待,使用服务降级方式(调用fallBack本地方法直接返回一个友好提示给客户端,告知后面的请求服务不可用了),目的是为了更好的用户体验。
依赖隔离(采用舱壁模式,Docker就是舱壁模式的一种):在Hystrix中, 主要通过线程池来实现资源隔离。通常在使用的时候会根据调用的远程服务划分出多个线程池。
请求缓存:请求缓存是在同一请求多次访问中保证只调用一次这个服务提供者的接口,在这同一次请求第一次的结果会被缓存,把第一次请求缓存的结果返回给后面同样的请求。
请求合并:把重复的请求批量的用一个HystrixCommand命令去执行,以减少通信消耗和线程数的占用,默认合并10ms内的请求。优点:减少了通信开销。缺点:请求延迟增加。
Hystrix流程结构解析
流程说明
1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2:执行execute()/queue做同步或异步调用.
3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.
4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
5:调用HystrixCommand的run方法.运行依赖逻辑
5a:依赖逻辑调用超时,进入步骤8.
6:判断逻辑是否调用成功
6a:返回成功调用结果
6b:调用出错,进入步骤8.
7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
8:getFallback()降级逻辑.
以下四种情况将触发getFallback调用:
(1):run()方法抛出非HystrixBadRequestException异常。
(2):run()方法调用超时
(3):熔断器开启拦截调用
(4):线程池/队列/信号量是否跑满
8a:没有实现getFallback的Command将直接抛出异常
8b:fallback降级逻辑调用成功直接返回
8c:降级逻辑调用失败抛出异常
9:返回执行成功结果
如何使用
Ribbon消费者
1,引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2,打开开关(贴 @EnableHystrix 注解)
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrix public class AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); } @Bean //把RestTemplate注册到SpringBoot容器中,如果使用rest方式以别名方式进行调用,依赖ribbon负载均衡器@LoadBalanced @LoadBalanced //@LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力 RestTemplate restTemplate() { return new RestTemplate(); } }
3,添加服务器降级处理方法
@RestController public class OrderController { //RestTemplate是由SpringBoot Web组件提供,默认整合ribbon负载均衡器 //rest方式底层是采用httpclient技术 @Autowired private RestTemplate restTemplate; //订单服务调用会员服务 @RequestMapping("/getOrder") @HystrixCommand(fallbackMethod = "defaultFallback") public String getOrder() { String url = "http://app-hclz-member/getMember"; String result = restTemplate.getForObject(url, String.class); System.out.println("订单服务调用会员服务result:"+result); return result; } // 添加服务器降级处理方法 public String defaultFallback() { return "error order fallback"; } }
4,测试,将服务提供者关掉
过一会,再将服务提供者启动,可以观察到,服务消费者自动恢复。
在Feign中使用
@EnableFeignClients中已经默认打开了断路器功能,所以这里的启动类上不需要再加@EnableHystrix注解
只需要在@FeignClient中为fallback参数指定fallback方法
@FeignClient(value = "app-hclz-member",fallback = MyFallBack.class) public interface MemberFeign { @GetMapping("/getMember") public String getMember(); }
因为@FeignClient注解的是接口,所以我们必须创建一个替代的类
@Component public class MyFallBack implements MemberFeign { public String getMember() { return "feign中断路器开启 error getMember"; } }
最后一步在配置文件application.yml中开启断路器
#开启断路器 feign: hystrix: enabled: true
可以看到和Ribbon一样的效果
原文地址:https://www.cnblogs.com/tripleDemo/p/11389780.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Struts2第一天Struts2的概述,Struts2的入门,Struts2常见的配置、Struts2的Action的编写
- SQL 求平均值时去掉极值
- Go 每日一库之 jennifer
- Go 每日一库之 go-cmp
- 孤立森林(Isolation Forest)
- Go 每日一库之 buntdb
- SQL 将多列的数据转到一列
- Go 每日一库之 gjson
- Go 每日一库之 sjson
- SQL 计算累积销售额
- Go 每日一库之 jj
- Struts2第二天:Struts2的数据的封装、结果页面配置
- Go 每日一库之 govaluate
- Go 每日一库之 validator
- Go 每日一库之 gopsutil