Java源码示例:com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule

示例1
public CompletableFuture<List<GatewayFlowRuleEntity>> fetchGatewayFlowRules(String app, String ip, int port) {
    if (StringUtil.isBlank(ip) || port <= 0) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
    }

    try {
        return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false)
                .thenApply(r -> {
                    List<GatewayFlowRule> gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class);
                    List<GatewayFlowRuleEntity> entities = gatewayFlowRules.stream().map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)).collect(Collectors.toList());
                    return entities;
                });
    } catch (Exception ex) {
        logger.warn("Error when fetching gateway flow rules", ex);
        return AsyncUtils.newFailedFuture(ex);
    }
}
 
示例2
@Test
public void testParseParametersNoParamItem() {
    // Mock a request.
    ServerWebExchange exchange = mock(ServerWebExchange.class);
    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(5)
        .setIntervalSec(1)
    );
    GatewayRuleManager.loadRules(rules);

    Object[] params = paramParser.parseParameterFor(routeId1, exchange,
        e -> e.getResourceMode() == 0);
    assertThat(params.length).isEqualTo(1);
}
 
示例3
@Override
public CommandResponse<String> handle(CommandRequest request) {
    String data = request.getParam("data");
    if (StringUtil.isBlank(data)) {
        return CommandResponse.ofFailure(new IllegalArgumentException("Bad data"));
    }
    try {
        data = URLDecoder.decode(data, "utf-8");
    } catch (Exception e) {
        RecordLog.info("Decode gateway rule data error", e);
        return CommandResponse.ofFailure(e, "decode gateway rule data error");
    }

    RecordLog.info(String.format("[API Server] Receiving rule change (type: gateway rule): %s", data));

    String result = SUCCESS_MSG;
    List<GatewayFlowRule> flowRules = JSONArray.parseArray(data, GatewayFlowRule.class);
    GatewayRuleManager.loadRules(new HashSet<>(flowRules));
    return CommandResponse.ofSuccess(result);
}
 
示例4
@Test
public void testParseParametersNoParamItem() {
    RequestItemParser<Object> itemParser = mock(RequestItemParser.class);
    GatewayParamParser<Object> parser = new GatewayParamParser<>(itemParser);
    // Create a fake request.
    Object request = new Object();
    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(5)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(10)
        .setControlBehavior(2)
        .setMaxQueueingTimeoutMs(1000)
    );
    GatewayRuleManager.loadRules(rules);

    Object[] params = parser.parseParameterFor(routeId1, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(1);
}
 
示例5
public CompletableFuture<List<GatewayFlowRuleEntity>> fetchGatewayFlowRules(String app, String ip, int port) {
    if (StringUtil.isBlank(ip) || port <= 0) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
    }

    try {
        return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false)
                .thenApply(r -> {
                    List<GatewayFlowRule> gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class);
                    List<GatewayFlowRuleEntity> entities = gatewayFlowRules.stream().map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)).collect(Collectors.toList());
                    return entities;
                });
    } catch (Exception ex) {
        logger.warn("Error when fetching gateway flow rules", ex);
        return AsyncUtils.newFailedFuture(ex);
    }
}
 
示例6
@Test
public void testParseParametersNoParamItem() {
    // Mock a request.
    ServerWebExchange exchange = mock(ServerWebExchange.class);
    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(5)
        .setIntervalSec(1)
    );
    GatewayRuleManager.loadRules(rules);

    Object[] params = paramParser.parseParameterFor(routeId1, exchange,
        e -> e.getResourceMode() == 0);
    assertThat(params.length).isEqualTo(1);
}
 
示例7
@Override
public CommandResponse<String> handle(CommandRequest request) {
    String data = request.getParam("data");
    if (StringUtil.isBlank(data)) {
        return CommandResponse.ofFailure(new IllegalArgumentException("Bad data"));
    }
    try {
        data = URLDecoder.decode(data, "utf-8");
    } catch (Exception e) {
        RecordLog.info("Decode gateway rule data error", e);
        return CommandResponse.ofFailure(e, "decode gateway rule data error");
    }

    RecordLog.info(String.format("[API Server] Receiving rule change (type: gateway rule): %s", data));

    String result = SUCCESS_MSG;
 Set<GatewayFlowRule> flowRules = JSON.parseObject(data, new TypeReference<Set<GatewayFlowRule>>() {
 });
    GatewayRuleManager.loadRules(flowRules);
    if (!writeToDataSource(gatewayFlowWds, flowRules)) {
        result = WRITE_DS_FAILURE_MSG;
    }
    return CommandResponse.ofSuccess(result);
}
 
