引入Sentinel pom
<!--Sentinel-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在接口上加上SentinelResource注解
在配置文件中添加sentinel的服务端地址
server:
port: 8020
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: 192.168.2.6:8001
group: DEFAULT_GROUP
prefix: order-service
file-extension: yaml
namespace: 9bb83945-f4a3-4839-8d3b-363f1b78db36
discovery:
server-addr: 192.168.2.6:8001
sentinel:
transport:
# sentinel服务端地址
dashboard: 192.168.2.6:8858
# 取消延迟加载
eager: true
Sentinel限流配置
此处的资源名就是@SentinelResource注解中的value值
Jmeter测试
- 添加线程组
- 添加HTTP请求
- 添加HTTP信息头管理器
- 添加响应断言
- 添加查看结果树
- 添加聚合报告
点击查看“察看结果树”
发现只有前10个请求是成功的,后面90个请求是失败的,此时就说明限流已经成功了。
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dhbmdfbHVv,size_16,color_FFFFFF,t_70#pic_center)
自定义异常
我们发现当请求失败返回的数据结果并非定义的ResultData数据结果,此时可以自定义异常,通过 @SentinelResource(value = “getByOrderNo”,blockHandler = “dealException”),中添加blockHandler参数,给其添加自定义异常方法。如:
@GetMapping("/order/getByOrderNo/{orderNo}")
@SentinelResource(value = "getByOrderNo",blockHandler = "dealException")
public ResultData<Order> getByOrderNo(@PathVariable(value = "orderNo") String orderNo){
log.info("get order detail,orderNo is :{}",orderNo);
QueryWrapper<Order> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("order_no",orderNo);
Order order = orderService.getOne(objectQueryWrapper);
return ResultData.ok(order);
}
public ResultData<Order> dealException(String orderNo, BlockException exception){
return ResultData.fail("访问达到阈值了,不要再访问了!");
}
再次运行测试,发现所有请求都是成功的,当超过阈值的是返回我们自定义异常的信息