一、背景
由于业务中部分请求的瞬时请求量过大,容易产生系统崩溃的风险,因此采用sentinel的流量控制对业务中的大规模请求量进行流量限制。
二、sentinel简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
(一)sentinel基本概念
1.资源资源是 Sentinel的关键概念。它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其他应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API定义的代码,就是 资源,能够被 Sentinel保护起来。大部分情况下,可以 使用方法签名、URL甚至是服务名称作为资源名来标示资源。2.规则
规则指的是围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
(二)sentinel的功能设计理念
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。在网络传输中,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
![]()
三、项目集成
1.项目情况
项目框架:springboot
sentinel版本:1.8.0
2.sentinel流控下载地址
github地址:https://github.com/alibaba/Sentinel
Sentinel文档:https://github.com/alibaba/Sentinel/wiki
3.核心依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.1.1.RELEASE</version> </dependency>
1.sentinel配置类
@Configuration
@ConditionalOnProperty(value = "cncc.sentinel.enable", havingValue = "true")
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
2.url触发的自定流控规则处理函数
@Service
public class CustomUrlBlockHandler implements UrlBlockHandler {
/**
* 可以自定义该函数,当触发流控时,自定义所要返回给调用方的返回结果
* @param httpServletRequest
* @param httpServletResponse
* @param e
* @throws IOException
*/
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
BlockException e) throws IOException {
httpServletResponse.setHeader("Content-Type","application/json;charset=UTF-8");
Map, Object> map = new HashMap<>();
map.put("ResultCode", "4005");
map.put("ResultDesc", "流量限制,降级处理");
map.put("SendTime", LocalDateTime.now());
httpServletResponse.getWriter().write(JSON.toJSONString(map));
}
}
3.配置文件中的sentinel相关配置
#sentinel相关配置
#是否启用sentinel流控
cncc.sentinel.enable=false
#本地客户端名称
spring.application.name=Sentinel
#连接的控制台ip和端口
spring.cloud.sentinel.transport.dashboard=127.0.0.1:32030
#本地客户端的连接端口
spring.cloud.sentinel.transport.port=32009
#本地客户端的连接ip
spring.cloud.sentinel.transport.client-ip=127.0.0.1
#关闭默认实现
spring.cloud.sentinel.filter.enabled=false
#关闭控制台的懒加载
spring.cloud.sentinel.eager=true
#设置客户端和控制台的心跳检测延时时间
spring.cloud.sentinel.transport.heartbeat-interval-ms=6000
五.可视化界面sentinel控制台
首先单独启动名为sentinel-dashboard的项目,该项目是sentinel的流量控制台,也是sentinel的图形化界面。
1.启动客户端
启动客户端,然后触发客户端的初始化,也就是需要客户端有一定的访问量,sentinel会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,或者可以在客户端配置参数,取消控制台的懒加载,则客服端无需触发访问即可连上控制台。
2.流量监控
3.簇点链路
4.流控规则
就会跳出如下弹窗:
具体字段含义如下:
并发线程数:并发线程数限流用于保护业务线程数不被耗尽。
QPS:当QPS超过某个阈值的时候,则采取措施进行流量控制。
一条限流规则主要由下面几个因素组成,可以组合这些元素来实现不同的限流效果:
resource:资源名,即限流规则的作用对象
count:限流阈值
grade:限流阈值类型(QPS或并发线程数)
limitApp:流控针对的调用来源,若为default则不区分调用来源
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。
Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
同一个资源可以同时有多个限流规则,检查规则时会依次检查。
点击确认,设置成功
这个时候当你瞬时访问量超过你的限流阈值时,就会限制该访问请求,自动调用流控规则处理函数,返回处理结果。