示例8
@Test
public void testParseParametersNoParamItem() {
    RequestItemParser<Object> itemParser = mock(RequestItemParser.class);
    GatewayParamParser<Object> parser = new GatewayParamParser<>(itemParser);
    // Create a fake request.
    Object request = new Object();
    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(5)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule(routeId1)
        .setCount(10)
        .setControlBehavior(2)
        .setMaxQueueingTimeoutMs(1000)
    );
    GatewayRuleManager.loadRules(rules);

    Object[] params = parser.parseParameterFor(routeId1, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(1);
}
 
示例9
/**
 * 初始化限流规则(或在 dashboard 中配置)
 */
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("lion-auth")
            // 限流阈值QPS
            .setCount(COUNT)
            // 统计时间窗口,单位是秒,默认是 1 秒
            .setIntervalSec(INTERVAL_SEC)
    );
    rules.add(new GatewayFlowRule("lion-demo-provider")
            .setCount(COUNT)
            .setIntervalSec(INTERVAL_SEC)
    );
    rules.add(new GatewayFlowRule("lion-demo-consumer")
            .setCount(COUNT)
            .setIntervalSec(INTERVAL_SEC)
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例10
public GatewayFlowRule toGatewayFlowRule() {
    GatewayFlowRule rule = new GatewayFlowRule();
    rule.setResource(resource);
    rule.setResourceMode(resourceMode);

    rule.setGrade(grade);
    rule.setCount(count);
    rule.setIntervalSec(calIntervalSec(interval, intervalUnit));

    rule.setControlBehavior(controlBehavior);

    if (burst != null) {
        rule.setBurst(burst);
    }

    if (maxQueueingTimeoutMs != null) {
        rule.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);
    }

    if (paramItem != null) {
        GatewayParamFlowItem ruleItem = new GatewayParamFlowItem();
        rule.setParamItem(ruleItem);
        ruleItem.setParseStrategy(paramItem.getParseStrategy());
        ruleItem.setFieldName(paramItem.getFieldName());
        ruleItem.setPattern(paramItem.getPattern());

        if (paramItem.getMatchStrategy() != null) {
            ruleItem.setMatchStrategy(paramItem.getMatchStrategy());
        }
    }

    return rule;
}
 
示例11
public static GatewayFlowRuleEntity fromGatewayFlowRule(String app, String ip, Integer port, GatewayFlowRule rule) {
    GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity();
    entity.setApp(app);
    entity.setIp(ip);
    entity.setPort(port);

    entity.setResource(rule.getResource());
    entity.setResourceMode(rule.getResourceMode());

    entity.setGrade(rule.getGrade());
    entity.setCount(rule.getCount());
    Object[] intervalSecResult = parseIntervalSec(rule.getIntervalSec());
    entity.setInterval((Long) intervalSecResult[0]);
    entity.setIntervalUnit((Integer) intervalSecResult[1]);

    entity.setControlBehavior(rule.getControlBehavior());
    entity.setBurst(rule.getBurst());
    entity.setMaxQueueingTimeoutMs(rule.getMaxQueueingTimeoutMs());

    GatewayParamFlowItem paramItem = rule.getParamItem();
    if (paramItem != null) {
        GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();
        entity.setParamItem(itemEntity);
        itemEntity.setParseStrategy(paramItem.getParseStrategy());
        itemEntity.setFieldName(paramItem.getFieldName());
        itemEntity.setPattern(paramItem.getPattern());
        itemEntity.setMatchStrategy(paramItem.getMatchStrategy());
    }

    return entity;
}
 
示例12
private void doSentinelEntry(String resourceName, final int resType, RequestContext requestContext,
                             Deque<AsyncEntry> asyncEntries) throws BlockException {
    Object[] params = paramParser.parseParameterFor(resourceName, requestContext,
        new Predicate<GatewayFlowRule>() {
            @Override
            public boolean test(GatewayFlowRule r) {
                return r.getResourceMode() == resType;
            }
        });
    AsyncEntry entry = SphU.asyncEntry(resourceName, EntryType.IN, 1, params);
    asyncEntries.push(entry);
}
 
