SpringCloudAlibaba限流熔断Sentinel解决方案

限流熔断Sentinel解决方案

1,安装Sentinel服务

(1)下载网址

https://github.com/alibaba/Sentinel/releases
复制代码

(2)下载Jar包(可以存储到一个sentinel目录),如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxkfKTYY-1622816277794)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622645139120.png)] (3)在sentinel对应目录,打开命令(cmd)启动运行sentinel。

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a60gnsiW-1622816277797)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622645246929.png)] 进入浏览器访问 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9j99Vqk-1622816277801)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622805565549.png)]

http://localhost:8180
复制代码

用户名和密码

sentinel
复制代码

2,Sentinel入门

(1)sentinel集成

​ Sentinel 应用于服务消费方(Consumer),在消费方添加依赖如下

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
复制代码

(2)添加配置文件

​ 打开服务消费方sca-nacos-consumer配置文件application.yml,添加sentinel配置

spring:
  cloud:
    sentinel:
      transport:
         port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
         dashboard: localhost:8180 # 指定sentinel控制台地址。
复制代码

(3)访问链接

​ 启动服务提供者,服务消费者,然后在浏览器访问消费者url [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pT8q69ZZ-1622816277804)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622805748229.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qVcSZ4gg-1622816277805)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806485886.png)]

2,sentinel限流入门

我们设置一下指定接口的流控,QPS单机阀值为1,代表每秒请求不能超出1,要不然就做流控处理,处理方式直接调用失败。

第一步:选择要限流的链路,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D97D1mXt-1622816277805)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806575775.png)] 第二步:设置限流策略,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PaHt41Zl-1622816277807)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806620222.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hXbJXFG-1622816277808)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806671404.png)] 第三步:反复刷新访问消费端端服务,检测是否有限流信息输出,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cUF6wC6o-1622816277810)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806699683.png)]

Sentinel流控规则分析

阈值类型分析

  1. QPS(****Queries Per Second):当调用这个api的时,QPS达到单机阈值时,就会限流。
  2. 线程数:当调用这个api的时,线程数达到单机阈值时,就会限流。

设置限流模式

Sentinel的流控模式代表的流控的方式,默认【直接】,还有关联,链路。

直接模式:

Sentinel默认的流控处理就是【直接->快速失败】。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s29cbWLP-1622816277810)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806836086.png)] 快速访问结果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGyFkhTH-1622816277811)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622806876083.png)]

关联模式:

当关联的资源达到阈值,就限流自己。例如设置了关联资源为/ur2时,假如关联资源/url2的qps阀值超过1时,就限流/url1接口(是不是感觉很霸道,关联资源达到阀值,是本资源接口被限流了)。这种关联模式有什么应用场景呢?我们举个例子,订单服务中会有2个重要的接口,一个是读取订单信息接口,一个是写入订单信息接口。在高并发业务场景中,两个接口都会占用资源,如果读取接口访问过大,就会影响写入接口的性能。业务中如果我们希望写入订单比较重要,要优先考虑写入订单接口。那就可以利用关联模式;在关联资源上面设置写入接口,资源名设置读取接口就行了;这样就起到了优先写入,一旦写入请求多,就限制读的请求。例如:

设置: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3rFXBwO-1622816277812)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622807126989.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2jdIYW1-1622816277813)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622807188703.png)] ### [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vaNnSWHu-1622816277814)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622807356415.png)]链路模式 链路模式 只记录链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流在B业务不受影响。例如现在设计一个业务对象,代码如下:

@Service
public class ConsumerService{
    @SentinelResource("doGetResource")
    public String doGetResource(){
        return "doGetResource";
    }
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bO1QOvVw-1622816277814)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808006556.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ylBGxTze-1622816277815)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808582983.png)] 接下来我们分别在/consumer/doRestEcho,/consumer/doLoadBalanced对应的方法中对ConsumerService中的doGetResource方法进行调用。其路由规则配置如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EXNaSyQ3-1622816277815)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808534910.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9DvjNPy-1622816277816)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808414551.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBtztyjH-1622816277817)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808720540.png)]

