Sentinel流控的集成和简单应用

一、背景

由于业务中部分请求的瞬时请求量过大,容易产生系统崩溃的风险,因此采用sentinel的流量控制对业务中的大规模请求量进行流量限制。
 

二、sentinel简介

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
 
(一)sentinel基本概念
1.资源
资源Sentinel的关键概念。它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其他应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API定义的代码,就是 资源,能够被 Sentinel保护起来。大部分情况下,可以 使用方法签名、URL甚至是服务名称作为资源名来标示资源
 

2.规则

规则指的是围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

 

(二)sentinel的功能设计理念

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。在网络传输中,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。

 

 

三、项目集成

 
1.项目情况

项目框架:springboot

sentinel版本:1.8.0

 

2.sentinel流控下载地址

 

3.核心依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

 

四、sentinel的简单配置
 
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 UpRuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

 

匀速排队RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

同一个资源可以同时有多个限流规则,检查规则时会依次检查。

 

点击确认,设置成功

这个时候当你瞬时访问量超过你的限流阈值时,就会限制该访问请求,自动调用流控规则处理函数,返回处理结果。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值