示例13
/**
 * rules
 */
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("biz-web")
    // 限流阈值
        .setCount(10)
        // 统计时间窗口,单位是秒,默认是 1 秒
        .setIntervalSec(1));
    GatewayRuleManager.loadRules(rules);
}
 
示例14
public GatewayFlowRule toGatewayFlowRule() {
    GatewayFlowRule rule = new GatewayFlowRule();
    rule.setResource(resource);
    rule.setResourceMode(resourceMode);

    rule.setGrade(grade);
    rule.setCount(count);
    rule.setIntervalSec(calIntervalSec(interval, intervalUnit));

    rule.setControlBehavior(controlBehavior);

    if (burst != null) {
        rule.setBurst(burst);
    }

    if (maxQueueingTimeoutMs != null) {
        rule.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);
    }

    if (paramItem != null) {
        GatewayParamFlowItem ruleItem = new GatewayParamFlowItem();
        rule.setParamItem(ruleItem);
        ruleItem.setParseStrategy(paramItem.getParseStrategy());
        ruleItem.setFieldName(paramItem.getFieldName());
        ruleItem.setPattern(paramItem.getPattern());

        if (paramItem.getMatchStrategy() != null) {
            ruleItem.setMatchStrategy(paramItem.getMatchStrategy());
        }
    }

    return rule;
}
 
示例15
public static GatewayFlowRuleEntity fromGatewayFlowRule(String app, String ip, Integer port, GatewayFlowRule rule) {
    GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity();
    entity.setApp(app);
    entity.setIp(ip);
    entity.setPort(port);

    entity.setResource(rule.getResource());
    entity.setResourceMode(rule.getResourceMode());

    entity.setGrade(rule.getGrade());
    entity.setCount(rule.getCount());
    Object[] intervalSecResult = parseIntervalSec(rule.getIntervalSec());
    entity.setInterval((Long) intervalSecResult[0]);
    entity.setIntervalUnit((Integer) intervalSecResult[1]);

    entity.setControlBehavior(rule.getControlBehavior());
    entity.setBurst(rule.getBurst());
    entity.setMaxQueueingTimeoutMs(rule.getMaxQueueingTimeoutMs());

    GatewayParamFlowItem paramItem = rule.getParamItem();
    if (paramItem != null) {
        GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();
        entity.setParamItem(itemEntity);
        itemEntity.setParseStrategy(paramItem.getParseStrategy());
        itemEntity.setFieldName(paramItem.getFieldName());
        itemEntity.setPattern(paramItem.getPattern());
        itemEntity.setMatchStrategy(paramItem.getMatchStrategy());
    }

    return entity;
}
 
示例16
private void doSentinelEntry(String resourceName, final int resType, RequestContext requestContext,
                             Deque<EntryHolder> holders) throws BlockException {
    Object[] params = paramParser.parseParameterFor(resourceName, requestContext,
        new Predicate<GatewayFlowRule>() {
            @Override
            public boolean test(GatewayFlowRule r) {
                return r.getResourceMode() == resType;
            }
        });
    AsyncEntry entry = SphU.asyncEntry(resourceName, ResourceTypeConstants.COMMON_API_GATEWAY,
            EntryType.IN, params);
    EntryHolder holder = new EntryHolder(entry, params);
    holders.push(holder);
}
 
示例17
@Test
public void testParseParametersWithEmptyItemPattern() {
    RequestItemParser<Object> itemParser = mock(RequestItemParser.class);
    GatewayParamParser<Object> paramParser = new GatewayParamParser<>(itemParser);
    // Create a fake request.
    Object request = new Object();
    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    final String routeId = "my_test_route_DS(*H";
    final String headerName = "X-Sentinel-Flag";
    GatewayFlowRule routeRule1 = new GatewayFlowRule(routeId)
        .setCount(10)
        .setIntervalSec(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName(headerName)
            .setPattern("")
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT)
        );
    rules.add(routeRule1);
    GatewayRuleManager.loadRules(rules);

    mockSingleHeader(itemParser, headerName, "Sent1nel");
    Object[] params = paramParser.parseParameterFor(routeId, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(1);
    // Empty pattern should not take effect.
    assertThat(params[routeRule1.getParamItem().getIndex()]).isEqualTo("Sent1nel");
}
 