说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认收敛所有URL的入口上下文,因此互连限流不生效,需要在application.yml添加如下语句来关闭URL PATH聚合:

sentinel:
web-context-unify: false
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAlyQWZN-1622816277817)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622808806060.png)]

设计限流效果

快速失败

流量达到指定阀值,直接返回报异常。(类似路前方坍塌,后面设定路标,让后面的车辆返回)

WarmUp **(****预热)

WarmUp也叫预热,根据codeFactor(默认3)的值,(阀值/codeFactor)为初始阈值,经过预热时长,才到达设置的QPS的阈值,假如单机阈值为100,系统初始化的阈为 100/3 ,即阈值为33,然后过了10秒,阈值才恢复到100。这个预热的应用场景,如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。例如:

后端代码查看访问量 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5STAXJtw-1622816277818)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809160212.png)]设置单机阈值 设置单机阈值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADrCRuH5-1622816277818)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809216109.png)] 设置时间内超过访问量限制就会限流 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnHmVmG5-1622816277819)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809363035.png)]

排队等待

从字面上面就能够猜到,匀速排队,让请求以均匀的速度通过,阈值类型必须设成QPS,否则无效。比如有时候系统在某一个时刻会出现大流量,之后流量就恢复稳定,可以采用这种排队模式,大流量来时可以让流量请求先排队,等恢复了在慢慢进行处理,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQIkjYlO-1622816277819)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809537845.png)] 设置 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZvB1lQv-1622816277820)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809578126.png)] 超过设置的单机阈值,就会进入转圈等待状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRauldmC-1622816277821)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809709378.png)]

Sentinel降级入门

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

Sentinel降级入门

首先对请求进行延时处理 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5nDkNZM-1622816277821)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622810296076.png)] 第一步:服务启动后,选择要降级的链路,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmVKl59h-1622816277822)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622809885861.png)] 第二步:选择要降级的链路,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzZoBTZk-1622816277822)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622810063180.png)] 这里表示熔断策略为慢调用比例,表示链路请求数超过3时,假如平均响应时间假如超过200毫秒的有50%,则对请求进行熔断,熔断时长为10秒钟,10秒以后恢复正常。

超过最大等待时常,并且超出比例阈值,就会限流 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZjobgX5-1622816277823)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622810183459.png)] 我们也可以进行断点调试,在DefaultBlockExceptionHandler中的handle方法内部加断点,分析异常类型,假如异常类型为DegradeException则为降级熔断。

我们也可以进行断点调试,在DefaultBlockExceptionHandler中的handle方法内部加断点,分析异常类型,假如异常类型为DegradeException则为降级熔断。

自定义Sentinel中异常处理

package com.cy;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Response;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@Component
public class ServiceBlockExceptionHandler implements BlockExceptionHandler  {
    
    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       BlockException e) throws Exception {
        //设置响应数据的编码
        response.setCharacterEncoding("utf-8");
        //告述客户端要响应的数据类型以及客户端以什么编码呈现数据
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw=response.getWriter();
        Map<String,Object> map=new HashMap<>();
        if(e instanceof DegradeException){
            map.put("status",601);
            map.put("message","服务器被熔断了");
        }else if(e instanceof FlowException){
            map.put("status",602);
            map.put("message","服务器被限流了");
        }else{
            map.put("status",603);
            map.put("message","blocked by Sentinel (flow limiting)");
        }
        //将map对象转换为json格式字符串
        String jsonStr=new ObjectMapper().writeValueAsString(map);
        pw.println(jsonStr);
        pw.flush();
    }
}
复制代码

发生异常时 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7QJju2eg-1622816277823)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622811127961.png)]

Sentinel降级策略分析

Sentinel熔断降级支持慢调用比例、异常比例、异常数三种策略。

