创建项目空白 maven
修改项目的pom.xml为下面
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jx.service</groupId>
<artifactId>jx-service</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<alibaba.version>0.9.0.RELEASE</alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${alibaba.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在bootstrap.yml中增加Sentinel的数据源设置
spring:
application:
name: jx-service
cloud:
nacos:
config:
server-addr: 192.168.0.2:8848
discovery:
server-addr: 192.168.0.2:8848
sentinel:
eager: true
transport:
dashboard: 192.168.0.2:8080
datasource:
ds1:
nacos:
server-addr: 192.168.0.2:8848
dataId: ${spring.application.name}-flow-rules
data-type: json
rule-type: flow
修改application.yml
server:
port: 8082
Nacos
下载Nacos:https://nacos.io/en-us/
win下启动:\nacos\bin目录下点击startup.cmd启动
访问:http://127.0.0.1:8848/nacos/ 默认账号密码均为:nacos
Data ID:jx-service-flow-rules
配置内容
[
{
"resource": "jx-resource",
"controlBehavior": 2,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
修改Controller
package com.jx.payment.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.jx.payment.domain.Balance;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RefreshScope
public class JxDemoController {
@RequestMapping("/demo")
@SentinelResource(value = "jx-resource", blockHandler = "handleBlock")
public Balance getBalance() {
return new Balance(0, 0, 0, "不存在");
}
public Balance handleBlock(Integer id, BlockException e) {
return new Balance(0, 0, 0, "限流");
}
}
在限流设置中,grade=1表示基于QPS/并发数做流量控制,count=1表示阈值为1,即QPS超过1触发。controlBehavior=0表示处理策略是直接拒绝。
重启jx-service,在浏览器中打开http://localhost:8082/demo并迅速刷新,可以看到一部分的请求返回数据为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 -jar sentinel-dashboard.jar
由于上面已经改过yml所以不用再次修改
在Sentinel控制台中可以看到相关信息