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的更多相关文章

  1. SpringCloud(6)---熔断降级理解、Hystrix实战

    SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...

  2. SpringCloud Netflix (五) : Hystrix 服务熔断和服务降级

    什么是Hystrix 在分布式环境中,许多服务依赖项中的一些服务依赖不可避免地会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助您控制这些分布式服务之间的交互.Hystrix通过隔离服务 ...

  3. 学习一下 SpringCloud (四)-- 服务降级、熔断 Hystrix、Sentinel

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  4. SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

    FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...

  5. SpringCloud学习之Hystrix

    一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...

  6. SpringCloud之熔断器Hystrix及服务监控Dashboard

    目的:     服务雪崩效应 服务熔断服务降级 Hystrix默认超时时间设置 Hystrix服务监控Dashboard 服务雪崩效应 雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文 ...

  7. SpringCloud学习之Hystrix请求熔断与服务降级(六)

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  8. 【springcloud】服务熔断与降级(Hystrix)

    转自:https://blog.csdn.net/pengjunlee/article/details/86688858 服务熔断 服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的 ...

  9. springcloud组件之hystrix服务熔断,降级,限流

    hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...

随机推荐

  1. Linux服务器相关性能的命令

    Linux服务器相关性能的命令 一.查看服务器性能信息的相关命令 1.cpu信息查看 cpu分为物理cpu和逻辑cpu 物理cpu:实际物理服务器插槽上cpu的个数,可以通过physical id不重 ...

  2. 构建高效Presubmit卡点,落地测试左移最佳实践

    樊登有一节课讲的挺有意思,说中国有个组织叫绩效改进协会,专门研究用技控代替人控的事情.其用麦当劳来举例子,他说麦当劳其实招人标准很低,高中文凭就可以,但是培养出来的人,三五年之后,每一个都是大家争抢的 ...

  3. jvm源码解读--07 创建 fixup_mirrors

    通过前面的分析,创建的insttanceKlass 都没放入了java_lang_Class::fixup_mirror_list()这里类的数组里面了,所有的instance列举如下 ------- ...

  4. 右键发送 (sendto),创建快捷方式到自定义的位置,不仅仅是复制,就像 发送到 桌面快捷方式 一样

    TL;DR 在 SendTo 文件夹里加上一文件夹的快捷方式后,在右键发送到这个文件夹的是这些文件的一个副本,实际上是一个复制的过程,有时候我们只希望是快捷方式,那就得另想办法了. 方案如下: 创建一 ...

  5. springboot整合ehcache缓存失效

    最近做了个微信公众号后台,因为只是单应用就选用了ehcache来做本地缓存,主要是用于缓存微信的accece_token和jsapi_ticket.在使用ehcache的时候遇到了@Cacheable ...

  6. let 及const

    ES5中的块级作用域 ES5中只有全局作用域和函数作用域,这样带来了很多的不便利,会出现内层变量被外层变量覆盖,循环体中的变量会暴露在全局,很多情况下需要自执行函数来私有化变量. ES6块级的作用域 ...

  7. OpenStack镜像制作笔记 --以windows8.1-amd64为例

    by hyc 目录 1.下载win8_64位的iso文件 2.下载对应电脑的vnc 3.下载Xshell软件 4.连接成功后,在Xshell下安装软件包 5.下载FileZilla Client软件 ...

  8. 线程创建的三种方法:继承Thread类,实现Runnable接口,实现Callable接口

    线程创建 三种创建方式 1. 继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 线程不一定执行,CPU按排调度 pa ...

  9. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  10. 值得收藏 | 深度剖析 TensorCore 卷积算子实现原理

    作者:章晓 | 旷视 MegEngine 架构师 一.前言 2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere).其中和深度学习关系最密切的莫过于性能强劲的第三代的 T ...