示例18
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("aliyun-product-route")
        .setCount(10)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule("aliyun-product-route")
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        )
    );
    rules.add(new GatewayFlowRule("another-route-httpbin")
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName("X-Sentinel-Flag")
        )
    );
    rules.add(new GatewayFlowRule("another-route-httpbin")
        .setCount(1)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pa")
        )
    );

    rules.add(new GatewayFlowRule("some_customized_api")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pn")
        )
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例19
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("aliyun_route")
        .setCount(10)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule("aliyun_route")
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName("X-Sentinel-Flag")
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(1)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pa")
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(2)
        .setIntervalSec(30)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("type")
            .setPattern("warn")
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_CONTAINS)
        )
    );

    rules.add(new GatewayFlowRule("some_customized_api")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pn")
        )
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例20
@Test
public void testParseParametersWithItems() {
    // Mock a request.
    ServerWebExchange exchange = mock(ServerWebExchange.class);
    ServerHttpRequest request = mock(ServerHttpRequest.class);
    when(exchange.getRequest()).thenReturn(request);
    RequestPath requestPath = mock(RequestPath.class);
    when(request.getPath()).thenReturn(requestPath);

    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    String api1 = "my_test_route_B";
    String headerName = "X-Sentinel-Flag";
    String paramName = "p";
    GatewayFlowRule routeRule1 = new GatewayFlowRule(routeId1)
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        );
    GatewayFlowRule routeRule2 = new GatewayFlowRule(routeId1)
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName(headerName)
        );
    GatewayFlowRule routeRule3 = new GatewayFlowRule(routeId1)
        .setCount(20)
        .setIntervalSec(1)
        .setBurst(5)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
        );
    GatewayFlowRule routeRule4 = new GatewayFlowRule(routeId1)
        .setCount(120)
        .setIntervalSec(10)
        .setBurst(30)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HOST)
        );
    GatewayFlowRule apiRule1 = new GatewayFlowRule(api1)
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
        );
    rules.add(routeRule1);
    rules.add(routeRule2);
    rules.add(routeRule3);
    rules.add(routeRule4);
    rules.add(apiRule1);
    GatewayRuleManager.loadRules(rules);

    String expectedHost = "hello.test.sentinel";
    String expectedAddress = "66.77.88.99";
    String expectedHeaderValue1 = "Sentinel";
    String expectedUrlParamValue1 = "17";
    mockClientHostAddress(request, expectedAddress);
    Map<String, String> expectedHeaders = new HashMap<String, String>() {{
        put(headerName, expectedHeaderValue1); put("Host", expectedHost);
    }};
    mockHeaders(request, expectedHeaders);
    mockSingleUrlParam(request, paramName, expectedUrlParamValue1);
    Object[] params = paramParser.parseParameterFor(routeId1, exchange, e -> e.getResourceMode() == 0);
    assertThat(params.length).isEqualTo(4);
    assertThat(params[routeRule1.getParamItem().getIndex()]).isEqualTo(expectedAddress);
    assertThat(params[routeRule2.getParamItem().getIndex()]).isEqualTo(expectedHeaderValue1);
    assertThat(params[routeRule3.getParamItem().getIndex()]).isEqualTo(expectedUrlParamValue1);
    assertThat(params[routeRule4.getParamItem().getIndex()]).isEqualTo(expectedHost);

    assertThat(paramParser.parseParameterFor(api1, exchange, e -> e.getResourceMode() == 0).length).isZero();

    String expectedUrlParamValue2 = "fs";
    mockSingleUrlParam(request, paramName, expectedUrlParamValue2);
    params = paramParser.parseParameterFor(api1, exchange, e -> e.getResourceMode() == 1);
    assertThat(params.length).isEqualTo(1);
    assertThat(params[apiRule1.getParamItem().getIndex()]).isEqualTo(expectedUrlParamValue2);
}
 
示例21
@Override
public boolean test(GatewayFlowRule e) {
    return e.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID;
}
 
示例22
@Override
public boolean test(GatewayFlowRule e) {
    return e.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME;
}
 