慢调用比例

慢调用指耗时大于阈值RT(Response Time)的请求称为慢调用,阈值RT由用户设置。其属性具体含义说明如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3DhLzUh-1622816277824)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622812822375.png)] 慢调用逻辑中的状态分析如下:

熔断(OPEN**):**请求数大于最小请求数并且慢调用的比率大于比例阈值则发生熔断,熔断时长为用户自定义设置。

探测(HALFOPEN**):**当熔断过了定义的熔断时长,状态由熔断(OPEN)变为探测(HALFOPEN)。

关闭(CLOSED**):**如果接下来的一个请求小于最大RT,说明慢调用已经恢复,结束熔断,状态由探测(HALF_OPEN)变更为关闭(CLOSED),如果接下来的一个请求大于最大RT,说明慢调用未恢复,继续熔断,熔断时长保持一致

注意:Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置

异常比例

当资源的每秒请求数大于等于最小请求数,并且异常总数占通过量的比例超过比例阈值时,资源进入降级状态。其属性说明如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzxCXmsS-1622816277824)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622812882017.png)] 异常比例中的状态分析如下:

熔断(OPEN):**当请求数大于最小请求并且异常比例大于设置的阈值时触发熔断,熔断时长由用户设置。

探测(HALFOPEN):**当超过熔断时长时,由熔断(OPEN)转为探测(HALFOPEN)

关闭(CLOSED)如果接下来的一个请求未发生错误,说明应用恢复,结束熔断,状态由探测()变更为关闭()。**如果接下来的一个请求继续发生错误,说明应用未恢复,继续熔断,熔断时长保持一致。

异常数量

当资源近1分钟的异常数目超过阈值(异常数)之后会进行服务降级。注意,由于统计时间窗口是分钟级别的,若熔断时长小于60s,则结束熔断状态后仍可能再次进入熔断状态。其属性说明如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CL45cE6-1622816277825)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622812925904.png)] 基于异常数的状态分析如下:

熔断(OPEN****):**当请求数大于最小请求并且异常数量大于设置的阈值时触发熔断,熔断时长由用户设置。

探测(HALFOPEN****):**当超过熔断时长时,由熔断(OPEN)转为探测(HALFOPEN)

关闭(CLOSED****):**如果接下来的一个请求未发生错误,说明应用恢复,结束熔断,状态由探测(HALF_OPEN)变更为关闭(CLOSED)如果接下来的一个请求继续发生错误,说明应用未恢复,继续熔断,熔断时长保持一致。

Sentinel热点规则分析

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top N 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制。 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制。

热点参数限流会统计传入参数中的热点数据,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。其中,Sentinel会利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

快速入门

第一步:定义热点业务代码,如图所示:

/**
* 定义一个基于指定id获取数据方法
* @param id
* @return
*/
@GetMapping("/consumer/findById")
@SentinelResource("doFindById")
public String doFindById(@RequestParam("id") Integer id){
    return "hot id is "+id;
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PutqYUyq-1622816277825)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813459019.png)] 第二步:服务启动后,选择要限流的热点链路,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZBR6Xsd-1622816277826)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813610938.png)] 第三步:设置要限流的热点,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Whxr63B-1622816277827)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813678850.png)] 热点规则的限流模式只有QPS模式(这才叫热点)。参数索引为@SentinelResource注解的方法参数下标,0代表第一个参数,1代表第二个参数。单机阈值以及统计窗口时长表示在此窗口时间超过阈值就限流。

第四步:多次访问热点参数方法,前端会出现如下界面,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cuQwMbGl-1622816277827)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813705672.png)] 然后,在后台出现如下异常表示限流成功。

com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException: 10
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxYCwRBi-1622816277828)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813762056.png)] 其中,热点参数其实说白了就是特殊的流控,流控设置是针对整个请求的;但是热点参数他可以设置到具体哪个参数,甚至参数针对的值,这样更灵活的进行流控管理。

