高并发、大流量的场景下有效的对流量进行管控

一、Sentinel核心功能

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。所以,Sentinel的核心功能包括:流量控制、熔断降级、系统负载保护。

1.流量控制

在高并发、大流量场景下,进入系统的流量如果不加控制的话,系统就很有可能会被流量压垮。所以,在流量正式进入系统之前,需要对流量进行控制,以便使流量均匀、可控的方式进入系统。

Sentinel作为一个非常出色的容错组件,能够将不可控的流量经过处理转化成均匀、可控的流量。

2.熔断降级

如果检测到系统中的某个调用链路中某个节点出现故障,比如请求超时、服务宕机或者异常比超出一定阈值时,就会对出现故障的节点的调用频率进行限制,甚至不调用出现故障的节点,让请求能够快速失败并返回,以最大程度避免影响到其他节点的服务而导致系统的级联故障。

Sentinel主要通过 限制并发线程数和响应时间 对资源的访问进行降级。

(1)限制并发线程数进行降级

Sentinel可以通过限制服务节点的并发线程数量,来减少对其他服务节点的影响。例如,当某个服务节点出现故障,响应时间变长,或者直接宕机。

此时,对服务的直接影响就是会造成请求线程数的不断堆积。如果这些堆积的线程数达到一定的数量后,对当前服务节点的后续请求就会被拒绝,等到堆积的线程完成任务后再开始继续接收新的请求。

(2)通过响应时间进行降级

Sentinel除了可以通过限制并发线程数进行降级外,也能够通过响应时间进行降级。如果依赖的服务出现响应时间过长的情况,则所有对该服务的请求都会被拒绝,直到过了指定的时间窗口之后才能再次访问该服务。

3.系统负载保护

Sentinel提供了系统维度的自适应保护能力。当系统的压力和负载比较高的时候,如果还持续让大量的请求进入系统,此时就有可能将系统压垮,进而导致系统宕机。

Sentinel会在集群环境下,将本应服务器A承载的流量转发到其他服务器上,比如转发到服务器B上。如果此时服务器B也处于高负载的状态,则Sentinel会提供相应的保护机制,让系统的入口流量和系统的整体负载达到平衡,让系统整体可用,并且能够最大限度的处理请求。

二、Sentinel核心规则

Sentinel的核心规则包括流控规则、熔断规则、热点规则、授权规则和系统规则,每种规则的配置方式不同。接下来,就详细介绍下Sentinel中的每种规则的作用与效果。

三、流控规则

Sentinel能够对流量进行控制,主要是监控应用的QPS流量或者并发线程数等指标,如果达到指定的阈值时,就会被流量进行控制,以避免服务被瞬时的高并发流量击垮,保证服务的高可靠性。

1.簇点链路规则

(1)点击簇点链路菜单,可以看到之前访问过的接口,如下所示。

(2)点击右侧的流控按钮,会弹出新增流控规则的提示框,如下所示。

这里,每个配置项的说明如下所示。

  • 资源名:资源的唯一名称,默认就是请求的接口路径,可以自行修改,但是要保证唯一。
  • 针对来源:具体针对某个微服务进行限流,默认值为default,表示不区分来源,全部限流。
  • 阈值类型:QPS表示通过QPS进行限流,并发线程数表示通过并发线程数限流。
  • 单机阈值:与阈值类型组合使用。如果阈值类型选择的是QPS,表示当调用接口的QPS达到阈值时,进行限流操作。如果阈值类型选择的是并发线程数,则表示当调用接口的并发线程数达到阈值时,进行限流操作。
  • 是否集群:选中则表示集群环境,不选中则表示非集群环境。

2.配置简单限流

这里,针对http://localhost:8080/order/test_sentinel接口进行简单的配置,在新增流控规则里阈值类型选择QPS,单机阈值输入3,表示每秒钟的请求量如果超过3,则会触发Sentinel的限流操作。

点击新增按钮后,会为http://localhost:8080/order/test_sentinel接口新增一条限流规则,如下所示。

