分享

Sentinel 来源流控

 码农9527 2022-01-10

 来源流控是针对请求发出者的来源名称所进行的流控。在流控规则中可以直接指定该规则用于限流的来源名称的请求,一条规则可以指定一个限流的来源。当然,若要指定多个来源,可以定义多个同名规则,也可以通过黑白名单规则一次性指定。

  无论是黑名单还是白名单,其实就是一个请求来源名称列表,当然,该名单是属于某一具体资源的。出现在黑名单中的来源请求将被降级,其它来源的请求则可以正常进行访问,出现在白名单中的来源请求是可以进行正常访问的,而其它来源请求则将被降级。

  定义原始请求解析器

  复制consumer-nacos-sentinel-degrade工程,重命名为consumer-reqsource

package com.javafamily;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import io.micrometer.core.instrument.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

public class PetsRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        // 本例的来源标识通过请求参数给出
        // 这里获取的名称为source的请求参数就是来源名称
        String source = request.getParameter("source");
        // 指定默认来源名称为serviceA
        if (StringUtils.isEmpty(source)) {
            source = "serviceA";
        }
        // 返回的就是来源标识
        return source;
    }
}123456789101112131415161718192021复制代码类型:[java]

  流控规则中的来源指定

  修改处理器

// 跨服务根据id查询
@GetMapping("/get/{id}")
// 该注解表明当前方法是一个由Sentinel管理的资源,value属性用于指定该资源的名称
@SentinelResource(value = "reqsourceRule", fallback = "getHandlerFallback")
public Pets getHandle(@PathVariable("id") int id) {
    String url = SERVICE_PROVIDER + "/provider/pets/get/" + id;
    Pets pets = restTemplate.getForObject(url, Pets.class);
    return pets;
}

//指定服务降级处理方法
public Pets getHandlerFallback(int id) {
    Pets pets = Pets.builder().id(id).name("degrade-method-" + id).build();
    return pets;
}123456789101112131415复制代码类型:[java]

  dashbaord 指定来源

  dashboard 指定同名规则

  以上规则的意思是,对于 serviceA 来源的请求,其 QPS 的阈值为2.对于 serviceB 来源的请求,其QPS 的阈值为3.而其它来源的请求,其QPS 的阈值为10.但它们都是用于限制资源名称为reqsourceRule 的资源的。

  动态设置黑白名单

  流控规则中,一条规则仅可指定一个来源,若要指定多个来源,则需要定义多条同名规则,比较麻烦,可以通过黑白名单来一次性指定多个来源。

  也可以通过代码设置黑白名单。

  (1) initRule()

  (2) reqsourceRule()

  gitee:

  https:///javainfamily/spring-cloud-alibaba

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多