SpringCloudAlibaba微服务一站式解决方案-07Sentinel之流控模式、流控效果

一、Sentinel规则
1 、流控规则

流控规则就是监控应用流量QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被
瞬时的流量高峰冲垮,从而保证应用的高可用性

2、使用步骤
点击簇点链路,看到访问过的接口地址,点击对应的流控按钮,进入流控规则配置页面。
在这里插入图片描述
在这里插入图片描述
2.1 名称解释

1、资源名:唯一名称,默认是请求路径,可以自定义,一般请求下保存默认即可
2、针对来源:指定对那个微服务进行限流,默认default,不区分来源,全部限制。
3、阈值类型/单机阈值
* QPS(每秒请求数量):调用接口的QPS达到阈值时,进行限流。
* 线程数:当调用接口的线程数达到阈值的时候,进行限流。
4、是否集群:暂不需要集群

3 流控模式
在这里插入图片描述

* 直接(默认):接口达到限流条件时,开启限流
* 关联:当关联的资源达到限流条件时,开启限流[适合应用让步]
* 链路:当从某个接口过来的资源达到限流条件时,开启限流

3.1 直接流控模式案例–上述默认就是直接流控
在这里插入图片描述

3.2 关联流控
3.2.1 准备工作 编写OrderService类,提供show方法

package com.chenchen.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

/**
 * Sentinel流控规则业务测试
 */
@Service
public class OrderServiceImpl3 {
    // value 指定资源名称  
    @SentinelResource(value = "show")
    public String show() {
        return "show";
    }
}

3.2.2 修改OrderController逻辑

package com.chenchen.controller;

import com.chenchen.service.impl.OrderServiceImpl3;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Sentinel服务容错测试
 */
@RestController
@Slf4j
@RequestMapping("/sentinel")
public class OrderController3 {
    @Autowired
    private OrderServiceImpl3 orderServiceImpl3;

    @RequestMapping("/show")
    public String show() {
        orderServiceImpl3.show();
        log.info("调用orderService3流控方法:{}","show");
        return "show:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
    }

    @RequestMapping("/showMessage")
    public String showMessage() {
        orderServiceImpl3.show();
        log.info("调用orderService3流控方法:{}","show");
        return "showMessage:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
    }
}

3.2.3 配置限流规则
在这里插入图片描述
3.2.4 Jemter测试访问接口showMessage
在这里插入图片描述

在这里插入图片描述
主要Jmeter一直在访问showMessage接口,此时我们再去访问show接口,发现已经被限流。(因为showMesage一直占用着orderService中的方法,当show()再去调用时发现已经调不通)
在这里插入图片描述
3.2 链路流控

当从某个接口过来的资源达到限流条件时,开启限流。类似于针对来源配置项。
区别在于
针对来源针对微服务级别,链路流控针对上级接口(被调用方),颗粒度更细

模拟链路流控Demo
3.2.1、继续在OrderService3中添加方法

package com.chenchen.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

/**
 * Sentinel流控规则业务测试
 */
@Service
public class OrderServiceImpl3 {
    // value 指定资源名称  关联流控
    @SentinelResource(value = "show")
    public String show() {
        return "show";
    }

    //限流策略--链路流控
    @SentinelResource(value = "message")
    public String message() {
        return "message";
    }
}

3.2.2 修改OrderController,分别调用message()方法


    /**
     * 链路流控
     * @return
     */
    @RequestMapping("/message")
    public String message() {
        orderServiceImpl3.message();
        log.info("调用orderService3链路流控方法:{}", "message");
        return "show:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
    }

    /**
     * 链路流控
     *
     * @return
     */
    @RequestMapping("/message2")
    public String message2() {
        orderServiceImpl3.message();
        log.info("调用orderService3链路流控方法:{}", "message");
        return "showMessage:" + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
    }

3.2.3 禁止收敛 URL的入口Context
在这里插入图片描述
修改父工程依赖版本

 <!-- <spring-cloud.alibaba.version>2.1.0.RELEASE</spring-cloud.alibaba.version>-->
        <spring-cloud.alibaba.version>2.1.1.RELEASE</spring-cloud.alibaba.version>

3.2.4 配置文件中关闭sentinel的CommonFilter实例化

 sentinel:
      transport:
        port: 9999
        dashboard: localhost:8080 #指定控制台服务的地址
      filter:
        enabled: false

3.2.5 添加配置,构建CommonFilter实例化

package com.chenchen.config;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterContextConfig {

    @Bean
    public FilterRegistrationBean sentinelRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new CommonFilter());
        filterRegistrationBean.addUrlPatterns("/*");

        //入口资源关闭 聚合
        filterRegistrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

}

3.2.6 控制台配置流控规则
在这里插入图片描述

在这里插入图片描述
3.2.7 浏览器访问http://localhost:8092/sentinel/message2正常,
访问http://localhost:8092/sentinel/message发现被限流。
在这里插入图片描述

4 、流控效果
在这里插入图片描述
4.1 快速失败

直接失败,抛出异常,不做任何额外处理,默认就是这种方式

4.2 Warm Up

从开始阈值到最大QPS会有一个缓存阶段,初始时阈值时最大QPS的1/3,然后慢慢增长,
直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景

4.3 排队等待

让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待,还会设置一个
超时时间,当请求超过超时时间还未处理,则会被丢弃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值