一般应用在某些特殊资源的特殊处理,如:某些商品流量大,其他商品流量很正常,就可以利用热点参数限流的方案。

特定参数设计

配置参数例外项,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Go22lrHD-1622816277828)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622813974442.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVF0xLTb-1622816277829)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814009386.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgSjpcPJ-1622816277830)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814141852.png)] 超出设置的阈值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vni4Elqv-1622816277830)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814219896.png)]

Sentinel系统规则

系统在生产环境运行过程中,我们经常需要监控服务器的状态,看服务器CPU、内存、IO等的使用率;主要目的就是保证服务器正常的运行,不能被某些应用搞崩溃了;而且在保证稳定的前提下,保持系统的最大吞吐量。

长期以来,系统自适应保护的思路是根据硬指标,即系统的负载 (load1) 来做系统过载保护。当系统负载高于某个阈值,就禁止或者减少流量的进入;当 load 开始好转,则恢复流量的进入。

快速入门

Sentinel的系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 、线程数和CPU使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ytLT16h-1622816277831)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814318286.png)]

Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5。

**CPU使用率:**当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。

**RT:**当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。

**线程数:**当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。

**入口 QPS:**当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务。

Sentinel授权规则

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

快速入门

(1)我们在定义应用时,可以实现RequestOriginParser接口,在接口方法中解析请求参数来判定放行还是限流;

@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getParameter("origin");
        return origin;
    }
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJCpvuEp-1622816277832)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814848327.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CIpBrXZt-1622816277833)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814909474.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38haNUZS-1622816277834)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622814960803.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RSsOsYTa-1622816277834)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815058391.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuI3AvET-1622816277835)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815070319.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fX9XgUaX-1622816277835)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815081927.png)]

修改为黑名单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCPABCpq-1622816277836)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815155521.png)] <img src="C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815121916.png" alt="1622815121916" /> <img src="C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815121916.png" alt="1622815121916" style="zoom:100%;" />

Sentinel规则持久化

我们知道,Sentinel Dashboard中配置完规则之后,假如重启应用规则就会丢失,所以实际生产环境中需要配置规则的持久化实现,Sentinel提供多种不同的数据源来持久化规则配置,包括file,redis、nacos、zk(没有界面)。

我们可以通过控制台设置规则后将规则推送到统一的规则中心,客户端监听规则中心实时获取变更。DataSource 扩展常见的实现方式有两种,分别为拉模式和推模式:

拉模式:**客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;

推模式:**规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

快速入门

将sentinel流控的配置信息通过nacos进行持久化,具体步骤如下:

第一步:在sentinel客户端(一个服务)sca-nacos-consumer项目下添加依赖,代码如下:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGjM1mcL-1622816277836)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815444807.png)] 第二步:修改服务的配置文件application.yml或application.properties

sentinel:
  datasource:
    ds:
      nacos:
        ### nacos连接地址
        server-addr: localhost:8848
        ## nacos连接的分组
        group-id: DEFAULT_GROUP
        ###路由存储规则
        rule-type: flow
        ### 读取配置文件的 data-id
        data-id: nacos-consumer
        ###  读取配置文件类型为json
        data-type: json
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGwVXAa5-1622816277837)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815539010.png)] 进入nacos中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sc3trd7y-1622816277837)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815670394.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vM46Y57Q-1622816277838)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815741442.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFqm2Kmc-1622816277838)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815764882.png)]

打开Sentinel进入流控规则发现保存的有写在nacos配置中心的配置 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a502zQ36-1622816277839)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622815942635.png)]

其中:

resource:资源名,即限流规则的作用对象

limitApp:流控针对的调用来源,若为 default 则不区分调用来源

grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制

count:限流阈值

strategy:调用关系限流策略

controlBehavior:流量控制效果(快速失败、Warm Up、匀速排队)

clusterMode:是否为集群模式

猜你喜欢

转载自juejin.im/post/7031187728347873287