Spring Cloud Alibaba实战(三) - Sentinel之限流

目录

(一)Nacos动态配置
(二)Nacos注册中心
(三)Sentinel之限流
(四)Sentinel之熔断
(五)Gateway之路由、限流
(六)Gateway之鉴权、日志
(七)Gateway搭配Nacos实现动态路由
(八)Dubbo + Nacos

正文

考虑充值是一项重要的功能,通常不希望因为查询余额接口调用过于频繁而导致充值功能不可用,现在引入Sentinel对payment-service服务的/balance接口做限流保护。

在上一节payment-service代码上增加依赖:

        
            org.springframework.cloud
            spring-cloud-starter-alibaba-sentinel
            ${alibaba.version}
        

        
            com.alibaba.csp
            sentinel-datasource-nacos
            1.6.0
        

在bootstrap.yml中增加Sentinel的数据源设置:

spring:
  application:
    name: payment-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: ${spring.application.name}-flow-rules
            data-type: json
            rule-type: flow

其中,数据源名称ds1任意设置即可。这里使用Nacos作为数据源,所以名称的下一级属性设置为nacos。

接下来按dataId在Nacos中创建配置

dataId:payment-service-flow-rules
格式:JSON
内容:

[
  {
    "resource": "protected-resource",
    "controlBehavior": 2,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

截图示例: 

Spring Cloud Alibaba实战(三) - Sentinel之限流_第1张图片

修改PaymentController

在getBalance方法上增加注解:

@SentinelResource(value = "protected-resource", blockHandler = "handleBlock")

添加一个handleBlock方法,要求参数与getBalance保持一致,并且在最后增加一个BlockException参数

    public Balance handleBlock(Integer id, BlockException e) {
        return new Balance(0, 0, 0, "限流");
    }

在限流设置中,grade=1表示基于QPS/并发数做流量控制,count=1表示阈值为1,即QPS超过1触发。controlBehavior=0表示处理策略是直接拒绝。

重启payment-service,在浏览器中打开http://localhost:8082/pay/balance?id=1并迅速刷新,可以看到一部分的请求返回数据为handleBlock方法的返回值。

在Nacos中把count值改为1000,继续快速刷新浏览器,可以观察到不会再触发限流。

限流设置的主要参数:

参数 含义 选项
grade

限流阈值类型

0 基于线程数

1 基于QPS

count 限流阈值  
controlBehavior QPS流量控制中对超过阈值的流量处理手段

0 直接拒绝

1 Warm Up

2 匀速排队

strategy 调用关系限流策略

0 根据调用方限流(limitApp)

1 根据调用链路入口限流

2 具有关系的资源流量控制

limitApp 调用来源 default 不区分调用者
{some_origin_name} 针对特定的调用者
other 针对除 {some_origin_name} 以外的其余调用方

 

 

 

 

 

 

 

 

 

 

 

匀速排队模式演示:

把controlBehavior设置为2,即匀速排队模式,同时增加一个参数maxQueueingTimeMs值为20000。再次快速刷新浏览器观察影响。

Sentinel控制台

Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。

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

启动
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

使用
http://localhost:8080/
(用户名和密码都是sentinel)

修改payment-service的bootstrap.yml

spring:
  application:
    name: payment-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel:
      eager: true
      transport:
        dashboard: localhost:8080
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: ${spring.application.name}-flow-rules
            data-type: json
            rule-type: flow

重启应用后在Sentinel控制台中可以看到相关信息

Spring Cloud Alibaba实战(三) - Sentinel之限流_第2张图片

示例源码

链接:https://pan.baidu.com/s/1_oo1-yY0Jb-aC3hBoozk-w 
提取码:4uw7 
 

你可能感兴趣的:(Spring,Cloud)