微服务保护-Sentinel(初识Sentinel Sentinel介绍和安装 jmeter使用 流量控制 流控效果 热点参数限流 隔离和降级 sentinel的线程隔离)

目录

一、初识Sentinel

1.1 .雪崩问题及解决⽅案

1.1.1 雪崩问题

1.1.2.超时处理

1.1.3.仓壁模式

1.1.4.断路器

1.1.5.限流

1.1.6.总结 

二、Sentinel介绍和安装

1. 初识Sentinel

2. 安装Sentinel

2.1 下载

2.2 运⾏

2.3 访问

3. 微服务整合Sentinel

3.1 调整父pom文件的版本

3.2 引⼊sentinel依赖

3.3 配置控制台

3.4 访问order-service的任意端点 

三、jmeter使用

1. 安装]meter

1.1 下载 

1.2.解压

1.3 运行 

2. 基本用法 

四、流量控制

1. 簇点链路

2. 快速⼊⻔(直接模式)

2.1⾸先在sentinel控制台添加限流规则

2.2 利⽤jmeter测试

3. 流控模式

4. 关联模式

 演示:

4.1 定义/order/query端点,模拟订单查询  

4.2 定义/order/update端点,模拟订单更新 

4.3 配置流控规则

4.4 在Jmeter测试

5. 链路模式

实战案例

5.1 添加查询商品⽅法

5.2 查询订单时,查询商品

5.3 新增订单,查询商品

5.4 给查询商品添加资源标记

5.5 添加流控规则

5.6 Jmeter测试

6. 总结

五、流控效果

1. warm up

1.1 配置流控规则:    

​编辑​编辑

1.2 Jmeter测试 QPS为10.

2. 排队等待

2.1 添加流控规则

2.2 Jmeter测试

3. 总结 

六、热点参数限流 

1. 全局参数限流

2. 热点参数限流

2.1 标记资源

2.2 Jmeter测试

七、隔离和降级

1. FeignClient整合Sentinel

1.1 修改配置,开启sentinel功能

1.2 编写失败降级逻辑

 八、sentinel的线程隔离

总结


一、初识Sentinel

1.1 .雪崩问题及解决⽅案

1.1.1 雪崩问题

微服务中,服务间调⽤关系错综复杂,⼀个微服务往往依赖于多个其它微服务。

如图,如果服务提供者I发⽣了故障,当前的应⽤的部分业务因为依赖于服务I,因此也会被阻塞。此时, 其它不依赖于服务I的业务似乎不受影响。
服务器⽀持的线程和并发数有限,请求⼀直阻塞,会导致服务器资源耗尽,从⽽导致所有其它服务都不可⽤,那么当前服务也就不可⽤了。
那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可⽤,形成级联失败,雪崩就发⽣了:

1.1.2.超时处理

解决雪崩问题的常⻅⽅式有四种:
•超时处理:设定超时时间,请求超过⼀定时间没有响应就返回错误信息,不会⽆休⽌等待

1.1.3.仓壁模式

仓壁模式来源于船舱的设计:

于此类似,我们可以限定每个业务能使⽤的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

1.1.4.断路器

断路器模式:由断路器统计业务执⾏的异常⽐例,如果超出阈值则会熔断该业务,拦截访问该业务的⼀切请求。
断路器会统计访问某个服务的请求数量,异常⽐例:

1.1.5.限流

流量控制:限制业务访问的QPS,避免服务因流量的突增⽽故障。

1.1.6.总结 

什么是雪崩问题?
  •  微服务之间相互调⽤,因为调⽤链中的⼀个服务故障,引起整个链路都⽆法访问的情况。

可以认为:

  • 限流是对服务的保护,避免因瞬间⾼并发流量⽽导致服务故障,进⽽避免雪崩是⼀种预防措施。
  • 超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在⼀定范围,避免雪崩。是⼀种补救措施。

二、Sentinel介绍和安装

1. 初识Sentinel

