From 9e759e05b5fd6a8e4bd1b3ec4ad71aae9c985345 Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Tue, 30 Jul 2019 13:59:53 +0800 Subject: [PATCH] sentinel HTTP_METHOD_SPECIFY --- .../src/main/resources/application.properties | 2 +- .../converter/SentinelConverter.java | 61 ++++++------------- .../cloud/sentinel/SentinelProperties.java | 13 ++++ .../SentinelWebAutoConfiguration.java | 2 + 4 files changed, 33 insertions(+), 45 deletions(-) diff --git a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties index d7e86771..70bdf0ab 100644 --- a/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/src/main/resources/application.properties @@ -3,7 +3,7 @@ server.port=18083 management.security.enabled=false spring.cloud.sentinel.transport.dashboard=localhost:8080 spring.cloud.sentinel.eager=true - +#spring.cloud.sentinel.http-method-specify=false spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json spring.cloud.sentinel.datasource.ds1.file.data-type=json diff --git a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java index 1c1da8b8..3c739dea 100644 --- a/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java +++ b/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/converter/SentinelConverter.java @@ -16,6 +16,7 @@ package com.alibaba.cloud.sentinel.datasource.converter; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -26,17 +27,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; -import com.alibaba.cloud.sentinel.datasource.RuleType; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; -import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleUtil; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.system.SystemRule; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -87,59 +84,35 @@ public abstract class SentinelConverter List sourceArray = objectMapper.readValue(source, new TypeReference>() { }); - for (Object obj : sourceArray) { String item = null; try { item = objectMapper.writeValueAsString(obj); + Object rule = convertRule(item); + if (rule != null) { + ruleCollection.add(rule); + } } - catch (JsonProcessingException e) { - // won't be happen + catch (IOException e) { + log.error("sentinel rule convert error: " + e.getMessage(), e); + throw new IllegalArgumentException( + "sentinel rule convert error: " + e.getMessage(), e); } - - Object rule = convertRule(item); - if (rule != null) { - ruleCollection.add(rule); - } - - } - - if (ruleCollection.size() != sourceArray.size()) { - throw new IllegalArgumentException("convert " + ruleCollection.size() - + " rules but there are " + sourceArray.size() - + " rules from datasource. RuleClass: " - + ruleClass.getSimpleName()); } } catch (Exception e) { - throw new RuntimeException("convert error: " + e.getMessage(), e); + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + else { + throw new RuntimeException("convert error: " + e.getMessage(), e); + } } return ruleCollection; } - private Object convertRule(String ruleStr) { - try { - final Object rule = objectMapper.readValue(ruleStr, ruleClass); - RuleType ruleType = RuleType.getByClass(ruleClass); - switch (ruleType) { - case FLOW: - if (!FlowRuleUtil.isValidRule((FlowRule) rule)) { - return null; - } - break; - case DEGRADE: - if (!DegradeRuleManager.isValidRule((DegradeRule) rule)) { - return null; - } - default: - break; - } - return rule; - } - catch (Exception e) { - // ignore - } - return null; + private Object convertRule(String ruleStr) throws IOException { + return objectMapper.readValue(ruleStr, ruleClass); } } diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java index 9be56ddc..12f50dac 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java @@ -92,6 +92,11 @@ public class SentinelProperties { */ private Log log = new Log(); + /** + * Add HTTP method prefix for Sentinel Resource. + */ + private Boolean httpMethodSpecify = false; + public boolean isEager() { return eager; } @@ -164,6 +169,14 @@ public class SentinelProperties { this.log = log; } + public Boolean getHttpMethodSpecify() { + return httpMethodSpecify; + } + + public void setHttpMethodSpecify(Boolean httpMethodSpecify) { + this.httpMethodSpecify = httpMethodSpecify; + } + public static class Flow { /** diff --git a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java index 9ee3c934..a58ce8cb 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java @@ -66,6 +66,8 @@ public class SentinelWebAutoConfiguration { Filter filter = new CommonFilter(); registration.setFilter(filter); registration.setOrder(filterConfig.getOrder()); + registration.addInitParameter("HTTP_METHOD_SPECIFY", + String.valueOf(properties.getHttpMethodSpecify())); log.info("[Sentinel Starter] register Sentinel with urlPatterns: {}.", filterConfig.getUrlPatterns()); return registration;