来源流控是针对请求发出者的来源名称所进行的流控。在流控规则中可以直接指定该规则用于限流的来源名称的请求,一条规则可以指定一个限流的来源。当然,若要指定多个来源,可以定义多个同名规则,也可以通过黑白名单规则一次性指定。 无论是黑名单还是白名单,其实就是一个请求来源名称列表,当然,该名单是属于某一具体资源的。出现在黑名单中的来源请求将被降级,其它来源的请求则可以正常进行访问,出现在白名单中的来源请求是可以进行正常访问的,而其它来源请求则将被降级。 定义原始请求解析器复制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 |
|