① Hystrix是什么?
Hystrix,英文意思是豪猪,全身是刺,刺是一种保护机制。Hystrix也是Netflix公司的一款组件。
② Hystrix可以做什么?
实现服务熔断降级处理,保护微服务,防止雪崩效应发生。
③ 雪崩效应
当单个服务出现问题,调用这个服务的请求就出现线程阻塞,此时若有大量的请求涌入,容器的线程资源就会被消耗完毕导致服务瘫痪。
1.微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路。
2.如果某服务出现异常,请求阻塞,用户得不到响应,容器中线程不会释放,于是越来越多用户请求堆积,越来越多线程阻塞。
3.单服务器支持线程和并发数有限,请求如果一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用,从而形成雪崩效应;
比如下图场景:

对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成不可估量的严重后果,这就是常说的服务故障的“雪崩效应”。

如果一个应用不能对来自依赖的故障进行隔离,那该应用本身就处在被拖垮的风险中。 因此,为了构建稳定、可靠的分布式系统,我们的服务应当具有自我保护能力,当依赖服务不可用时,当前服务启动自我保护功能,从而避免发生雪崩效应。
④ 熔断器状态
(1)全开状态Open 所有请求都会被降级
(2)半开状态HalfOpen
(3)关闭状态Closed(默认熔断器关闭),所有请求正常访问
⑤ 关系转换
(1)默认情况下,服务均正常运行,熔断器处于关闭状态;
(2)当某个服务出现故障时,其它服务发请求访问当前服务(已故障)失败,Hystrix框架会对请求情况进行计数操作,在一定的时间内,失败的请求百分比达到阈值(极限值)时(默认失败比例的阈值是50%,请求次数最低不少于20次),则自动触发熔断机制,熔断器状态转为全开状态;

(3)熔断器全开5s后,会进入半开状态(熔断器判断下次请求的返回状况,若成功,熔断器切回关闭状态,若失败,熔断器切回全开状态);
2.6 Hystrix案例演示
0 局部熔断
目标:服务提供者的服务出现了故障,服务消费者快速失败给用户友好提示,体验服务降级。
① 导入坐标依赖

<!--熔断器-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

② 开启熔断注解
在服务消费者的启动类上加上开启熔断注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker   //开启熔断
//@EnableFeignClients(basePackages = {"com.swk.feign"})
public class UserConsumerSpringBootApplication {public static void main(String[] args) {    SpringApplication.run(UserConsumerSpringBootApplication.class,args);}@Bean@LoadBalanced   //开启ribbon负载均衡,默认是轮询public RestTemplate restTemplate(){return new RestTemplate();}
}

③ 服务降级处理
被调用服务中的方法发生故障时,则返回默认的数据给用户,此操作叫服务降级。其他方法可用,该方法不可用 ,只是降低权限。
在对应的服务消费者一方添加一个降级处理方法,直接让该方法处理用户的请求。

@RequestMapping("/consumer")
@RestController
public class UserController {@AutowiredRestTemplate restTemplate;@AutowiredDiscoveryClient discoveryClient;/*** 服务降级处理方法* 当某个方法发生异常或者执行超时的时候,则直接让该方法处理用户的请求* @param id* @return*/public User failBack(Integer id){User user = new User();user.setName("服务降级~~默认处理");return user;}@GetMapping(value = "/{id}")//@HystrixCommand(fallbackMethod = "failBack")    //局部服务降级public User queryById(@PathVariable("id") Integer id){/* String url = "http://localhost:8081/user/find/" + id ;return restTemplate.getForObject(url,User.class);*///基于DiscoveryClient对象来访问/*List<ServiceInstance> userProducer = discoveryClient.getInstances("user-producer");ServiceInstance serviceInstance = userProducer.get(0);String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort() + "/user/find/" + id;return restTemplate.getForObject(url,User.class);*///基于服务名称来访问String url = "http://user-producer/user/find/"+id;return restTemplate.getForObject(url,User.class);}
}

④ 指定服务降级调用
在有可能发生问题的方法上添加降级处理调用,添加@HystrixCommand注解并指定降级处理方法。

@RequestMapping("/consumer")
@RestController
public class UserController {@AutowiredRestTemplate restTemplate;@AutowiredDiscoveryClient discoveryClient;/*** 服务降级处理方法* 当某个方法发生异常或者执行超时的时候,则直接让该方法处理用户的请求* @param id* @return*/public User failBack(Integer id){User user = new User();user.setName("服务降级~~默认处理");return user;}@GetMapping(value = "/{id}")@HystrixCommand(fallbackMethod = "failBack")    //局部服务降级public User queryById(@PathVariable("id") Integer id){/* String url = "http://localhost:8081/user/find/" + id ;return restTemplate.getForObject(url,User.class);*///基于DiscoveryClient对象来访问/*List<ServiceInstance> userProducer = discoveryClient.getInstances("user-producer");ServiceInstance serviceInstance = userProducer.get(0);String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort() + "/user/find/" + id;return restTemplate.getForObject(url,User.class);*///基于服务名称来访问String url = "http://user-producer/user/find/"+id;return restTemplate.getForObject(url,User.class);}
}

