SpringCloud降级熔断 Hystrix
1、分布式核心知识之熔断、降级讲解
简介:系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案
1、熔断:
保险丝,熔断服务,为了防止整个系统故障,包含子和下游服务
下单服务 -》商品服务
-》用户服务 (出现异常-》熔断)
2、降级:
抛弃一些非核心的接口和数据
旅行箱的例子:只带核心的物品,抛弃非核心的,等有条件的时候再去携带这些物品
3、熔断和降级互相交集
相同点:
1)从可用性和可靠性触发,为了防止系统崩溃
2)最终让用户体验到的是某些功能暂时不能用
不同点
1)服务熔断一般是下游服务故障导致的,而服务降级一般是从整体系统负荷考虑,由调用方控制
2、Netflix开源组件断路器Hystrix介绍
简介:介绍Hystrix基础知识和使用场景
文档地址:
https://github.com/Netflix/Hystrix
https://github.com/Netflix/Hystrix/wiki
1、什么是Hystrix?
1)hystrix对应的中文名字是“豪猪”
2)hystrix 英[hɪst'rɪks] 美[hɪst'rɪks]
2、为什么要用?
在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,
比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,
通过Hystrix就可以解决
http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients
3、提供了熔断、隔离、Fallback、cache、监控等功能
4、熔断后怎么处理?
出现错误之后可以 fallback 错误的处理信息
兜底数据
3、Feign结合Hystrix断路器开发实战
简介:讲解SpringCloud整合断路器的使用,用户服务异常情况
1、加入依赖
注意:网上新旧版本问题,所以要以官网为主,不然部分注解会丢失
最新版本 2.0
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- </dependency>
2、增加注解
启动类里面增加注解
@EnableCircuitBreaker
- @SpringBootApplication
- @EnableFeignClients
- @EnableCircuitBreaker
- public class OrderServiceApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderServiceApplication.class, args);
- }
- }
3、API接口编码实战
熔断-》降级
1)最外层api使用,好比异常处理(网络异常,参数或者内部调用问题)
api方法上增加 @HystrixCommand(fallbackMethod = "saveOrderFail")
编写fallback方法实现,方法签名一定要和api方法签名一致(注意点!!!)
- @RestController
- @RequestMapping("api/v1/order")
- public class OrderController {
- @Autowired
- private ProductOrderService productOrderService;
- @RequestMapping("save")
- @HystrixCommand(fallbackMethod = "saveOrderFail")
- public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId){
- Map<String, Object> data = new HashMap<>();
- data.put("code", 0);
- data.put("data", productOrderService.save(userId, productId));
- return data;
- }
- //注意,方法签名一定要要和api方法一致
- private Object saveOrderFail(int userId, int productId){
- Map<String, Object> msg = new HashMap<>();
- msg.put("code", -1);
- msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
- return msg;
- }
- }
调用失败后会调saveOrderFail方法返回结果
4、Feign结合Hystrix断路器(接口实现)
简介:讲解SpringCloud整合断路器的使用,用户服务异常情况
1、feign结合Hystrix
1)yml开启feign支持hystrix (注意,一定要开启,旧版本默认支持,新版本默认关闭)
feign:
hystrix:
enabled: true
2)FeignClient(name="xxx", fallback=xxx.class ), class需要继承当前FeignClient的类
- /**
- * 商品服务客户端
- */
- @FeignClient(name = "product-service", fallback = ProductClientFallback.class)
- public interface ProductClient {
- @GetMapping("/api/v1/product/find")
- String findById(@RequestParam(value = "id") int id);
- }
- /**
- * 针对商品服务,错降级处理
- */
- @Component
- public class ProductClientFallback implements ProductClient {
- @Override
- public String findById(int id) {
- System.out.println("feign 调用product-service findbyid 异常");
- return null;
- }
- }
调用接口出错后会执行ProductClientFallback .findById, API 返回OrderController. saveOrderFail
5、熔断降级服务异常报警通知实战(发短信通知)
简介:完善服务熔断处理,报警机制完善
1、加入redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置redis链接信息
redis:
database: 0
host: 127.0.0.1
port: 6379
timeout: 2000
3、使用
- @RestController
- @RequestMapping("api/v1/order")
- public class OrderController {
- @Autowired
- private ProductOrderService productOrderService;
- @Autowired
- private StringRedisTemplate redisTemplate;
- @RequestMapping("save")
- @HystrixCommand(fallbackMethod = "saveOrderFail")
- public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId, HttpServletRequest request){
- Map<String, Object> data = new HashMap<>();
- data.put("code", 0);
- data.put("data", productOrderService.save(userId, productId));
- return data;
- }
- //注意,方法签名一定要要和api方法一致
- private Object saveOrderFail(int userId, int productId, HttpServletRequest request){
- //监控报警
- String saveOrderKye = "save-order";
- String sendValue = redisTemplate.opsForValue().get(saveOrderKye);
- final String ip = request.getRemoteAddr();
- new Thread( ()->{
- if (StringUtils.isBlank(sendValue)) {
- System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址是="+ip);
- //发送一个http请求,调用短信服务 TODO
- redisTemplate.opsForValue().set(saveOrderKye, "save-order-fail", 20, TimeUnit.SECONDS);
- }else{
- System.out.println("已经发送过短信,20秒内不重复发送");
- }
- }).start();
- Map<String, Object> msg = new HashMap<>();
- msg.put("code", -1);
- msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
- return msg;
- }
- }
6、源码剖析Hystrix降级策略和调整(Hystrix 默认超时1000ms, 所以即使feign(配置为4000ms) 接口未超时, 但超时1s,也会降级)
1、查看默认讲解策略 HystrixCommandProperties
1)execution.isolation.strategy 隔离策略
THREAD 线程池隔离 (默认)
SEMAPHORE 信号量
信号量适用于接口并发量高的情况,如每秒数千次调用的情况,导致的线程开销过高,通常只适用于非网络调用,执行速度快
2)execution.isolation.thread.timeoutInMilliseconds 超时时间
默认 1000毫秒
3)execution.timeout.enabled 是否开启超时限制 (一定不要禁用)
4)execution.isolation.semaphore.maxConcurrentRequests 隔离策略为 信号量的时候,如果达到最大并发数时,后续请求会被拒绝,默认是10
官方文档:
https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
2、调整策略
超时时间调整
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000
SpringCloud降级熔断 Hystrix的更多相关文章
- SpringCloud(6)---熔断降级理解、Hystrix实战
SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...
- SpringCloud Netflix (五) : Hystrix 服务熔断和服务降级
什么是Hystrix 在分布式环境中,许多服务依赖项中的一些服务依赖不可避免地会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助您控制这些分布式服务之间的交互.Hystrix通过隔离服务 ...
- 学习一下 SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)
FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...
- SpringCloud学习之Hystrix
一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...
- SpringCloud之熔断器Hystrix及服务监控Dashboard
目的: 服务雪崩效应 服务熔断服务降级 Hystrix默认超时时间设置 Hystrix服务监控Dashboard 服务雪崩效应 雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文 ...
- SpringCloud学习之Hystrix请求熔断与服务降级(六)
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 【springcloud】服务熔断与降级(Hystrix)
转自:https://blog.csdn.net/pengjunlee/article/details/86688858 服务熔断 服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的 ...
- springcloud组件之hystrix服务熔断,降级,限流
hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...
随机推荐
- UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2
UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2 1. 起因 最近因为不同软件的数据问题本来只是一些小事弄着弄着就越弄越麻烦了,期间有这么个需求,没看到有中 ...
- Leetcode:637. 二叉树的层平均值
Leetcode:637. 二叉树的层平均值 Leetcode:637. 二叉树的层平均值 Talk is cheap . Show me the code . /** * Definition fo ...
- 动态 DP
一道入门 DP + 修改 = 动态 DP. 以模板题为例,多次询问树的最大独立集,带修改. 先有 naive 的 DP,记 \(f_{u,0/1}\) 表示 \(u\) 点不选/选时以 \(u\) 为 ...
- SLF4J日志桥接的应用
最近在给公司的测试部门开发一套自动化测试框架,为了是框架产生的测试报告更易于分析,我考虑将每一个用例与运行过程中产生的日志相关联,为了实现这样的效果,首先就需要统一项目的日志输出,那么具体怎么做呢? ...
- 记录一次HSDB的使用遇到的问题 No such type.
univese Unrecognized command. Try help... hsdb> universe Heap Parameters: Gen 0: eden [0x00000000 ...
- AWS 安全信息泄露-----21天烧了27万
安全问题一直都是个老生常谈的话题,对于我们做IT的来说,是更为重视的.从使用开发工具的是否授权合规,到从事的工作内容是否合法.我们都应该认真的思考一下这些问题,毕竟我们要靠IT这门手艺吃饭. 2021 ...
- Mybatis学习笔记-第一个Mybatis程序
思路 搭建环境 搭建数据库(略) CREATE DDATABASE CREATE TABLE INSERT VALUES 新建项目 普通Maven项目 删除src文件夹 --> 建立父工程 导入 ...
- 一口气说出 Redis 16 个常见使用场景!
1.缓存 String类型 例如:热点数据缓存(例如报表.明星出轨),对象缓存.全页缓存.可以提升热点数据的访问数据. 文章首发于:http://ht5n8.cn/LEc6v 2.数据共享分布式 St ...
- synchronized优化手段:锁膨胀、锁消除、锁粗化和自适应自旋锁...
synchronized 在 JDK 1.5 时性能是比较低的,然而在后续的版本中经过各种优化迭代,它的性能也得到了前所未有的提升,上一篇中我们谈到了锁膨胀对 synchronized 性能的提升,然 ...
- 一、Ocelot简单概述
以下只是本人学习过程的整理 Ocelot官网:http://threemammals.com/ocelot 说明文档:https://ocelot.readthedocs.io/en/latest/ ...