Sentinel是阿⾥巴巴开源的⼀款微服务流量控制组件。官⽹地址:
https://sentinelguard.io/zh-cn/index.html
Sentinel 具有以下特征:
  • 丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填⾕、集群流量控制、实时熔断下游不可⽤应⽤等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接⼊应⽤的单台机器秒级数据,甚⾄ 500 台以下规模的集群的汇总运⾏情况。
  • ⼴泛的开源⽣态:Sentinel 提供开箱即⽤的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊ Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易⽤、完善的 SPI 扩展接⼝。您可以通过实现扩展接⼝来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

2. 安装Sentinel

2.1 下载

sentinel官⽅提供了UI控制台,⽅便我们对系统做限流设置。⼤家可以在GitHub下载。

2.2 运⾏

将jar包放到任意⾮中⽂⽬录,执⾏命令:

java -jar sentinel-dashboard-1.8.1.jar

如果要修改Sentinel的默认端⼝、账户、密码,可以通过下列配置:

配置项默认值说明
server.port8080服务端口
sentinel.dashboard.auth.usernamesentinel默认用户名
sentinel.dashboard.auth.passwordsentinel默认密码

例如,修改端⼝:(注意 在安装目录下cmd 进入)

java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar

2.3 访问

访问http://localhost:8090⻚⾯(因为这里设置了端口号运行),就可以看到sentinel的控制台了:
需要输⼊账号和密码,默认都是:sentinel
登录后,发现⼀⽚空⽩,什么都没有:
这是因为我们还没有与微服务整合;懒加载

3. 微服务整合Sentinel

在之前ribbon项目修改

 我们在shop-order中整合sentinel,并连接sentinel的控制台,步骤如下:

3.1 调整父pom文件的版本

<!-- 父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!-- 依赖版本的锁定 -->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>    
    </properties>

3.2 引⼊sentinel依赖

<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

这里在orde里面添加坐标

3.3 配置控制台

修改application.yaml⽂件,添加下⾯内容:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090

修改后的yml文件

server:
  port: 8091
spring:
  application:
    name: service-order
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: localhost:8090

#需要调用的微服务名称
service-product:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

3.4 访问order-service的任意端点 

打开浏览器,访问http://localhost:8091/order/prod/11,这样才能触发sentinel的监控。
然后再访问sentinel的控制台,查看效果

三、jmeter使用

1. 安装]meter

Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量。

1.1 下载 

可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download jmeter.cgi 

1.2.解压

因为下载的是zip包,解压缩即可使用,目录结构如下其中的bin目录就是执行的脚本,其中包含启动脚本:

1.3 运行 

双击即可运行,但是有两点注意:

  • 启动速度比较慢,要耐心等待
  • 启动后黑窗口不能关闭,否则meter也跟着关闭了

2. 基本用法 

在测试计划上点鼠标右键,选择添加>线程(用户)>线程组在新增的线程组中,填写线程信息:给线程组点鼠标右键,添加Http取样器:

编写取样器内容:

添加监听结果树

结果树

四、流量控制

        雪崩问题虽然有四种⽅案,但是限流是避免服务因突发的流量⽽发⽣故障,是对微服务雪崩问题的预防。我们先学习这种模式。

1. 簇点链路

        当请求进⼊微服务时,⾸先会访问DispatcherServlet,然后进⼊Controller、Service、Mapper,这样的⼀个调⽤链就叫做簇点链路 簇点链路中被监控的每⼀个接⼝就是⼀个资源。
默认情况下sentinel会监控SpringMVC的每⼀个端点(Endpoint,也就是controller中的⽅法),因此SpringMVC的每⼀个端点(Endpoint)就是调⽤链路中的⼀个资源。
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后⾯的按钮来设置规则:
  • ● 流控:流量控制
  • ● 降级:降级熔断
  • ● 热点:热点参数限流,是限流的⼀种
  • ● 授权:请求的权限控制