⑤ 制造异常
服务提供者中被调用方法添加异常,用于演示调用服务降级方法,给出默认的返回值.

@RequestMapping("/user")
@RestController
public class UserController {@AutowiredUserService userService;@RequestMapping("/find/{id}")public User findByUserId(@PathVariable("id") Integer id){//制造异常if (id==3){throw new RuntimeException("aaa");}//演示熔断超时,服务降级/*try {System.out.println("正在睡觉");Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}*/User user = userService.findByUserId(id);user.setName(user.getUsername()+"user_producer");return user;}
}

⑥ 测试
启动EurekaServer注册中心、服务提供者,服务消费者,请求http://localhost:18082/consumer/3,查看效果

⑦ 其它熔断策略配置解析

# 配置熔断策略:
hystrix:command:default:circuitBreaker:# 强制打开熔断器 默认false关闭的。测试配置是否生效#forceOpen: false# 触发熔断错误比例阈值,默认值50% 10个请求有5个被拒绝访问,则开启熔断#errorThresholdPercentage: 50# 熔断后休眠时长,默认值5秒 熔断器开启5s后,在关闭#sleepWindowInMilliseconds: 10000# 熔断触发最小请求次数,默认值是20 累计请求20次无响应,开启熔断#requestVolumeThreshold: 10execution:isolation:thread:# 熔断超时设置,默认为1秒 过了超时时间后,做服务降级,给用户的请求返回设置的默认值timeoutInMilliseconds: 2000

⑧ 超时时间设置
设置超时时间之后,在该时间段内,调用服务提供者的问题方法,不会触发熔断,过了这个时间(比如5s后),则开启熔断。
(1)修改服务提供者方法,休眠3秒钟

@RequestMapping("/user")
@RestController
public class UserController {@AutowiredUserService userService;@RequestMapping("/find/{id}")public User findByUserId(@PathVariable("id") Integer id){if (id==3){throw new RuntimeException("aaa");}//演示熔断超时,服务降级try {System.out.println("正在睡觉");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}User user = userService.findByUserId(id);user.setName(user.getUsername()+"user_producer");return user;}
}

(2)修改服务消费者的application.yml文件,设置超时时间为5s,不会熔断

# 配置熔断策略:
hystrix:command:default:circuitBreaker:# 强制打开熔断器 默认false关闭的。测试配置是否生效#forceOpen: false# 触发熔断错误比例阈值,默认值50% 10个请求有5个被拒绝访问,则开启熔断#errorThresholdPercentage: 50# 熔断后休眠时长,默认值5秒 熔断器开启5s后,在关闭#sleepWindowInMilliseconds: 10000# 熔断触发最小请求次数,默认值是20 累计请求20次无响应,开启熔断#requestVolumeThreshold: 10execution:isolation:thread:# 熔断超时设置,默认为1秒 过了超时时间后,做服务降级,给用户的请求返回设置的默认值timeoutInMilliseconds: 5000

(3)发生请求访问

(4)修改服务提供者方法,休眠6秒钟,这时超时时间是5s,过了超时时间仍调用不到服务,此时触发熔断,服务降级

⑨ 熔断触发最小请求次数测试
设置最小请求次数为2,第一次正常发请求访问,获取不到数据,自动发送第二次请求,若仍获取不到数据,则触发熔断,服务降级。


1 全局熔断
两种编写方式:编写在类上,编写在方法上。在类的上边对类的所有方法都生效。在方法上,仅对当前方法有效。
① 方法上服务降级
@HystrixCommand(fallbackMethod=“failBack”)用来声明一个降级逻辑的fallback兜底方法
② 类上默认服务降级
(1)在服务消费者一方UserController中,添加一个全局熔断方法

/***** 全局的服务降级处理方法* @return*/
public User defaultFailBack(){User user = new User();user.setUsername("Default-服务降级,默认处理!");return  user;
}

(2)服务消费者一方,调用服务的问题方法上,去除@HystrixCommand注解,改为@HystrixCommand

@GetMapping(value = "/{id}")
//@HystrixCommand(fallbackMethod = "failBack")    //局部服务降级
@HystrixCommand                                 //全局服务降级
public User queryById(@PathVariable("id") Integer id){//基于服务名称来访问String url = "http://user-producer/user/find/"+id;return restTemplate.getForObject(url,User.class);
}

(3)在服务消费方的UserController类上添加
@DefaultProperties(defaultFallback = “defaultFailBack”),然后启动访问

2 要知
① 什么是线程隔离?
是指Hystrix为每个依赖服务调用一个小的线程池,如果线程池用尽,调用立即被拒绝,默认不采用排队。
② 什么是服务降级?
(兜底方法)优先保证核心服务,而非核心服务不可用或弱可用。触发Hystrix服务降级的情况:线程池已满、请求超时。

springcloud五大神兽之Hystrix介绍相关推荐

