【Sentinel系列】Sentinel DashBoard 实现流控动态配置

944 阅读2分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

使用Sentinel Dashboard 实现流控配置

在Sentinel Dashboard 配置流控规则,可实现流量控制的动态配置,步骤如下:

  1. 启动Sentinel Dashboard服务端
  2. 在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实现流控规则配置,步骤如下:

  1. 启动Sentinel-Dashboard-1.3.0.jar
  2. 访问http://127.0.0.1:8888,进入Sentinel Dashboard配置流控规则
  3. 进入spring.application.name对应的菜单,访问【簇点链路,在这列表中可看到/limit接口的资源名称。
  4. 对于/limit资源名称,可点击【流控】按钮设置对应流控规则

image-20211120180008870.png

image-20211120180041355.png

新增规则中所有配置信息,其实就是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地址