Spring Cloud Alibaba 之 Sentinel

简介: 在启动项目时又报错了,然后使用原本能行的9001项目启动一下,还是不行,看来nacos又抽风了,搞这玩意已经报了不知道多少错了,这次的解决方法参考:https://blog.csdn.net/qq_39540631/article/details/111105497方法就是删除nacos目录下的data文件夹,值得注意的是,每次启动前都要去删除一下,否则每次都报错。

Spring Cloud Alibaba 之 Sentinel


Hystrix的一些对比:

7e25697d1d93a2239c1bb0fce0449b7a.png


Sentinel能做些什么:3864c89f8a48c09bb7c33582d60f6e7a.png


下载与运行

下载地址

运行jar包即可,然后访问http://localhost:8080/#/login ,默认账户密码均为sentinel,登录成功后

1229ad11ccc5a1b6a4a313019b3f5a6f.png


初始化演示工程

先启动nacos和sentinel,然后创建8401项目,先在pom添加:

<!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>


编写yml:

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719 #指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: '*'
feign:
  sentinel:
    enabled: true # 激活Sentinel对Feign的支持


接下来写几个接口进行测试。


在启动项目时又报错了,然后使用原本能行的9001项目启动一下,还是不行,看来nacos又抽风了,搞这玩意已经报了不知道多少错了,这次的解决方法参考:https://blog.csdn.net/qq_39540631/article/details/111105497

方法就是删除nacos目录下的data文件夹,值得注意的是,每次启动前都要去删除一下,否则每次都报错。


在启动后,因为sentinel是懒加载的,需要去请求下接口控制台这边才能更新,请求之后:

d7ddb8a1e7debbe1ce7b87186d4f14e2.png


接下来开始逐个讲解相关功能。


流控规则

e98d76073afef9f8ca4bc60619f12b29.png


下面进行接口testA的流控,QPS类型表示1秒内最多处理2次请求,超过的直接报错;线程数类型表示执行请求的线程数量,意思就是请求都能进来,但是处理的线程就设置的阈值那么多,如果处理不过来就直接报错。

17fd7225ed6baade76dcf91abd8980d8.png


访问testA接口进行测试,快速刷新几次就可以发现接口异常了:

c4f46dea7baca1d9390e5da4690ebad6.png


接下来讲讲关联模式,关联模式就是,当关联资源/testB接口访问超过阈值限制时,限制/testA接口,举个例子:当支付接口(/testB)访问流量过大时,限制下订单的接口(/testA),这样就能使支付接口(testB)压力减小。

7e19ed81cc0d4b9361a3e3826c80c49b.png


流控效果的Warm Up适合用于秒杀系统类场景,排队等待就是设置一个超时时间,超过则失败,否则就能被处理。


降级规则

2ec218639d93d2d0abbc5db6a2d53cb6.png


1 RT,即平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.


2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求大于等于5时,当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。


3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。


热点规则

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

●  商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制

●  用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2)
    {
        //int age = 10/0;
        return "------testHotKey";
    }
    public String deal_testHotKey (String p1, String p2, BlockException exception)
    {
        return "------deal_testHotKey,o(╥﹏╥)o";  //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
    }


说得简单一点就是根据传入的参数去判断是否需要限制,需要注意的是blockHandler必须配置,否则是报500而不是Blocked by Sentinel (flow limiting)。

ed802e60183550ace98207074b5825db.png


接下来看看高级选项:

0c4efab1ae06b73437a986d8d6416878.png


上面配置的意思就是如果刚刚配置的那个参数等于666,则限流阈值改为6,意思就是一秒能处理6个请求。访问 http://localhost:8401/testHotKey?p1=666 时就能一秒内刷6次都不会报错。


@SentinelResource

这个注解前面也用到了一次,在规则配置里的资源名如果有斜杠就代表是url匹配(如/byResource匹配@GetMapping("/byResource")),否则就是匹配资源名(需要配置@SentinelResource(value = “byResource”),它还有个参数blockHandler,这是兜底方法,用于处理当触发到配置的各种规则时执行的方法(不处理业务内的异常,异常用fallback,和这个基本差不多,用到就会),上边也用到过了,但是又出现了代码耦合问题,如果每个方法都单独配置,那就非常臃肿了,所以需要单独写个类进行统一处理:

public class CustomerBlockHandler
{
    public static CommonResult handlerException(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定义,global handlerException----1");
    }
    public static CommonResult handlerException2(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定义,global handlerException----2");
    }
}


然后在配置一下注解:

@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
        blockHandlerClass = CustomerBlockHandler.class,
        blockHandler = "handlerException2")
public CommonResult customerBlockHandler()
{
    return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));
}


用哪个类的哪个方法进行处理,相信一看就懂了。


持久化配置

在上面项目测试中,发现每次项目重启后,配置的规则都被清空了,所以需要进行持久化配置,相关依赖在一开始也导入了,上边有注释,下面直接开干:首先yml文件,主要是持久化那段配置:

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719 #指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
        #持久化配置,让nacos存储规则实现持久化
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service #当前微服务名称(在nacos那边新建配置一定也要一样)
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: '*'
feign:
  sentinel:
    enabled: true # 激活Sentinel对Feign的支持


然后在nacos页面新建配置,Data ID为上面的微服务名,配置内容:

[
    {
              "resource": "/rateLimit/byUrl",
              "limitApp": "default",
              "grade": 1,
              "count": 1,
              "strategy": 0,
              "controlBehavior": 0,
              "clusterMode": false
    }
]


resource:资源名称;

limitApp:来源应用;

grade:阈值类型,0表示线程数,1表示QPS;

count:单机阈值;

strategy:流控模式,0表示直接,1表示关联,2表示链路;

controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;

clusterMode:是否集群。

根据上面的解释可以看出其实和在sentinel的页面配置内容一样的,只是换成了手写代码,以上配置意思就是那个接口的qps不能超过1次。

在配置完后,启动项目,然后访问下接口,看看sentinel会不会有规则出现,我这里出现了nacos配置刷新后都消失了的情况(甚至一直看不到注册的服务,虽然确实注册进去了,因为能用),退出后重新新建就好了,服务列表啥的也能看到了。

持久化就是把配置规则给nacos管理,nacos又是存在数据库的(第三条就是失败的那个,不知道是不是冒号后没接空格导致失败的,反正第四条是添了空格才配置好的):

54cd1e73fc372bb021a1f053a42fb35e.png


到这里大概就会了sentinel的基本使用,更多的操作实战时再深入研究吧。😀(_)

目录
相关文章
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
85 1
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
126 1
|
19天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
129 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
|
1月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
26天前
|
消息中间件 自然语言处理 Java
知识科普:Spring Cloud Alibaba基本介绍
知识科普:Spring Cloud Alibaba基本介绍
59 2
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
1月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
阿里云开源 Spring AI Alibaba,旨在帮助 Java 开发者快速构建 AI 应用,共同构建物理新世界。

热门文章

最新文章