com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule Java Examples

The following examples show how to use com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #2
Source File: SentinelApiClient.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 6 votes vote down vote up
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);
    }
}
 
Example #3
Source File: SpringCloudGatewayParamParserTest.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #4
Source File: UpdateGatewayRuleCommandHandler.java    From Sentinel with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #5
Source File: UpdateGatewayRuleCommandHandler.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #6
Source File: SentinelApiClient.java    From Sentinel with Apache License 2.0 6 votes vote down vote up
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);
    }
}
 
Example #7
Source File: SpringCloudGatewayParamParserTest.java    From Sentinel with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #8
Source File: GatewayParamParserTest.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 6 votes vote down vote up
@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);
}
 
Example #9
Source File: SentinelConfig.java    From lion with Apache License 2.0 6 votes vote down vote up
/**
 * 初始化限流规则(或在 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);
}
 
Example #10
Source File: GatewayFlowRuleEntity.java    From Sentinel with Apache License 2.0 5 votes vote down vote up
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;
}
 
Example #11
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 5 votes vote down vote up
@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");
}
 
Example #12
Source File: GatewayFlowRuleEntity.java    From Sentinel with Apache License 2.0 5 votes vote down vote up
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;
}
 
Example #13
Source File: GatewayConfiguration.java    From spring-cloud-sofastack-samples with Apache License 2.0 5 votes vote down vote up
/**
 * rules
 */
private void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("biz-web")
    // 限流阈值
        .setCount(10)
        // 统计时间窗口,单位是秒,默认是 1 秒
        .setIntervalSec(1));
    GatewayRuleManager.loadRules(rules);
}
 
Example #14
Source File: SentinelZuulPreFilter.java    From Sentinel with Apache License 2.0 5 votes vote down vote up
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);
}
 
Example #15
Source File: SentinelZuulPreFilter.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 5 votes vote down vote up
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);
}
 
Example #16
Source File: GatewayFlowRuleEntity.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 5 votes vote down vote up
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;
}
 
Example #17
Source File: GatewayFlowRuleEntity.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 5 votes vote down vote up
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;
}
 
Example #18
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@Override
public boolean test(GatewayFlowRule e) {
    return e.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME;
}
 
Example #19
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@Override
public boolean test(GatewayFlowRule e) {
    return e.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID;
}
 
Example #20
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@After
public void tearDown() {
    GatewayApiDefinitionManager.loadApiDefinitions(new HashSet<ApiDefinition>());
    GatewayRuleManager.loadRules(new HashSet<GatewayFlowRule>());
    GatewayRegexCache.clear();
}
 
Example #21
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@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);
}
 
Example #22
Source File: GatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@Before
public void setUp() {
    GatewayApiDefinitionManager.loadApiDefinitions(new HashSet<ApiDefinition>());
    GatewayRuleManager.loadRules(new HashSet<GatewayFlowRule>());
    GatewayRegexCache.clear();
}
 
Example #23
Source File: SentinelGatewayAutoConfiguration.java    From spring-cloud-alibaba with Apache License 2.0 4 votes vote down vote up
@Bean("sentinel-xml-gw-flow-converter")
public XmlConverter xmlGatewayFlowConverter() {
	return new XmlConverter(xmlMapper, GatewayFlowRule.class);
}
 
Example #24
Source File: RulesWebFluxController.java    From spring-cloud-alibaba with Apache License 2.0 4 votes vote down vote up
@GetMapping("/gateway")
public Mono<Set<GatewayFlowRule>> apiGateway() {
	return Mono.just(GatewayRuleManager.getRules());
}
 
Example #25
Source File: RulesController.java    From spring-cloud-alibaba with Apache License 2.0 4 votes vote down vote up
@GetMapping("/gateway")
public Set<GatewayFlowRule> apiGateway() {
	return GatewayRuleManager.getRules();
}
 
Example #26
Source File: SentinelGatewayAutoConfiguration.java    From spring-cloud-alibaba with Apache License 2.0 4 votes vote down vote up
@Bean("sentinel-json-gw-flow-converter")
public JsonConverter jsonGatewayFlowConverter() {
	return new JsonConverter(objectMapper, GatewayFlowRule.class);
}
 
Example #27
Source File: GatewayRuleConfig.java    From Sentinel-Dashboard-Nacos with Apache License 2.0 4 votes vote down vote up
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);
}
 
Example #28
Source File: UpdateGatewayRuleCommandHandler.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
public synchronized static void setWritableDataSource(WritableDataSource<Set<GatewayFlowRule>> gatewayFlowWds) {
    UpdateGatewayRuleCommandHandler.gatewayFlowWds = gatewayFlowWds;
}
 
Example #29
Source File: UpdateGatewayRuleCommandHandler.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
public synchronized static WritableDataSource<Set<GatewayFlowRule>> getWritableDataSource() {
    return gatewayFlowWds;
}
 
Example #30
Source File: SpringCloudGatewayParamParserTest.java    From Sentinel with Apache License 2.0 4 votes vote down vote up
@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);
}