接下来,在浏览器上快速刷新http://localhost:8080/order/test_sentinel接口,当每秒钟的刷新频率超过3次时,会出现如下所示的提示信息。

3.配置流控模式

点击http://localhost:8080/order/test_sentinel接口流控规则后面的编辑按钮,打开编辑流控规则弹出框(如果是首次配置的话,就是新增流控规则弹出框),点击高级选项配置。

会显示出如下所示的界面。

可以看到,Sentinel主要提供了三种流控模式,分别为直接、关联和链路。

  • 直接:默认的流控模式,当接口达到限流条件时,直接开启限流功能。
  • 关联:当关联的资源达到限流条件时,开启限流功能。
  • 链路:当从某个接口请求过来的资源达到限流条件时,开启限流功能。
演示直接流控模式

Sentinel默认就是使用的直接流控模式,我们之前在订单微服务中集成的就是Sentinel的直接流控模式,在本文的流控规则-配置简单限流中,也是使用的直接流控模式,这里不再赘述。

演示关联流控模式

(1)在订单微服务的io.binghe.shop.order.controller.OrderController 类中新增 /test_sentinel2接口,如下所示。

@GetMapping(value = "/test_sentinel2")
public String testSentinel2(){
    log.info("测试Sentinel2");
    return "sentinel2";
}

(2)在浏览器上访问下http://localhost:8080/order/test_sentinel2接口,以便使Sentinel检测到http://localhost:8080/order/test_sentinel2接口。

注意:如果想使用Sentinel对某个接口进行限流和降级等操作,一定要先访问下接口,使Sentinel检测出相应的接口,这里一定要注意,在后续的文章中,不再单独说明。

(3)回到为http://localhost:8080/order/test_sentinel接口配置流控规则的页面,如下所示。

(4)在流控模式中选择关联,在关联资源中输入/test_sentinel2,如下所示。

点击保存按钮保存配置。

(5)打开JMeter,对http://localhost:8080/order/test_sentinel2接口进行测试,使其每秒钟的访问次数大于3,JMeter的具体配置如下所示。

在线程组中配置每秒访问4次。

配置完毕后,使用JMeter开始访问http://localhost:8080/order/test_sentinel2接口。

(6)在浏览器上刷新http://localhost:8080/order/test_sentinel接口,发现已经触发了Sentinel的限流功能。

至此,关联流控模式演示完毕。

演示链路流控模式

(1)在订单微服务的io.binghe.shop.order.service包中新增SentinelService接口,用于测试流控模式,源码如下所示。

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试Sentinel
 */
public interface SentinelService {

    /**
     * 测试方法
     */
    void sendMessage();
}

(2)在订单微服务的io.binghe.shop.order.service.impl包中新增SentinelServiceImpl类,实现SentinelService接口,源码如下所示。

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试类
 */
@Service
public class SentinelServiceImpl implements SentinelService {
    @Override
    @SentinelResource("sendMessage")
    public void sendMessage() {
        System.out.println("测试Sentinel的链路流控模式");
    }
}

这里,我们在sendMessage()方法上使用了@SentinelResource注解, @SentinelResource注解会在后续文章中介绍,这里不再赘述。

(3)在订单微服务的io.binghe.shop.order.controller包下新建SentinelController类,用于测试接口,源码如下所示。

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试Sentinel
 */
@Slf4j
@RestController
public class SentinelController {

    @Autowired
    private SentinelService sentinelService;

    @GetMapping(value = "/request_sentinel1")
    public String requestSentinel1(){
        log.info("测试Sentinel1");
        sentinelService.sendMessage();
        return "sentinel1";
    }
    @GetMapping(value = "/request_sentinel2")
    public String requestSentinel2(){
        log.info("测试Sentinel2");
        sentinelService.sendMessage();
        return "sentinel2";
    }
}

(4)升级SpringCloud Alibaba的依赖版本到2.2.7.RELE

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔向理想的星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值