精华内容
下载资源
问答
  • 1.Sentinel介绍 ...Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.3去哪下 https://github.com/alibaba/Sentinel/releases 1.4能干什么 #### 1.5怎么服务使用

    1.Sentinel介绍

    分布式系统的流量防卫兵

    1.1官网地址

    https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

    1.2是什么

    和Hystrix类似

    轻量级的流量控制、熔断降级Java库。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    1.3去哪下

    https://github.com/alibaba/Sentinel/releases
    在这里插入图片描述

    1.4能干什么

    在这里插入图片描述#### 1.5怎么用

    服务使用中的各种问题

    • 服务雪崩
    • 服务降级
    • 服务熔断
    • 服务限流

    2.安装Sentinel控制台

    2.1sentinel组件由2部分组成

    Sentinel 分为两个部分:

    • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

    2.2安装步骤

    2.2.1下载

    下载地址:https://github.com/alibaba/Sentinel/releases

    2.2.2运行命令

    前提

    • JDK8环境
    • 8080端口不能被占用

    启动命令

    java -jar sentinel-dashboard-1.7.0.jar

    3.初始化演示工程

    启动注册中心nacos

    3.1新建Maven Module

    cloudalibaba-sentinel-service

    3.2POM

        <dependencies>
    
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
    
    <!--        <dependency>-->
    <!--            <groupId>org.springframework.cloud</groupId>-->
    <!--            <artifactId>spring-cloud-starter-openfeign</artifactId>-->
    <!--        </dependency>-->
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
    <!--        <dependency>-->
    <!--            <groupId>org.springframework.boot</groupId>-->
    <!--            <artifactId>spring-boot-devtools</artifactId>-->
    <!--            <scope>runtime</scope>-->
    <!--            <optional>true</optional>-->
    <!--        </dependency>-->
    <!--        <dependency>-->
    <!--            <groupId>cn.hutool</groupId>-->
    <!--            <artifactId>hutool-all</artifactId>-->
    <!--            <version>4.6.3</version>-->
    <!--        </dependency>-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    

    3.3配置文件

    server:
      port: 8401
    
    spring:
      application:
        name: cloudalibaba-sentinel-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        sentinel:
          transport:
            dashboard: localhost:8080 # 仪表板地址
            port: 8719  #sentinel api端口  默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    3.4主启动类

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * create date  2020-08-27 19:29 by niugang
     */
    @EnableDiscoveryClient
    @SpringBootApplication
    public class SentinelApplication
    {
        public static void main(String[] args) {
            SpringApplication.run(SentinelApplication.class, args);
        }
    }
    
    

    3.5业务类

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * create date  2020-08-27 19:30 by niugang
     */
    @RestController
    public class FlowLimitController {
    
        @GetMapping("/testA")
        public String testA() {
            return "------testA";
        }
    
        @GetMapping("/testB")
        public String testB() {
    
            return "------testB";
        }
    
    
    }
    
    

    3.6启动Sentinel8080

    java -jar sentinel.jar

    3.7启动微服务8401

    3.8启动8401微服务后查看sentienl控制台

    (1).空空如也,啥都没有

    (2).Sentinel采用的懒加载说明

    执行一次访问即可

    http://localhost:8401/testA

    查看效果图
    在这里插入图片描述(4).结论

    sentinel8080正在监控微服务8401

    4.流控规则

    流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

    4.1基本介绍

    在这里插入图片描述进一步解释说明
    在这里插入图片描述
    在这里插入图片描述### 4.2流控模式

    4.2.3直接(默认)

    直接->快速失败 ->系统默认

    配置及说明
    在这里插入图片描述注意:资源名称配置 开头必须是“/”,否则配置得路径不生效,无法做流控

    测试

    快速点击访问http://localhost:8401/testA

    结果:Blocked by Sentinel (flow limiting)
    在这里插入图片描述
    直接调用默认报错信息,技术方面OK but,是否应该有我们自己的后续处理?

    4.2.4关联

    是什么关联流控模式

    当关联的资源达到阈值时,就限流自己

    当与A关联的资源B达到阈值后,就限流自己

    B惹事,A挂了

    配置A
    在这里插入图片描述
    postman模拟并发密集访问testB
    在这里插入图片描述
    Run

    大批量线程高并发访问B,导致A失效了

    运行后发现testA挂了

    点击访问http://localhost:8401/testA

    结果
    在这里插入图片描述

    4.2.5链路

    多个请求调用了同一个微服务

    4.3流控效果

    当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:直接拒绝Warm Up匀速排队

    4.3.1直接->快速失败(默认的流控处理)===直接拒绝

    直接失败,抛出异常

    直接拒绝RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时

    源码

    com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

    4.3.2预热

    说明

    公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

    官网

    Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档可以参考 流量控制 - Warm Up 文档,具体的例子可以参见 WarmUpFlowDemo

    通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:
    在这里插入图片描述默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值。

    冷启动

    https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8

    源码

    com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
    在这里插入图片描述
    Warmup配置
    在这里插入图片描述
    多次点击http://localhost:8401/testB,刚开始不行,后续慢慢OK
    应用场景
    在这里插入图片描述

    4.3.3排队等待(匀速排队)

    匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法
    在这里插入图片描述
    源码

    com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

    测试

    在这里插入图片描述

    5.降级规则

    https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

    5.1基本介绍

    在这里插入图片描述
    在这里插入图片描述
    进一步说明
    在这里插入图片描述
    Sentinel的断路器是没有半开状态的:

    半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix

    复习Hystrix:
    在这里插入图片描述
    在这里插入图片描述

    5.2降级策略实战

    5.2.1RT

    在这里插入图片描述
    在这里插入图片描述
    测试

    代码

       @GetMapping("/testD")
        public String testD() {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
            log.info("testD 测试RT");
    
            return "------testD";
        }
    

    配置
    在这里插入图片描述
    结论
    在这里插入图片描述
    在这里插入图片描述

    5.2.2异常比例

    在这里插入图片描述
    在这里插入图片描述
    测试

    代码

    @GetMapping("/testD")
     public String testD()
        {
            log.info("testD 测试RT");
            int age = 10/0;
            return "------testD";
        }
    

    配置
    在这里插入图片描述
    jemeter
    在这里插入图片描述
    结论
    在这里插入图片描述

    5.3异常数

    在这里插入图片描述
    在这里插入图片描述
    异常数是按照分钟统计的

    代码

        @GetMapping("/testE")
        public String testE()
        {
            log.info("testE 测试异常数");
            int age = 10/0;
            return "------testE 测试异常数";
        }
    

    配置
    在这里插入图片描述

    6.热点key限流

    6.1基本介绍

    在这里插入图片描述

    6.2官网

    https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

    6.3承上启下复习start

    在这里插入图片描述@SentinelResource

    6.4代码

    com.alibaba.csp.sentinel.slots.block.BlockException

    6.5配置

    在这里插入图片描述参数索引为第一个参数

    第一种

    @SentinelResource(value = “testHotKey”)

    异常打到了前台用户界面看不到,不友好

    第二种

    @SentinelResource(value = “testHotKey”,blockHandler = “deal_testHotKey”)

    方法testHostKey里面第一个参数只要QPS超过每秒1次,马上降级处理

    用了我们自己定义的

    6.5测试

    error:

    http://localhost:8401/testHotKey?p1=abc

    以为配置参数索引为0,即第一个参数

    error:

    http://localhost:8401/testHotKey?p1=abc&p2=33

    以为配置参数索引为0,即第一个参数

    right:

    http://localhost:8401/testHotKey?p2=abc

    6.6参数例外项

    上述案例演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流

    特殊情况

    • 普通:超过1秒钟一个后,达到阈值1后马上被限流
    • 我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样
    • 假如当p1的值等于5时,它的阈值可以达到200
      在这里插入图片描述测试

    right:

    http://localhost:8401/testHotKey?p1=5

    error:

    http://localhost:8401/testHotKey?p1=3

    当p1等于5的时候,阈值变为200

    当p1不等于5的时候,阈值就是平常的1

    前提条件

    热点参数的注意点,参数必须是基本类型或者String

    6.7其他

    手贱添加异常看看…
    在这里插入图片描述

    7.系统规则(系统自适应限流)

    系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

    系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

    系统规则支持以下的模式:

    • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
    • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
    • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
    • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
    • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

    配置全局QPS
    在这里插入图片描述

    展开全文
  • 微服务熔断与隔离

    2017-03-16 10:37:47
    转至元数据起始   ...微服务近年来很火很热,相关...对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将服务系统中的功能进行拆分成多个轻量的子服务,各个自服务间通过RPC实现服务...

    转至元数据起始

     

    来自: https://yq.aliyun.com/articles/7443

    微服务近年来很火很热,相关的文章汗牛充栋,关于架构设计本文就不作叙述了,只谈谈在分布式服务的容错方面怎么做。

    1 什么是微服务

    对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将服务系统中的功能进行拆分成多个轻量的子服务,各个自服务间通过RPC实现服务间的关联,这样做的好处是将业务简单化,每个子服务可以有自己独立的编程语言,模式等且能够独立维护,独立部署,功能复用。

    2 为什么需要做服务隔离与熔断

    由于微服务间通过RPC来进行数据交换,所以我们可以做一个假设:在IO型服务中,假设服务A依赖服务B和服务C,而B服务和C服务有可能继续依赖其他的服务, 继续下去会使得调用链路过长,技术上称1->N扇出。如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。

    1->N扇形

      

    雪崩效应

    3 服务雪崩的原因

    (1)某几个机器故障:例如机器的硬驱动引起的错误,或者一些特定的机器上出现一些的bug(如,内存中断或者死锁)。

    (2)服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。

    (3)人为因素:比如代码中的路径在某个时候出现bug

    4  解决或缓解服务雪崩的方案

    一般情况对于服务依赖的保护主要有3中解决方案:

    (1)熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

    (2)隔离模式:这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。

    (3)限流模式:上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

    5 熔断设计

    在熔断的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警

    (1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

    (2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。

    (3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警

    6 隔离设计

    隔离的方式一般使用两种

    (1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

    (2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

    7 超时机制设计

    超时分两种,一种是请求的等待超时,一种是请求运行超时。

    等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。

    运行超时:直接可使用线程池提供的get方法

    8 隔离与熔断代码实现

    后续会放到github上

    9 性能损耗测试

    由于存在计数统计和线程切换等的开销,所以对每个请求会有一定的性能损耗,测试结果表明在线程池隔离模式中,平均一个请求的损耗在0.5ms以内。

    测试方法:顺序请求,记录业务运行时间和隔离器运行业务的时间,请求数量500次。

    变量解释:

    单个请求耗时:为业务的运行时间(使用Thread.sleep()模拟);

    隔离消耗=请求总用时-业务用时;

    隔离评价消耗=隔离消耗/请求次数/

    测试时间统计(单位ms):

    单个请求耗时

    请求总用时

    业务用时

    隔离消耗

    隔离平均消耗

    1

    586

    510

    76

    0.152

    5

    2637

    2514

    124

    0.248

    10

    5248

    5136

    112

    0.024

    50

    25261

    25111

    150

    0.3

    100

    50265

    50130

    135

    0.27

    200

    100657

    100284

    373

    0.746

    10 参考

    在设计和实现的过程中参考了一些现有的设计和一些文章:

    1、Hystrix官方文档:https://github.com/Netflix/Hystrix/wiki

    2、Hystrix使用与分析:http://hot66hot.iteye.com/blog/2155036

    3、Facebook文章:http://queue.acm.org/detail.cfm?id=2839461

    4、Facebook文章:http://queue.acm.org/detail.cfm?id=2209336

    4、 分布式服务容错模式和实践: http://www.atatech.org/articles/31559

    展开全文
  • 微服务熔断与隔离

    2016-03-02 19:43:59
    微服务近年来很火很热,相关的文章汗牛充栋,关于架构设计本文就不作叙述了,只谈谈在分布式服务的容错方面怎么做。 1 什么是微服务 对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将...

    微服务近年来很火很热,相关的文章汗牛充栋,关于架构设计本文就不作叙述了,只谈谈在分布式服务的容错方面怎么做。

    1 什么是微服务

    对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将服务系统中的功能进行拆分成多个轻量的子服务,各个自服务间通过RPC实现服务间的关联,这样做的好处是将业务简单化,每个子服务可以有自己独立的编程语言,模式等且能够独立维护,独立部署,功能复用。

    2 为什么需要做服务隔离与熔断

    由于微服务间通过RPC来进行数据交换,所以我们可以做一个假设:在IO型服务中,假设服务A依赖服务B和服务C,而B服务和C服务有可能继续依赖其他的服务,继续下去会使得调用链路过长,技术上称1->N扇出。如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。

    21a779c7ed962f755789241dd07b716be07a8c09

    1->N扇形

    0264dedf3fd4ec05ad4321151fb06728b3eb05a3487f186ee27f9afaee04ea501770da21f9aebfa46416dfb879bc3cac0c173fc68c71a4867c567da2

    雪崩效应

    3   服务雪崩的原因

    (1)某几个机器故障:例如机器的硬驱动引起的错误,或者一些特定的机器上出现一些的bug(如,内存中断或者死锁)。

    (2)服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。

    (3)人为因素:比如代码中的路径在某个时候出现bug

    解决或缓解服务雪崩的方案

    一般情况对于服务依赖的保护主要有3中解决方案:

    (1)熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

     

    (2)隔离模式:这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。

     

    (3)限流模式:上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

    5 熔断设计

    在熔断的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警

    (1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

    (2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。

    (3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警

    6 隔离设计

    隔离的方式一般使用两种

    (1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

    (2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

    7 超时机制设计

    超时分两种,一种是请求的等待超时,一种是请求运行超时。

    等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。

    运行超时:直接可使用线程池提供的get方法

    8 隔离与熔断代码实现

    后续会放到github上

    9 性能损耗测试

    由于存在计数统计和线程切换等的开销,所以对每个请求会有一定的性能损耗,测试结果表明在线程池隔离模式中,平均一个请求的损耗在0.5ms以内。


    测试方法:顺序请求,记录业务运行时间和隔离器运行业务的时间,请求数量500次。

    变量解释:

    单个请求耗时:为业务的运行时间(使用Thread.sleep()模拟);

    隔离消耗=请求总用时-业务用时;

    隔离评价消耗=隔离消耗/请求次数/


    测试时间统计(单位ms):

    单个请求耗时

    请求总用时

    业务用时

    隔离消耗

    隔离平均消耗

    1

    586

    510

    76

    0.152

    5

    2637

    2514

    124

    0.248

    10

    5248

    5136

    112

    0.024

    50

    25261

    25111

    150

    0.3

    100

    50265

    50130

    135

    0.27

    200

    100657

    100284

    373

    0.746

    10 参考

    在设计和实现的过程中参考了一些现有的设计和一些文章:
    1、Hystrix官方文档:https://github.com/Netflix/Hystrix/wiki

    2、Hystrix使用与分析:http://hot66hot.iteye.com/blog/2155036

    3、Facebook文章:http://queue.acm.org/detail.cfm?id=2839461

    4、Facebook文章:http://queue.acm.org/detail.cfm?id=2209336

    4、分布式服务容错模式和实践:http://www.atatech.org/articles/31559



    展开全文
  • 场景 SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式...在上面已经实现使用Ribbon和Feign的方式使用熔断器,但是如果服务一直在被熔断需要怎么解决。 所以这里使用熔断仪表盘监控熔断。 这里使用feign的...

    场景

    SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102616697

    在上面已经实现使用Ribbon和Feign的方式使用熔断器,但是如果服务一直在被熔断需要怎么解决。

    所以这里使用熔断仪表盘监控熔断。

    这里使用feign的方式使用监控。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    在pom.xml中加入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>

    然后在Application中添加注解@EnableHystrixDashboard

    package com.badao.hello.spring.cloud.web.feign;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    @EnableHystrixDashboard
    public class WebAdminFeignApplication {
        public static void main(String[] args) {
            SpringApplication.run(WebAdminFeignApplication.class, args);
        }
    }
    
    

    创建hystrix.stream的Servlet配置

    在包下新建config包,在config包下新建config配置类

    package com.badao.hello.spring.cloud.web.feign.config;
    
    import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class HystrixDashboardConfiguration {
        @Bean
        public ServletRegistrationBean getServlet() {
            HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
            registrationBean.setLoadOnStartup(1);
            registrationBean.addUrlMappings("/hystrix.stream");
            registrationBean.setName("HystrixMetricsStreamServlet");
            return registrationBean;
        }
    }

     

    效果

    打开浏览器,输入:

    http://localhost:8765/hystrix

     

    然后在url这里,输入上面在配置类中配置的url。

    Delay表示监控的间隔,默认是2秒钟。

    Title可以自己随意起。

     

    然后点击Monitor Stream按钮。

     

    此时我们多次触发熔断器,这里不启动服务提供者,使用服务消费者Feign的方式去请求服务,使其触发熔断,打开浏览器输入:

    http://localhost:8765/hi?message=HelloFrign

    然后再回到熔断仪表盘这里

     

    展开全文
  • 前言 看这篇文章之前,我建议还是先看一下我之前写的两篇文章(feign服务调用;负载均衡与熔断)。 spring cloud zuul是一个网关相关技术,...以及限流操作是怎么实现的,下述文章将会通过例子的方式来讲述。 zuul的...
  • 服务器一秒只处理N个请求的实现

    千次阅读 2020-01-15 18:08:25
    这几天,写了一个简单的登录案例,在里面就有一个功能,服务器一秒最多处理200个请求,超过的请求,会直接返回一个提示语,可以把这看作是一种熔断的处理。...先来讲讲这个功能,我是怎么实现的。 要做...
  • 熔断怎么实现? 6.springboot的装配原理和starter原理 7.spring的beanfactory的factorybean的区别 8mvc内部 是拦截器还是serverlet 9实现一个散列,怎么实现? 10.hashtable和concurrtenthashmap内部怎么做到线程...
  • 在之前的18次文章中,我们实现了广告系统的广告投放,广告检索业务功能,中间使用到了 服务发现Eureka,服务调用Feign,网关路由Zuul以及错误熔断Hystrix等Spring Cloud组件。简单调用关系: 但是系统往往都会报错,...
  • 最近在做分布式服务熔断,因为要实现一个熔断器状态机,所以想到状态模式。状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件...
  • 上一节主要介绍了 Spring Cloud 中使用 Hystrix 来做服务熔断与降级处理,确保整个系统正常运行,而不至于发生“雪崩效应”。那么如果我们想在一个可视化界面来监控这些服务,该怎么做呢?...
  • Sentinel熔断和持久化服务熔断不设置任何参数设置fallback设置blockHandlerblockHandler和fallback一起配置异常忽略Feign系列引入依赖修改YML启动类激活Feign引入Feign接口加入fallback兜底方法实现测试熔断框架对比...
  • 前面有用过 Hystrix 熔断,在多服务运行时。可以通过Hystrix 的监控面板来实时观察各个服务的运行健康、效率和请求量等。 首先从《Spring Cloud微服务实战》作者的博客中借用一图: 此图出自:...
  • 节点,时间,一致性,CAP,ACID,BASE,P2P,机器伸缩,网络变更,负载均衡,限流,鉴权,服务发现,服务编排,降级,熔断,幂等,分库分表,分片分区,自动运维,容错处理,全栈监控,故障恢复,性能调优 ...
  •   在应对服务雪崩效应时,除了前面介绍的降级,缓存,请求合并及熔断外还有一种方式就是隔离,隔离又分为线程池隔离和信号量隔离。接下来我们分别来介绍。 一、线程池隔离 1.概念介绍   我们通过以下几个图片来...
  • 并发

    2019-05-16 00:16:37
    并发 高并发的解决方案:服务降级,限...Hystrix是一个微服务中关于服务保护,在分布式中能够实现服务一个容错的框架,减少服务服务间的依赖关系(也就是你的服务挂了,不影响我的服务的意思),防止服务雪崩效应...
  • 新奥集团 spring ioc 的原理, ...服务熔断限流如何实现 jvm有哪几种垃圾回收机制,怎么回收的 elasticSearch索引机制 闪送 redis锁是如何实现的,为什么要用redis锁,如何优化,能不能不用redis锁
  • 招商银行面试问题20200416

    千次阅读 2020-04-16 15:27:29
    招商银行面试: 如何保证MySQL和Redis的双写一致性? 如何实现分布式事务? 如何实现分布式锁? ...zk和Redis分布式锁的优缺点?...熔断怎么做的?降级的逻辑是怎么写的? 分布式服务的限流如何做呢?...
  • SpringCloud-Day01

    2020-07-01 20:40:37
    服务这么多,服务之间怎么通信? 服务这么多,怎么去管制? 服务突然挂了怎么办? 解决方案 Spring cloud NetFlix 一站式解决方案 Api网关 ,zuul组件 Feign —HttpClient ----Http通信方式 同步,阻塞 服务,注册...
  • SpringCloud

    2021-03-11 16:53:13
    服务很多,客户端怎么访问?API网关,服务路由 这么多服务服务之间如何通信?Http,RPC框架(dubbo),异步调用 这么多服务,如何治理?服务注册与发现,实现高可用 服务挂了怎么办?熔断机制,服务降级 解决方案...
  • SpringCloud基础学习

    2020-09-14 20:48:43
    服务很多,客户端应该怎么访问? 这么多服务服务之间如何通信? 这么多服务,如何管理? 服务挂了怎么办? 解决方案 Spring Cloud NetFlix(一站式解决) api网关 zuul组件 Fegin(Http通信方式) Eureka...

空空如也

空空如也

1 2 3 4 5
收藏数 92
精华内容 36
关键字:

服务熔断怎么实现