雪崩效应
在微服务架构中,一个请求需要调用多个服务是非常常见的。如客户端访问A服务,而A服务需要调用B
服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服
务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的线程资源会被消耗完毕,
导致服务瘫痪。服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难
性的严重后果,这就是服务故障的“雪崩”效应。

雪崩是系统中的蝴蝶效应导致其发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方
法响应变慢,亦或是某台机器的资源耗尽。从源头上我们无法完全杜绝雪崩源头的发生,但是雪崩的根
本原因来源于服务之间的强依赖,所以我们可以提前评估,做好熔断,隔离,限流。

服务隔离
顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。
当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体
的系统服务。

熔断降级
熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压
力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这
种牺牲局部,保全整体的措施就叫做熔断。

所谓降级,就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的
fallback回调,返回一个缺省值。 也可以理解为兜底

 服务限流

限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说
系统的吞吐量是可以被测算的,为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流
量并采取少量措施以完成限制流量的目的。比方:推迟解决,拒绝解决,或者者部分拒绝解决等等。

Hystrix介绍

Hystrix 是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失
败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。
包裹请求:使用 HystrixCommand包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用
了设计模式中的“命令模式”。
跳闸机制:当某服务的错误率超过一定的阈值时, Hystrix可以自动或手动跳闸,停止请求该服务一段时间。
资源隔离: Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,
发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。
监控: Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员
自行提供,例如返回一个缺省值。
自我修复:断路器打开一段时间后,会自动进入 “半开”状态。

