Sentinel(Spring Cloud)持续完善....

1.什么是Sentinel

Sentinel也是Spring Cloud Alibaba的组件

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

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

官网地址

https://sentinelguard.io/zh-cn/
在这里插入图片描述

下载地址

https://github.com/alibaba/Sentinel/releases

2.为什么需要Sentinel

  • 丰富的应用场景
    双11,秒杀,12306抢火车票

  • 完备的实时状态监控
    可以支持显示当前项目各个服务的运行和压力状态,分析出每台服务器处理的秒级别的数据

  • 广泛的开源生态
    很多技术可以和Sentinel进行整合,SpringCloud,Dubbo,而且依赖少配置简单

  • 完善的SPI扩展
    Sentinel支持程序设置各种自定义的规则

3.基本配置和限流效果

添加pom依赖如下

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

yml修改配置如下:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080 # 配置Sentinel仪表台的位置
        port: 8721 # 真正执行限流的端口也要设置一下,注意这个端口其他微服务项目不能相同

sentinel.transport.port每个微服务项目不能相同

下面进行限流操作

Sentinel限流针对控制层方法也就是说

我们要到Controller类中的方法上去做设置
此处以small-stock-webapi模块为例:

@PostMapping("/reduce/count")
@ApiOperation("减少商品库存业务")
// @SentinelResource标记的方法会被Sentinel监控
// ()里面的内容是这个监控的名称,我们可以在"仪表台"中看到
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
@SentinelResource("减少库存方法(控制器)")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}

以上就是使用Sentinel实现QPS或并发线程数进行流控的操作

4.流控与降级

此时被流控的请求只有一个错误,没有错误提示,不方便给用户反馈

我们应该在开发时,对于被流控的请求给与相关提示

在控制器StockController中编写代码如下:

@Autowired
private IStockService stockService;
@PostMapping("/reduce/count")
@ApiOperation("减少商品库存业务")
// @SentinelResource标记的方法会被Sentinel监控
// value的值是这个监控的名称,我们可以在"仪表台"中看到
// blockHandler的值指定了请求被限流时运行的方法名称
@SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}
// Sentinel 限流方法应该满足如下要求
// 1.必须是public修改
// 2.返回值类型必须和控制方法一致(JsonResult)
// 3.方法名称要和控制器方法限流注解中规定的名称一致(blockError)
// 4.参数列表必须和控制器一致,可以在所以参数后声明BlockException来获得限流异常
public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
                             BlockException e){
    return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器忙,请稍后再试");
}

上面方法定义了被Sentinel限流时运行的方法

下面是Sentinel的降级功能

和我们之前学习的统一异常处理类有相似的地方

@PostMapping("/reduce/count")
@ApiOperation("减少商品库存业务")
// @SentinelResource标记的方法会被Sentinel监控
// value的值是这个监控的名称,我们可以在"仪表台"中看到
// blockHandler的值指定了请求被限流时运行的方法名称
@SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError",
                    fallback = "fallbackError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    // 生成随机出触发降级流程
    if(Math.random()<0.5){
        throw new 
        SimpleMallServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"异常");
    }
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("商品库存减少完成!");
}
// 这个方法是Sentinel注解中fallback属性指定的降级方法
// 当前控制器方法运行发生异常时,Sentinel会运行下面的降级方法
// 降级方法中,可以不直接结束请求,而去运行一些代替代码或者补救措施
// 让用户获得最低限度的响应
public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
    return JsonResult.failed(ResponseCode.BAD_REQUEST,"因为运行异常,服务降级");
}
说明:

blockHandler和fallback的区别

  • 两者都是不能正常调用资源返回值的顶替处理逻辑.

  • blockHander只能处理BlockException 流控限制之后的逻辑.

  • fallback处理的是资源调用异常的降级逻辑.

5.启动

双击组件内的 start-sentinel.bat 文件即可
在这里插入图片描述
打开上文设置的仪表台端口,查看
在这里插入图片描述
用户密码都是 sentinel
在这里插入图片描述
点击登录后
在这里插入图片描述
sentinel仪表台显示的是被监控的服务,当服务没有发生时是看不到东西的
此处我以stock模块的控制层作测试,故需在控制层模拟运行一次业务-----减少库存业务
在这里插入图片描述

此时再打开sentinel仪表台,可以看到左侧边栏已经出现了 nacos-stock-webapi 服务的各种功能选项,然后点击’‘簇点链路’'选项找到"减少库存方法(控制器)“:
在这里插入图片描述
点击右侧的”+流控"选项:
在这里插入图片描述
在这里插入图片描述
此时可以设置流控规则了,这里的"阈值类型"有两个选项:

  • QPS
    Request Pr Second 每秒请求数
  • 并发线程数
    此业务同时允许多少条线程运行

QPS: 此处为了使测试效果明显,我先选择QPS选项,单机阈值我设为1,也就是说规定的每秒请求数量最大为1,超过阈值便会触发 sentinel 的限流,设置好后点击"新增",这样一个新的流控规则就建立好了
在这里插入图片描述
此时就可以回到stock的测试模块进行测试了,具体操作就是疯狂的点击"减少库存业务"的测试,当请求频率大于1个每秒时就会触发限流了,
在这里插入图片描述
并发线程数: 再测试并发线程数选项,
设置业务同时允许最多1条线程运行
在这里插入图片描述
设置后新增的流控规则:
在这里插入图片描述
可以先疯狂点击执行业务测试一下,效果不明显,因为线程的处理时间在毫秒级别,我点击发送请求的速度肯定达不到这个级别:
在这里插入图片描述
所以可以延长业务的执行时间(加延迟方法),然后用两个浏览器短时间内切换发送请求,可以看到效果:

 stockService.reduceCommodityCount(stockReduceCountDTO);
        // 加入延迟方法,延长业务运行时间至5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return JsonResult.ok("商品库存减少完成!");

火狐浏览器发出的请求:
在这里插入图片描述
等了大概5秒出现正常结果
谷歌浏览器发送的请求:
在这里插入图片描述
立马就显示了报错信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值