  1. springcloud五大神兽之Eureka介绍

    一.springcloud简介 1.0 什么是微服务? ① 业务角度 从业务角度分析,就是将整体项目(传统的一站式应用)按照业务拆分,将每个业务拆分为一个个独立的服务,彻底解除业务模块之间的耦合,每个 ...

  2. SpringCloud五大神兽快速入门

    Spring Cloud 单一应用架构 :主要解决ORM 数据库访问层. 垂直应用架构 : 解决分层问题,实现应用的分层开发,提升开发效率. 分布式应用架构:解决系统间调用问题,引发了SOA(面向服务 ...

  3. springCloud五大神兽(思维导图)

    SpringCloud的五大件 思维导图 服务发现--Netflix Eureka 客服端负载均衡--Netflix Ribbon 断路器--Netflix Hystrix 服务网关--Netflix ...

  4. SpringCloud五大神兽03-Hystrix断路器(豪猪)

    1.简介 雪崩:在微服务架构中,假如某个微服务无法正常运行就会形成阻塞,导致调用这个微服务的其他所有微服务都会阻塞.到达某个时间节点,服务器的并发量会达到峰值,这样的话,后续其他请求即使访问的不是当前 ...

  5. SpringCloud五大神兽之Eureka服务注册(三)——Eureka的自我保护

    一.ACID与CAP 传统ACID: A:atomicity   原子性 C:consistency    一致性 I:isolation    独立性 D:durability    持久性 目前流 ...

  6. springcloud五大神兽及其原理

    一.使用eureka做注册中心 个人版本的初级springcloud总体结构 一.使用eureka做注册中心 总体说明: 会员和订单都以服务的形式存在(即只有接口,没有页面的那种工程),springc ...

  7. springcloud五大神兽之Gateway

    ① 什么是网关? API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层. 网关的出现原因是伴随微服务架构的出现而出现,因为不同的微服务一般有不同的网络地址(ip ...

  8. springcloud五大神兽之Feign

    ① 什么是Feign? Feign 的英文表意为"假装,伪装,变形", 是一个http请求调用的轻量级框架. ② Feign可以做什么? Feign可以把HTTP 的请求进行隐藏, ...

  9. SpringCloud五大神兽01-Eureka注册中心

    SpringCloud01-Eureka注册中心 1.简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间 ...

  10. Springcloud五大神兽流程图

    图借用这篇博客 Spring Cloud核心组件:Eureka Spring Cloud核心组件:Feign Spring Cloud核心组件:Ribbon Spring Cloud核心组件:Hyst ...

最新文章

  1. 上海找python工作-python上海招聘
  2. js考试题 html5新特性,Web前端初级面试题总结
  3. python报数组越界_python数组越界
  4. c语言选择题答案在哪查,C语言选择题及答案
  5. Hacker News 12 月招聘趋势:React 已连续霸榜 19 个月
  6. 环境在c盘_笔记本电脑常见故障--清理C盘空间
  7. cocos2d-x 学习笔记——瓦片地图TiledMap
  8. 板绘新手sai入门基础教程,非常详细全面!
  9. 山特服务器硬盘480g,【02311VHS N480SSDW2SPA 480GB SATA SSD 华为服务器固态硬盘】价格_厂家 - 中国供应商...
  10. ACM一年总结(写于2011年11月18日)
  11. P1084 [NOIP2012 提高组] 疫情控制
  12. html5图片格式有什么,jpeg是什么?
  13. 数据点太多matlab曲线较粗,matlab数据太多怎么拟合曲线
  14. ReactNative系列之十二图标组件react-native-vector-icons的使用
  15. Unity【话大】设计模式之模板方法模式
  16. dota修改服务器,forOMG非英雄篇 如何修改数据以便于测试
  17. 计算机二级c语言停考,计算机等级考试调整Fortran等语言停考
  18. Windows套接字I/O模型(4) -- WSAEventSelect模型
  19. React Native v0.55 学习笔记1
  20. 售饭机系统无法连接服务器,广东食堂售饭机方案

热门文章

  1. 2021年美容师(初级)考试题库及美容师(初级)试题及答案
  2. springboot websocket 实现用户在线聊天 及部分初始化接口
  3. Redis03【案例】存储学生信息
  4. Elasticsearch:数据摄取中的使用指南
  5. Hadoop2.7.3单机伪分布式环境搭建
  6. 豆瓣9.5,这可能是最通俗讲解病毒知识的英文科普书
  7. 微信小程序入门教程(附源码)
  8. 2015年4月自考计算机应用,2015年4月自考《计算机应用基础》真题回顾及参考答案...
  9. 持续「性价比」攻势,小米生态链企业发布新「扫拖一体」机器人
  10. java上传视频并播放_java实现视频网站的视频上传及视频播放功能.docx