007-spring cloud alibaba之Sentinel限流

sentinel环境搭建

sentinel-dashboard搭建

限流中间件。启动默认接口8080

  • 启动命令:java -jar sentinel-dashboard-1.8.2.jar
  • 访问地址:localhost:8080
  • 访问密码:sentinel/sentinel 如果端口占用,可以在启动命令中增加端口:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

应用接入sentinel

增加依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

增加配置

yaml 复制代码
server:
  port: 9001

spring:
  application:
    name: user
  cloud:
    discovery:
      server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8720
management:
  endpoint:
    web:
      exposure:
        include:'*'

流控

簇点链路->选择需要流控的接口->+流控

  • 资源名:路径,eg:/hello
  • 针对来源:default,默认
  • 阈值类型:QPS/并发线程数。
    • QPS:一秒内请求路径次数
    • 并发线程数:线程数
  • 单机阈值:次数
  • 流控模式:
    • 直接:API达到限流条件时,直接限流
    • 关联:当关联的资源达到阈值时,就限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)(API级别的针对来源)
  • 流控效果:
    • 快速失败:直接失败,抛异常
    • Wam Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFacotor,经过预热时长,才达到设置的QPS阈值
    • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

流控模式:直接/关联

这两种流控比较简单。直接就是当达到阈值,当前接口不能访问。关联是关联的资源达到阈值就限流自己。举一个关联的例子:下单和支付的关系。下单资源:/createOrder;支付资源:/payOrder。如果要配置关联可以在/payOrder配置一个关联/createOrder的限流。当/createOrder到达阈值,限制/payOrder的接口访问。

流控模式:链路

链路是比较细粒度的限流模式。比如接口A需要调用接口B,接口C需要调用接口B,我们将接口B做为资源。然后配置接口A限流,限流的方式是链路。那么当到达接口B的限流上限,接口A就无法访问,但是接口C还可以继续访问不受影响。

graph TD 接口A --> 接口B 接口C --> 接口B
接口B

定义资源使用@SentinelResource

java 复制代码
@Service
public class UserService {

    @SentinelResource("userName")
    public String getUserName(){
        return "sentinel";
    }
}
调用接口B
java 复制代码
@ApiOperation("s1")
@GetMapping("/s1")
public String s1(HttpServletRequest request){
    System.out.println("s1");
    String user = userService.getUserName();
    return "hello s1 "+user+" ...9001";
}
调用接口A
less 复制代码
@ApiOperation("s2")
@GetMapping("/s2")
public String s2(HttpServletRequest request){
    System.out.println("s2");
    String user = userService.getUserName();
    return "hello s2"+user+" ...9001";
}
增加配置

新增:web-context-unify: false

yaml 复制代码
server:
  port: 9001

spring:
  application:
    name: user
  cloud:
    discovery:
      server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8720
      web-context-unify: false
management:
  endpoint:
    web:
      exposure:
        include:'*'

swagger:
  enabled: true
sentinel注册信息
验证

被拒绝的请求如下:

流控效果:Warm Up

Warm Up使用场景:预热/冷启动方式。该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。

相关推荐
文慧的科技江湖5 小时前
光储充协同的终极闭环:用SpringCloud微服务打造“发-储-充-用“智能能源网络 - 慧知开源充电桩管理平台
java·开发语言·spring cloud·微服务·能源·充电桩开源平台·慧知重卡开源充电桩平台
星河耀银海6 小时前
云原生核心特性:容器化、微服务与DevOps的通俗解读
微服务·云原生·devops
indexsunny7 小时前
互联网大厂Java面试实战:从Spring Boot到微服务架构的技术问答
java·spring boot·redis·微服务·面试·kafka·spring security
renhongxia18 小时前
多机器人任务分配的事件触发自适应共识
人工智能·微服务·语言模型·机器人·prompt
yuanlaile1 天前
从入门到部署|2026年Koa全栈开发实战:覆盖Node.js、数据库、部署与云架构全链路
微服务·云原生·kubernetes·node.js·serverless·nodejs全栈开发
喵个咪1 天前
go-wind-cms 微服务架构设计:为什么基于 Kratos?
后端·微服务·cms
阿里云云原生1 天前
阿里云微服务引擎 MSE 及 API 网关 2026 年 3 月产品动态
微服务
却话巴山夜雨时i2 天前
互联网大厂Java面试:从Spring到微服务的全栈挑战
java·spring boot·redis·微服务·面试·kafka·技术栈
人间打气筒(Ada)2 天前
「码动四季·开源同行」go语言:微服务网关如何作为服务端统一入口点?
微服务·golang·开源·微服务网关·go实战