示例23
@Test
public void testParseParametersWithItemPatternMatching() {
    RequestItemParser<Object> itemParser = mock(RequestItemParser.class);
    GatewayParamParser<Object> paramParser = new GatewayParamParser<>(itemParser);
    // Create a fake request.
    Object request = new Object();

    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    final String routeId1 = "my_test_route_F&@";
    final String api1 = "my_test_route_E5K";
    final String headerName = "X-Sentinel-Flag";
    final String paramName = "p";

    String nameEquals = "Wow";
    String nameContains = "warn";
    String valueRegex = "\\d+";
    GatewayFlowRule routeRule1 = new GatewayFlowRule(routeId1)
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName(headerName)
            .setPattern(nameEquals)
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT)
        );
    GatewayFlowRule routeRule2 = new GatewayFlowRule(routeId1)
        .setCount(20)
        .setIntervalSec(1)
        .setBurst(5)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
            .setPattern(nameContains)
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_CONTAINS)
        );
    GatewayFlowRule apiRule1 = new GatewayFlowRule(api1)
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
            .setPattern(valueRegex)
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_REGEX)
        );
    rules.add(routeRule1);
    rules.add(routeRule2);
    rules.add(apiRule1);
    GatewayRuleManager.loadRules(rules);

    mockSingleHeader(itemParser, headerName, nameEquals);
    mockSingleUrlParam(itemParser, paramName, nameContains);
    Object[] params = paramParser.parseParameterFor(routeId1, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(2);
    assertThat(params[routeRule1.getParamItem().getIndex()]).isEqualTo(nameEquals);
    assertThat(params[routeRule2.getParamItem().getIndex()]).isEqualTo(nameContains);

    mockSingleHeader(itemParser, headerName, nameEquals + "_foo");
    mockSingleUrlParam(itemParser, paramName, nameContains + "_foo");
    params = paramParser.parseParameterFor(routeId1, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(2);
    assertThat(params[routeRule1.getParamItem().getIndex()])
        .isEqualTo(SentinelGatewayConstants.GATEWAY_NOT_MATCH_PARAM);
    assertThat(params[routeRule2.getParamItem().getIndex()])
        .isEqualTo(nameContains + "_foo");

    mockSingleHeader(itemParser, headerName, "foo");
    mockSingleUrlParam(itemParser, paramName, "foo");
    params = paramParser.parseParameterFor(routeId1, request, routeIdPredicate);
    assertThat(params.length).isEqualTo(2);
    assertThat(params[routeRule1.getParamItem().getIndex()])
        .isEqualTo(SentinelGatewayConstants.GATEWAY_NOT_MATCH_PARAM);
    assertThat(params[routeRule2.getParamItem().getIndex()])
        .isEqualTo(SentinelGatewayConstants.GATEWAY_NOT_MATCH_PARAM);

    mockSingleUrlParam(itemParser, paramName, "23");
    params = paramParser.parseParameterFor(api1, request, apiNamePredicate);
    assertThat(params.length).isEqualTo(1);
    assertThat(params[apiRule1.getParamItem().getIndex()]).isEqualTo("23");

    mockSingleUrlParam(itemParser, paramName, "some233");
    params = paramParser.parseParameterFor(api1, request, apiNamePredicate);
    assertThat(params.length).isEqualTo(1);
    assertThat(params[apiRule1.getParamItem().getIndex()])
        .isEqualTo(SentinelGatewayConstants.GATEWAY_NOT_MATCH_PARAM);
}
 
示例24
@Before
public void setUp() {
    GatewayApiDefinitionManager.loadApiDefinitions(new HashSet<ApiDefinition>());
    GatewayRuleManager.loadRules(new HashSet<GatewayFlowRule>());
    GatewayRegexCache.clear();
}
 
示例25
@After
public void tearDown() {
    GatewayApiDefinitionManager.loadApiDefinitions(new HashSet<ApiDefinition>());
    GatewayRuleManager.loadRules(new HashSet<GatewayFlowRule>());
    GatewayRegexCache.clear();
}
 
示例26
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("aliyun-product-route")
        .setCount(10)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule("aliyun-product-route")
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        )
    );
    rules.add(new GatewayFlowRule("another-route-httpbin")
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName("X-Sentinel-Flag")
        )
    );
    rules.add(new GatewayFlowRule("another-route-httpbin")
        .setCount(1)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pa")
        )
    );

    rules.add(new GatewayFlowRule("some_customized_api")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pn")
        )
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例27
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("images")
        .setCount(10)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule("images")
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        )
    );
    rules.add(new GatewayFlowRule("comments")
        .setCount(3)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(6000)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName("X-Sentinel-Flag")
        )
    );
    rules.add(new GatewayFlowRule("comments")
        .setCount(1)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pa")
        )
    );

    rules.add(new GatewayFlowRule("some_customized_api")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pn")
        )
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例28
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("aliyun_route")
        .setCount(10)
        .setIntervalSec(1)
    );
    rules.add(new GatewayFlowRule("aliyun_route")
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName("X-Sentinel-Flag")
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(1)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pa")
        )
    );
    rules.add(new GatewayFlowRule("httpbin_route")
        .setCount(2)
        .setIntervalSec(30)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("type")
            .setPattern("warn")
            .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_CONTAINS)
        )
    );

    rules.add(new GatewayFlowRule("some_customized_api")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName("pn")
        )
    );
    GatewayRuleManager.loadRules(rules);
}
 