2. 快速⼊⻔(直接模式

点击资源/order/prod/{pid}后⾯的流控按钮,就可以弹出表单。

他会跳到流控规则里

QPS即每秒查询率,QPS = req/sec = 请求数/秒,即每秒的响应请求数,也即是最⼤吞吐能⼒
给 /order/prod/{pid}这个资源设置流控规则,QPS不能超过2,然后测试。

2.1⾸先在sentinel控制台添加限流规则

20个⽤户,2秒内运⾏完,QPS是10,超过了2.
选中 流控⼊⻔, QPS<2  右键运⾏:

2.2 利⽤jmeter测试

设置请求

因为我设置的阈值是2 所以每秒只有两个成功

3. 流控模式

在添加限流规则时,点击⾼级选项,可以选择三种流控模式:
  • ● 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • ● 关联:统计与当前资源相关的另⼀个资源,触发阈值时,对当前资源限流
  • ● 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

快速⼊⻔测试的就是直接模式

4. 关联模式

关联模式:统计与当前资源相关的另⼀个资源,触发阈值时,对当前资源限流 语法说明:当/write资源访问量触发阈值时,就会对/read资源限流,避免影响/write资源
使⽤场景:⽐如⽤户⽀付时需要修改订单状态,同时⽤户要查询订单。查询和修改操作会争抢数据库锁,产⽣竞争。业务需求是优先⽀付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流

 演示:

需求说明:
  • 在OrderController新建两个端点:/order/query和/order/update,⽆需实现业务
  • 配置流控规则,当/order/ update资源被访问的QPS超过5时,对/order/query请求限流

4.1 定义/order/query端点,模拟订单查询  

@GetMapping("/order/query")
    public String queryOrder() {
        return "查询订单成功";
    }

4.2 定义/order/update端点,模拟订单更新 

@GetMapping("/order/update")
    public String updateOrder() {
        return "更新订单成功";
    }

先访问一次 然后在配置流控规则

4.3 配置流控规则

对哪个端点限流,就点击哪个端点后⾯的按钮。我们是对订单查询/order/query限流,因此点击它后⾯的按钮:

点高级选项

配置jemeter

4.4 在Jmeter测试

可以看到1000个⽤户,100秒,因此QPS为10,超过了我们设定的阈值:5
请求的⽬标是/order/update,这样这个断点就会触发阈值
但限流的⽬标是/order/query,我们在浏览器访问,可以发现:确实被限流了

5. 链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
配置示例:
例如有两条请求链路:
  • /test1 --> /common
  • /test2 --> /common
如果只希望统计从/test2进⼊到/common的请求,则可以这样配置:

实战案例

需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进⼊到查询商品的请求统计,并设置限流。
步骤:
  • 1. 在OrderService中添加⼀个queryGoods⽅法,不⽤实现业务
  • 2. 在OrderController中,改造/order/query端点,调⽤OrderService中的queryGoods⽅法
  • 3. 在OrderController中添加⼀个/order/save的端点,调⽤OrderService的queryGoods⽅法
  • 4. 给queryGoods设置限流规则,从/order/query进⼊queryGoods的⽅法限制QPS必须⼩于2

实现:

5.1 添加查询商品⽅法

在shop-order服务中,给OrderService类添加⼀个queryGoods⽅法:

给查询商品添加资源标记
默认情况下,OrderService中的⽅法是不被Sentinel监控的,需要我们⾃⼰通过注解来标记要监控的⽅ 法。
给OrderService的queryGoods⽅法添加@SentinelResource注解:
@SentinelResource("goods")
    @Override
    public void queryGoods() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("查询商品");
    }

5.2 查询订单时,查询商品

在shop-order的OrderController中,修改/order/query端点的业务逻辑:
 @GetMapping("/order/query")
    public String queryOrder() {
        // 查询商品
        orderService.queryGoods();
        // 查询订单
        System.out.println("查询订单");
        return "查询订单成功";
    }

