这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
使用Sentinel Dashboard 实现流控配置
在Sentinel Dashboard 配置流控规则,可实现流量控制的动态配置,步骤如下:
- 启动Sentinel Dashboard服务端
- 在application.yml中添加配置如下:
spring:
application:
name: spring-cloud-sentinel
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
复制代码
spring.cloud.sentinel.transport.dashboard配置为Sentinel Dashboard服务端地址,用于实现流量控制监控和流量控制规则的分发。
定义一个需要限流REST接口,代码如下:
@RestController
@RequestMapping("/sentinel")
public class SentinelController {
@GetMapping("limit")
public String limit(){
return "Sentinel DashBoard Flow Limit";
}
}
复制代码
不需要添加任何资源埋点,在默认情况下Sentinel 会对所有请求进行限流。
访问对应接口,因为没有配置流控规则,所以没被Sentinel限流
进入Sentinel Dashboard实现流控规则配置,步骤如下:
- 启动Sentinel-Dashboard-1.3.0.jar
- 访问http://127.0.0.1:8888,进入Sentinel Dashboard配置流控规则
- 进入spring.application.name对应的菜单,访问【簇点链路,在这列表中可看到/limit接口的资源名称。
- 对于/limit资源名称,可点击【流控】按钮设置对应流控规则
新增规则中所有配置信息,其实就是FlowRole中对应的属性设置,测试效果将单机阈值设置为1
新增完成后,再次访问http://127.0.0.1:8080/sentinel/limit接口,当QPS大于1时,可查看到对应的限流效果
Blocked By Sentinel(flow limiting)
复制代码
自定义URL限流异常
在默认情况下,URL触发限流会直接返回
Blocked By Sentinel(flow limiting)
复制代码
在实际情况下,大多数采用JSON格式的数据,所以在触发限流返回json格式数据,可以通过自定义限流异常来修改,实现UrlBlockHandler并且重写blocked方法。
@Service
public class CustomUrlBlockHandler implements UrlBlockHandler{
@Override
public void blocked(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,BlockException e) throws IOException{
httpServletResponse.setHeader("Content-Type","application/json;charset=UTF-8");
String msg="请求数超过最大数,请稍后再试!";
httpServletResponse.getWirter().write(msg);
}
}
复制代码
还有一种情况是,当触发限流后,直接跳转到对应降级页面,可以通过添加如下配置实现
spring:
cloud:
sentinel:
serlvet:
block-page: 降级页面url地址
复制代码