IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java中Sentinel限流组件的使用 -> 正文阅读

[Java知识库]java中Sentinel限流组件的使用

什么是Sentinel

Sentinel也是Spring Cloud Alibaba的组件

Sentinel英文翻译"哨兵\门卫"

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

基本配置和限流效果

我们的限流针对的是控制器方法

我们找一个简单的模块来测试和观察限流效果

在csmall-stock-webapi模块中

添加sentinel的依赖

```xml
<!--? Sentinel依赖? -->
<dependency>
??? <groupId>com.alibaba.cloud</groupId>
??? <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
```

application-dev.yml文件添加配置

```yaml
spring:
? cloud:
??? sentinel:
????? transport:
??????? dashboard: localhost:8080 # 配置sentinel仪表台的位置
??????? # 执行限流的端口,每个项目唯一(别的项目(例如cart)设置的话不能再用8721)
??????? port: 8721
??? nacos:
????? discovery:
??????? server-addr: localhost:8848

下面进行限流操作

在要限流的控制器方法前添加注解

@PostMapping("/reduce/count")
@ApiOperation("减少商品库存数")
// SentinelResource注解标记的控制器方法,会被Sentinel管理
// 在这个方法第一次运行后,可以在sentinel仪表台界面中设置限流规则
// "减少库存的方法"设置当前方法在仪表台中显示的名称
@SentinelResource("减少库存的方法")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    // 调用业务逻辑层
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}

代码编写完毕,打开浏览器http://localhost:8080/

用户名和密码都是

sentinel

第一次运行控制器方法后

就可以在"簇点链路"中找到流控选项了!

自定义限流方法

对与被限流的请求,我们可以自定义限流的处理方法

默认情况下可能不能正确给用户提示,一般情况下,对被限流的请求也要有"服务器忙请重试"或类似的提示

StockController类中@SentinelResource注解中,可以定义处理限流情况的方法

``java
@PostMapping("/reduce/count")
@ApiOperation("减少商品库存数")
// SentinelResource注解标记的控制器方法,会被Sentinel管理
// 在这个方法第一次运行后,可以在sentinel仪表台界面中设置限流规则
// "减少库存的方法"设置当前方法在仪表台中显示的名称
// blockHandler 指定请求被限流时运行的方法名称
@SentinelResource(value = "减少库存的方法",blockHandler = "blockError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    // 调用业务逻辑层
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}

// Sentinel 自定义限流方法的定义
// 1.访问修饰符必须是public
// 2.返回值类型必须和限流的控制器方法一致
// 3.方法名称必须是限流注解中定义的blockHandler指定的方法名称
// 4.方法参数列表必须和限流的控制器方法一致,而且还要添加一个BlockException类型的参数
public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO, BlockException e){
    // 限流方法一般直接返回限流信息即可
    return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器忙,请稍后再试");
}

QPS与并发线程数

QPS:是每秒请求数

单纯的限制在一秒内有多少个请求访问控制器方法

并发线程数:是当前正在使用服务器资源请求线程的数量

限制的是使用当前服务器的线程数

自定义降级方法

所谓降级就是正常运行控制器方法的过程中

控制器方法发生了异常,Sentinel支持我们运行别的方法来处理异常,或运行别的业务流程处理

我们也学习过处理控制器异常的统一异常处理类,和我们的降级处理有类似的地方

但是Sentinel降级方法优先级高,而且针对单一控制器方法编写

StockController类中@SentinelResource注解中,可以定义处理降级情况的方法

`java
@PostMapping("/reduce/count")
@ApiOperation("减少商品库存数")
// SentinelResource注解标记的控制器方法,会被Sentinel管理
// 在这个方法第一次运行后,可以在sentinel仪表台界面中设置限流规则
// "减少库存的方法"设置当前方法在仪表台中显示的名称
// blockHandler 指定请求被限流时运行的方法名称
// fallback 指定控制器方法发生异常时,要执行的降级方法名称
@SentinelResource(value = "减少库存的方法",blockHandler = "blockError",
                    fallback = "fallbackError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO) {
    if(Math.random()<0.5){
        throw new CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,
                                                "抛出随机异常!");
    }
    // 调用业务逻辑层
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}

// Sentinel 自定义限流方法的定义
// 1.访问修饰符必须是public
// 2.返回值类型必须和限流的控制器方法一致
// 3.方法名称必须是限流注解中定义的blockHandler指定的方法名称
// 4.方法参数列表必须和限流的控制器方法一致,而且还要添加一个BlockException类型的参数
public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO, BlockException e){
    // 限流方法一般直接返回限流信息即可
    return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器忙,请稍后再试");
}

// 这个方法是Sentinel注解中fallback指定的降级方法
// 当原定运行的控制器方法发送异常时,Sentinel会运行下面的方法
// 降级方法中,可以编写一些对正常逻辑的补救措施,使用户受到的损失最少
public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
    return JsonResult.failed(ResponseCode.BAD_REQUEST,"因为运行时发生异常,服务降级");
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:56:31  更:2022-09-04 01:00:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:24:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码