整合Hystrix

  • order-service

    • pom.xml

    •       <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      </dependency>
    • web层

       @RestController
      @RequestMapping("/api/v1/order")
      public class OrderController {


      @Autowired(required = false)
      private ProductOrderServiceImpl 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方法一致
      public Object saveOrderFail(int userId,int productId){

      Map<String, Object> msg = new HashMap<>();
      msg.put("code", -1);
      msg.put("msg", "抢购人数太多,您被挤出来了,稍等重试");
      return msg;
      }


      }
    • application.yml

       server:
      port: 8781


      #指定注册中心地址
      eureka:
      client:
      serviceUrl:
      defaultZone: http://localhost:8761/eureka/

      #服务的名称
      spring:
      application:
      name: order-service

      ###配置请求超时时间
      hystrix:
      command:
      default:
      execution:
      isolation:
      thread:
      timeoutInMilliseconds: 7000
      ribbon:
      ##指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
      ReadTimeout: 3000
      ##指的是建立连接后从服务器读取到可用资源所用的时间。
      ConnectTimeout: 3000

      #自定义负载均衡策略
      #product-service:
      # ribbon:
      # NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • product-service

    • service层

       package com.topcheer.producerservice.controller;

      import com.topcheer.producerservice.domain.Product;
      import com.topcheer.producerservice.service.ProductService;
      import org.springframework.beans.BeanUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.web.bind.annotation.*;

      import java.util.concurrent.TimeUnit;

      @RestController
      @RequestMapping("/api/v1/product")
      public class ProductController {



      @Value("${server.port}")
      private String port;

      @Autowired
      private ProductService productService;

      /**
      * 获取所有商品列表
      * @return
      */
      @RequestMapping("list")
      public Object list(){
      return productService.listProduct();
      }


      /**
      * 根据id查找商品详情
      * @param id
      * @return
      */
      @RequestMapping("find")
      public Object findById(int id){

      try {
      TimeUnit.SECONDS.sleep(2);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      Product product = productService.findById(id);

      Product result = new Product();
      BeanUtils.copyProperties(product,result);
      result.setName( result.getName() + " data from port="+port );
      return result;
      }

      }
      启动类也要添加注解
    • SpringBootApplication
      @EntityScan("com.topcheer.order.entity")
      @EnableFeignClients
      @EnableHystrix
      public class OrderApplication { /**
      * 使用spring提供的RestTemplate发送http请求到商品服务
      * 1.创建RestTemplate对象交给容器管理
      * 2.在使用的时候,调用其方法完成操作 (getXX,postxxx)
      * * @LoadBalanced : 是ribbon提供的负载均衡的注解
      */
      @LoadBalanced
      @Bean
      public RestTemplate restTemplate() {
      return new RestTemplate();
      } public static void main(String[] args) {
      SpringApplication.run(OrderApplication.class,args);
      }
      }

      注:也可以卸载整个类上,代表整个类都会走这个异常

  • 结果:

    当前面的ribbon配置3秒的时候,可以直接返回结果。

    当前面的ribbon配置2秒的时候,会被HystrixCommand里面的异常方法捕获到。

SpringCloud之Hystrix断路器(六)的更多相关文章

  1. 【微服务架构】SpringCloud之Hystrix断路器(六)

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

  2. Springcloud 整合Hystrix 断路器,支持Feign客户端调用

    1,在这篇博文中,已经大致说过了Springcloud服务保护框架 Hystrix在服务隔离,服务降级,以及服务熔断中的使用 https://www.cnblogs.com/pickKnow/p/11 ...

  3. SpringCloud之Hystrix断路器以及dashboard 属性详解

    1.自定义hystrixCommand: https://blog.csdn.net/u012702547/article/details/78032191?utm_source=tuicool&am ...

  4. SpringCloud 进阶之Hystrix(断路器)

    1. Hystrix 断路器 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败, 比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况 ...

  5. SpringCloud的入门学习之概念理解、Hystrix断路器

    1.分布式系统面临的问题,复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 2.什么是服务雪崩? 答:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务 ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下

    笔记 4.Feign结合Hystrix断路器开发实战<下>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况     1.feign结合Hystrix       ...

  7. 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上

    笔记 3.Feign结合Hystrix断路器开发实战<上>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖          注意:网上新旧版本问 ...

  8. springcloud费话之断路器(hystrix in feign)

    目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...

  9. SpringCloud学习笔记(七):Hystrix断路器

    概述 什么时候需要断路器?熔断? 举个简单的例子:小明喜欢小美,可是小美没有电话,小美给了小明家里的座机,小明打给座机,这个时候小美的妈妈接到了,小明怕妈妈知道自己喜欢小美,就跟小美妈妈说让小美哥接电 ...

随机推荐

  1. Spring 梳理-bean配置与装配

    1       bean配置与装配 1.1      bean在XML文件中进行显示配置并装配 1.2      bean在JavaConfig中显示配置并装配 1.2.1  优点:类型是安全的,编译 ...

  2. WebGL简易教程(七):绘制一个矩形体

    目录 1. 概述 2. 示例 2.1. 顶点索引绘制 2.2. MVP矩阵设置 2.2.1. 模型矩阵 2.2.2. 投影矩阵 2.2.3. 视图矩阵 2.2.4. MVP矩阵 3. 结果 4. 参考 ...

  3. SQL使用UPDATE和SUBSTRING截取字符串方法,从头截取到某个位置,截取中间片段,字符串中间截取到末尾或删除前面的字符串

    //从头截取 update 表名 set 表列名 =SUBSTRING(表列名,1,目标位置数值)  //!计数从1开始,从左往右 where 条件   //条件自己选择,不加where条件会更新所有 ...

  4. MVC4 Jqgrid设计与实现

    项目本来使用的是webgrid.后台弃用改成Jqgrid插件. 首先介绍一下webgrid的用法:webgrid是mvc中HtmlHelper自带的.首先创建viewmodel用于数据的绑定,然后在页 ...

  5. 瀑布流实例及懒加载(echo.js)

    瀑布流布局: 图片等宽,不定高,按最低高度来顺序排列:实现方法:获取每次获取四行中最低高度对应的一行,将下一张加载的图片放在该位置,每次加载前都获取最低高度: ①请求图片的接口    地址此php文件 ...

  6. Java 学习笔记之 Synchronized锁重入

    Synchronized锁重入: 当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁.这也证明在一个Synchronized方法/块的内部调用本类的其他Synchronized方法 ...

  7. 项目一:ssm超市订单管理系统

    声明:项目参考于课程教材,学习使用,仅在此记录 项目介绍 ssm超市订单管理系统,功能模块有订单管理,供应商管理,用户管理,密码修改,退出系统,管理模块中包括基本的增删改查 集成工具使用idea,基于 ...

  8. spring5 源码深度解析----- 事务的回滚和提交(100%理解事务)

    上一篇文章讲解了获取事务,并且通过获取的connection设置只读.隔离级别等,这篇文章讲解剩下的事务的回滚和提交 回滚处理 之前已经完成了目标方法运行前的事务准备工作,而这些准备工作最大的目的无非 ...

  9. SQL SERVER数据库批量替换某个数据表里的数据update

    批量替换:将A表CMC里面所有包含a替换成b而不影响其他内容UPDATE A SET CMC=REPLACE(CMC,'a','b')

  10. iptables详解之filter

    iptables详解之filter iptables令很多小伙伴脑阔疼,下面我们来说说如何使用iptables. 一.iptables格式 1.1.iptables 帮助 通过iptables --h ...