Sentinel 来源流控

开课吧樵夫2022-01-10 16:01

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

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

  定义原始请求解析器

  复制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;
    }
}

  流控规则中的来源指定

  修改处理器

// 跨服务根据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;
}

  dashbaord 指定来源