6.资源限流
6.1.修改程序
6.1.1.在Controller中增加下列代码
java
@Autowired
private TestService testService;
@RequestMapping("/callService")
public String callService(){
return testService.testMethod();
}
6.1.2.增加service接口及接口实现类
java
package com.yuan.scasentineldashboard.service;
public interface TestService {
String testMethod();
}
java
package com.yuan.scasentineldashboard.service.impl;
import com.yuan.scasentineldashboard.service.TestService;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Override
public String testMethod() {
return "这是service中的方法";
}
}
6.1.3.测试
浏览器访问 http://localhost:9000/sentinelTest/callService
6.2.pom.xml 增加 依赖
增加依赖以支持资源限流的注解
xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
</dependency>
6.3.修改方法
在serviceImpl中增加 @SentinelResource注解,就可以实现对该方法的限流
java
@Override
@SentinelResource(value = "testMethod")
public String testMethod() {
return "这是service中的方法";
}
6.4.Sentinel 监听
查看 Sentinel Dashboard 可以看到
6.5.修改限流配置
json
[
{
"resource": "/sentinelTest/sayHello",
"limitApp": "default",
"grade": 1,
"count": 3
},
{
"resource": "/sentinelTest/callService",
"limitApp": "default",
"grade": 1,
"count": 3
},
{
"resource": "testMethod",
"limitApp": "default",
"grade": 1,
"count": 2
}
]
6.6.查看 sentinel 流控规则
6.7.测试
1秒内 连续请求 3次, 触发方法限流后抛出了异常
1秒内 连续请求4次, 触发请求限流
6.8.实现方法的限流
通过刚才的例子,我们看到方法已经成功被限流了,但是限流后直接抛出了异常, 实际开发中,我们不希望展示一个生硬的报错,我们希望限流后能自定义一些处理方式。我们可修改@SentinelResource注解的参数来达到目的,
注意:处理的方法需要与被限流的方法保持参数相同,并在最后加上BlockException异常参数,同时返回类型必须相同。
6.8.1.修改serviceImpl 类
java
package com.yuan.scasentineldashboard.service.impl;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.yuan.scasentineldashboard.service.TestService;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Override
@SentinelResource(value = "testMethod", blockHandler = "blockMethod")
public String testMethod(String a) {
return "这是service中的方法";
}
public String blockMethod(String a, BlockException e){
return "方法被限流了";
}
}
6.8.2.测试效果
1秒内 连续请求 3次, 触发方法限流后执行限流方法