示例29
@Test
public void testParseParametersWithItems() {
    // Mock a request.
    ServerWebExchange exchange = mock(ServerWebExchange.class);
    ServerHttpRequest request = mock(ServerHttpRequest.class);
    when(exchange.getRequest()).thenReturn(request);
    RequestPath requestPath = mock(RequestPath.class);
    when(request.getPath()).thenReturn(requestPath);

    // Prepare gateway rules.
    Set<GatewayFlowRule> rules = new HashSet<>();
    String routeId1 = "my_test_route_A";
    String api1 = "my_test_route_B";
    String headerName = "X-Sentinel-Flag";
    String paramName = "p";
    GatewayFlowRule routeRule1 = new GatewayFlowRule(routeId1)
        .setCount(2)
        .setIntervalSec(2)
        .setBurst(2)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
        );
    GatewayFlowRule routeRule2 = new GatewayFlowRule(routeId1)
        .setCount(10)
        .setIntervalSec(1)
        .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
        .setMaxQueueingTimeoutMs(600)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER)
            .setFieldName(headerName)
        );
    GatewayFlowRule routeRule3 = new GatewayFlowRule(routeId1)
        .setCount(20)
        .setIntervalSec(1)
        .setBurst(5)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
        );
    GatewayFlowRule routeRule4 = new GatewayFlowRule(routeId1)
        .setCount(120)
        .setIntervalSec(10)
        .setBurst(30)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HOST)
        );
    GatewayFlowRule apiRule1 = new GatewayFlowRule(api1)
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
        .setCount(5)
        .setIntervalSec(1)
        .setParamItem(new GatewayParamFlowItem()
            .setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM)
            .setFieldName(paramName)
        );
    rules.add(routeRule1);
    rules.add(routeRule2);
    rules.add(routeRule3);
    rules.add(routeRule4);
    rules.add(apiRule1);
    GatewayRuleManager.loadRules(rules);

    String expectedHost = "hello.test.sentinel";
    String expectedAddress = "66.77.88.99";
    String expectedHeaderValue1 = "Sentinel";
    String expectedUrlParamValue1 = "17";
    mockClientHostAddress(request, expectedAddress);
    Map<String, String> expectedHeaders = new HashMap<String, String>() {{
        put(headerName, expectedHeaderValue1); put("Host", expectedHost);
    }};
    mockHeaders(request, expectedHeaders);
    mockSingleUrlParam(request, paramName, expectedUrlParamValue1);
    Object[] params = paramParser.parseParameterFor(routeId1, exchange, e -> e.getResourceMode() == 0);
    assertThat(params.length).isEqualTo(4);
    assertThat(params[routeRule1.getParamItem().getIndex()]).isEqualTo(expectedAddress);
    assertThat(params[routeRule2.getParamItem().getIndex()]).isEqualTo(expectedHeaderValue1);
    assertThat(params[routeRule3.getParamItem().getIndex()]).isEqualTo(expectedUrlParamValue1);
    assertThat(params[routeRule4.getParamItem().getIndex()]).isEqualTo(expectedHost);

    assertThat(paramParser.parseParameterFor(api1, exchange, e -> e.getResourceMode() == 0).length).isZero();

    String expectedUrlParamValue2 = "fs";
    mockSingleUrlParam(request, paramName, expectedUrlParamValue2);
    params = paramParser.parseParameterFor(api1, exchange, e -> e.getResourceMode() == 1);
    assertThat(params.length).isEqualTo(1);
    assertThat(params[apiRule1.getParamItem().getIndex()]).isEqualTo(expectedUrlParamValue2);
}
 
示例30
public synchronized static WritableDataSource<Set<GatewayFlowRule>> getWritableDataSource() {
    return gatewayFlowWds;
}