5.3 新增订单,查询商品

在shop-order的OrderController中,修改/order/update端点,模拟新增订单:

@GetMapping("/order/update")
    public String updateOrder() {
        // 查询商品
        orderService.queryGoods();
        // 查询订单
        System.err.println("新增订单");
        return "更新订单成功";
    }

5.4 给查询商品添加资源标记

默认情况下,OrderService中的⽅法是不被Sentinel监控的,需要我们⾃⼰通过注解来标记要监控的⽅ 法。
给OrderService的queryGoods⽅法添加@SentinelResource注解:
@SentinelResource("goods")
    @Override
    public void queryGoods() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("查询商品");
    }

链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进⼊SpringMVC的所有请求设置同⼀个root资源,会导致链路模式失效。

我们需要关闭这种对SpringMVC的资源聚合,修改order-service服务的application.yml⽂件:

加入这个


 web-context-unify: false # 关闭context整合

 重启服务,访问/order/query和/order/update,可以查看到sentinel的簇点链路规则中,出现了新的资源:

5.5 添加流控规则

点击goods资源后⾯的流控按钮,在弹出的表单中填写下⾯信息:只统计从/order/query进⼊/goods的资源,QPS阈值为2,超出则被限流。

5.6 Jmeter测试

可以看到这⾥200个⽤户,50秒内发完,QPS为4,超过了我们设定的阈值2
⼀个http请求是访问/order/save:运⾏的结果:完全不受影响。

6. 总结

流控模式有哪些?

  • 直接:对当前资源限流
  • 关联:⾼优先级资源触发阈值,对低优先级资源限流。
  • 链路:阈值统计时,只统计从指定资源进⼊当前资源的请求,是对请求来源的限流

五、流控效果

在流控的⾼级选项中,还有⼀个流控效果选项:
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
  • 快速失败:达到阈值后,新的请求会被⽴即拒绝并抛出FlowException异常。是默认的处理⽅式。
  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从⼀个较⼩值逐渐增加到最⼤阈值。
  • 排队等待:让所有的请求按照先后次序排队执⾏,两个请求的间隔不能⼩于指定时⻓
之前的都是快速失败

1. warm up

        阈值⼀般是⼀个微服务能承担的最⼤QPS,但是⼀个服务刚刚启动时,⼀切资源尚未初始化(冷启动),如果直接将QPS跑到最⼤值,可能导致服务瞬间宕机
         warm up也叫预热模式,是应对服务冷启动的⼀种⽅案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时⻓后,逐渐提⾼到maxThreshold值。⽽coldFactor的默认值是3.
例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增⻓到10.
案例
需求:给/order/prod/{pid}这个资源设置限流,最⼤QPS为10,利⽤warm up效果,预热时⻓为5秒

启动订单和商品服务

1.1 配置流控规则:    

1.2 Jmeter测试 QPS为10.

刚刚启动时,⼤部分请求失败,成功的只有3个,说明QPS被限定在3:随着时间推移,成功⽐例越来越⾼:
5秒之后全部成功
到Sentinel控制台查看实时监控:        

2. 排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。
⽽排队等待则是让所有请求进⼊⼀个队列中,然后按照阈值允许的时间间隔依次执⾏。后来的请求必须等待前⾯执⾏完成,如果请求预期的等待时间超出最⼤时⻓,则会被拒绝。
⼯作原理
例如:QPS = 5,意味着每200ms处理⼀个队列中的请求;timeout = 2000,意味着预期等待时⻓超过2000ms的请求会被拒绝并抛出异常。
那什么叫做预期等待时⻓呢?
⽐如现在⼀下⼦来了12 个请求,因为每200ms执⾏⼀个请求,那么:
  • 第6个请求的预期等待时⻓ = 200 * (6 - 1) = 1000ms
  • 第12个请求的预期等待时⻓ = 200 * (12-1) = 2200ms

现在,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的:

如果使⽤队列模式做流控,所有进⼊的请求都要排队,以固定的200ms的间隔执⾏,QPS会变的很平滑:
平滑的QPS曲线,对于服务器来说是更友好的。
案例
需求:给/order/prod/{pid}这个资源设置限流,最⼤QPS为10,利⽤排队的流控效果,超时时⻓设置为5s

2.1 添加流控规则

2.2 Jmeter测试

QPS为15,已经超过了我们设定的10

如果是之前的 快速失败、warmup模式,超出的请求应该会直接报错。
但是我们看看队列模式的运⾏结果:全部都通过了
再去sentinel查看实时监控的QPS曲线: QPS⾮常平滑,⼀致保持在10,但是超出的请求没有被拒绝,⽽是放⼊队列。(后面是

3. 总结 

流控效果有哪些?
  • 快速失败:QPS超过阈值时,拒绝新的请求
  • warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时⾼并发导致服务宕机。
  • 排队等待:请求会进⼊队列,按照阈值允许的时间间隔依次执⾏请求;如果请求预期等待时⻓⼤于超时时间,直接拒绝

六、热点参数限流 

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。⽽热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

1. 全局参数限流

例如,⼀个根据id查询商品的接⼝: 访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS,统计结果: 当id=1的请求触发阈值被限流时,id值不为1的请求不受影响。

配置示例:
代表的含义是:对hot这个资源的0号参数(第⼀个参数)做统计,每1秒相同参数值的请求数不能超过5

2. 热点参数限流

刚才的配置中,对查询商品这个接⼝的所有商品⼀视同仁,QPS都限定为5.
⽽在实际开发中,可能部分商品是热点商品,例如秒杀商品,我们希望这部分商品的QPS限制与其它商品不⼀样,⾼⼀些。那就需要配置热点参数限流的⾼级选项了:
结合上⼀个配置,这⾥的含义是对0号的long类型参数限流,每1秒相同参数的QPS不能超过5,有两个例外:
  • •如果参数值是1,则每1秒允许的QPS为4
  • •如果参数值是2,则每1秒允许的QPS为10

案例

案例需求:给/order/prod/{pid}这个资源添加热点参数限流,规则如下:

  • 默认的热点参数规则是每1秒请求量不超过2
  • 给14这个参数设置例外:每1秒请求量不超过4
  • 给17这个参数设置例外:每1秒请求量不超过10

注意事项:热点参数限流对默认的SpringMVC资源⽆效,需要利⽤@SentinelResource注解标记资源

2.1 标记资源

给shop-order中的OrderController中的/order/prod/{pId}资源添加注解: 


    @SentinelResource("hot")
    @RequestMapping("/order/prod/{pid}")
    public Order order(@PathVariable("pid") Integer pid) {
        //通过restTemplate调用商品微服务
        String url = "service-product";
        Product product = restTemplate.getForObject( "http://"+url+"/product/" + pid, Product.class);
        //下单(创建订单)
        Order order = new Order();
        order.setUid(1);
        order.setUsername("测试用户");
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        orderService.createOrder(order);
        return order;
    }

 给shop-order-中的OrderController中的/order/prod/{pid}资源添加注解:

@SentinelResource("hot")

访问该接⼝,可以看到我们标记的hot资源出现了:这⾥不要点击hot后⾯的按钮,⻚⾯有BUG
点击左侧菜单中热点规则菜单:

2.2 Jmeter测试

 
这⾥发起请求的QPS为5.包含3个http请求:
普通参数,QPS阈值为2
运⾏结果:每次成功2个请求
例外项,QPS阈值为4
运⾏结果:每次成功4个请求
例外项,QPS阈值为10
运⾏结果:每次成功所有请求

七、隔离和降级

限流是⼀种预防措施,虽然限流可以尽量避免因⾼并发⽽引起的服务故障,但服务还会因为其它原因⽽故障。
⽽要将这些故障控制在⼀定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级⼿段了。
线程隔离之前讲到过:调⽤者在调⽤服务提供者时,给每个调⽤的请求分配独⽴线程池,出现故障时,最多消耗这个线程池内资源,避免把调⽤者的所有资源耗尽。
熔断降级:是在调⽤⽅这边加⼊断路器,统计对服务提供者的调⽤,如果调⽤的失败⽐例过⾼,则熔断该业务,不允许访问该服务的提供者了。
可以看到,不管是线程隔离还是熔断降级,都是对客户端(调⽤⽅)的保护。需要在调⽤⽅ 发起远程调⽤时做线程隔离、或者服务熔断。
⽽我们的微服务远程调⽤都是基于Feign来完成的,因此我们需要将Feign与Sentinel整合,在Feign⾥⾯实现线程隔离和服务熔断。

1. FeignClient整合Sentinel

SpringCloud中,微服务调⽤都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。

1.1 修改配置,开启sentinel功能

feign:
  sentinel:
    enabled: true  # 开启feign对sentinel的⽀持

在原有的feign基础上改写

导入坐标

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

1.2 编写失败降级逻辑

业务失败后,不能直接报错,⽽应该返回⽤户⼀个友好提示或者默认结果,这个就是失败降级逻辑。
给FeignClient编写失败后的降级逻辑
①⽅式⼀:FallbackClass,⽆法对远程调⽤的异常做处理
②⽅式⼆:FallbackFactory,可以对远程调⽤的异常做处理

 ⽅式1:

步骤⼀:配置yml⽂件开启⽀持

​
feign:
  sentinel:
    enabled: true  # 开启feign对sentinel的⽀持

​

步骤⼆:创建ProductServiceFallBack类实现降级⽅案编辑  

@Component
public class ProductServiceFallBack implements IProductService{
    @Override
    public Product findByPid(Integer pid) {
        Product product = new Product();
        product.setPid(-1);
        product.setPname("暂无商品");
        return product;
    }
}

步骤三:配置属性
@FeignClient(value="service-product", fallback = ProductServiceFallBack.cla
ss)

⽅式2:

步骤⼀:配置yml⽂件开启⽀持  

​
feign:
  sentinel:
    enabled: true  # 开启feign对sentinel的⽀持

​
步骤⼆:创建ProductServiceFallBack类实现降级⽅案编辑
@Component
public class ProductServiceFallBack implements FallbackFactory<ProductService> {

    @Override
    public ProductService create(Throwable throwable) {
        return new ProductService() {
            @Override
            public Product findByPid(Integer pid) {
                System.out.println("异常信息:" + throwable);
                Product product = new Product();
                product.setPid(-1);
                product.setPname("暂无商品");
                return product;
            }
        };
    }
}

步骤三:配置属性
@FeignClient(value="service-product", fallback = ProductServiceFallBack.cla
ss)

 八、sentinel的线程隔离

⽤法说明:

在添加限流规则时,可以选择两种阈值类型:

  • QPS:就是每秒的请求数,在快速⼊⻔中已经演示过
  • 线程数:是该资源能使⽤⽤的tomcat线程数的最⼤值。也就是通过限制线程数量,实现线程隔离 (舱壁模式)

案例需求:给 order-service服务中的UserClient的查询⽤户接⼝设置流控规则,线程数不能超过 2。然后利⽤jemeter测试。
1)配置隔离规则
选择feign接⼝后⾯的流控按钮:
2)Jmeter测试
⼀次发⽣10个请求,有较⼤概率并发线程数超过2,⽽超出的请求会⾛之前定义的失败降级逻辑。
发现虽然结果都是通过了,不过部分请求得到的响应是降级返回的null信息。

总结

线程隔离的两种⼿段是?
● 信号量隔离
● 线程池隔离
信号量隔离的特点是?
● 基于计数器模式,简单,开销⼩
线程池隔离的特点是?
● 基于线程池模式,有额外开销,但隔离控制更强
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯诺依曼转世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值