diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java index eb1f2be77..49460a984 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java @@ -29,82 +29,244 @@ import org.springframework.core.Ordered; @ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX) public class SentinelProperties { - /** - * Enable sentinel auto configure, the default value is true - */ - private boolean enabled = true; - - /** - * sentinel api port,default value is 8721 - */ - private String port = "8721"; - - /** - * Sentinel dashboard address, won't try to connect dashboard when address is empty - */ - private String dashboard = ""; - - @NestedConfigurationProperty - private Filter filter; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - - public String getDashboard() { - return dashboard; - } - - public void setDashboard(String dashboard) { - this.dashboard = dashboard; - } - - public Filter getFilter() { - return filter; - } - - public void setFilter(Filter filter) { - this.filter = filter; - } - - public static class Filter { - - /** - * Sentinel filter chain order. - */ - private int order = Ordered.HIGHEST_PRECEDENCE; - - /** - * URL pattern for sentinel filter,default is /* - */ - private List urlPatterns; - - public int getOrder() { - return this.order; - } - - public void setOrder(int order) { - this.order = order; - } - - public List getUrlPatterns() { - return urlPatterns; - } - - public void setUrlPatterns(List urlPatterns) { - this.urlPatterns = urlPatterns; - } - } + /** + * 是否提前初始化心跳连接 + */ + private boolean eager = false; + + /** + * Enable sentinel auto configure, the default value is true + */ + private boolean enabled = true; + + /** + * 字符编码集 + */ + private String charset = "UTF-8"; + + /** + * 通信相关配置 + */ + @NestedConfigurationProperty + private Transport transport = new Transport(); + + /** + * 监控数据相关配置 + */ + @NestedConfigurationProperty + private Metric metric = new Metric(); + + /** + * web 相关配置 + */ + @NestedConfigurationProperty + private Servlet servlet = new Servlet(); + + /** + * 限流相关 + */ + @NestedConfigurationProperty + private Filter filter = new Filter(); + + @NestedConfigurationProperty + private Flow flow = new Flow(); + + public boolean isEager() { + return eager; + } + + public void setEager(boolean eager) { + this.eager = eager; + } + + public Flow getFlow() { + return flow; + } + + public void setFlow(Flow flow) { + this.flow = flow; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public Transport getTransport() { + return transport; + } + + public void setTransport(Transport transport) { + this.transport = transport; + } + + public Metric getMetric() { + return metric; + } + + public void setMetric(Metric metric) { + this.metric = metric; + } + + public Servlet getServlet() { + return servlet; + } + + public void setServlet(Servlet servlet) { + this.servlet = servlet; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + + public static class Flow { + + /** + * 限流冷启动因子 + */ + private String coldFactor = "3"; + + public String getColdFactor() { + return coldFactor; + } + + public void setColdFactor(String coldFactor) { + this.coldFactor = coldFactor; + } + + } + + public static class Servlet { + + /** + * url 限流后的处理页面 + */ + private String blockPage; + + public String getBlockPage() { + return blockPage; + } + + public void setBlockPage(String blockPage) { + this.blockPage = blockPage; + } + } + + public static class Metric { + + /** + * 监控数据写磁盘时单个文件的大小 + */ + private String fileSingleSize; + + /** + * 监控数据在磁盘上的总数量 + */ + private String fileTotalCount; + + public String getFileSingleSize() { + return fileSingleSize; + } + + public void setFileSingleSize(String fileSingleSize) { + this.fileSingleSize = fileSingleSize; + } + + public String getFileTotalCount() { + return fileTotalCount; + } + + public void setFileTotalCount(String fileTotalCount) { + this.fileTotalCount = fileTotalCount; + } + } + + public static class Transport { + + /** + * sentinel api port,default value is 8721 + */ + private String port = "8721"; + + /** + * Sentinel dashboard address, won't try to connect dashboard when address is + * empty + */ + private String dashboard = ""; + + /** + * 客户端和DashBord心跳发送时间 + */ + private String heartbeatIntervalMs; + + public String getHeartbeatIntervalMs() { + return heartbeatIntervalMs; + } + + public void setHeartbeatIntervalMs(String heartbeatIntervalMs) { + this.heartbeatIntervalMs = heartbeatIntervalMs; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getDashboard() { + return dashboard; + } + + public void setDashboard(String dashboard) { + this.dashboard = dashboard; + } + + } + + public static class Filter { + + /** + * Sentinel filter chain order. + */ + private int order = Ordered.HIGHEST_PRECEDENCE; + + /** + * URL pattern for sentinel filter,default is /* + */ + private List urlPatterns; + + public int getOrder() { + return this.order; + } + + public void setOrder(int order) { + this.order = order; + } + + public List getUrlPatterns() { + return urlPatterns; + } + + public void setUrlPatterns(List urlPatterns) { + this.urlPatterns = urlPatterns; + } + } } diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java index d588e3372..ee8e9b8cd 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java @@ -21,6 +21,8 @@ import java.util.List; import javax.servlet.Filter; +import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +33,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; - /** * @author xiaojing */ @@ -41,37 +41,39 @@ import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; @ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true) @EnableConfigurationProperties(SentinelProperties.class) public class SentinelWebAutoConfiguration { - private static final Logger logger = LoggerFactory - .getLogger(SentinelWebAutoConfiguration.class); - @Autowired - private SentinelProperties properties; + private static final Logger logger = LoggerFactory + .getLogger(SentinelWebAutoConfiguration.class); + + @Autowired + private SentinelProperties properties; + + @Bean + public FilterRegistrationBean servletRequestListener() { + FilterRegistrationBean registration = new FilterRegistrationBean(); - @Bean - public FilterRegistrationBean servletRequestListener() { - FilterRegistrationBean registration = new FilterRegistrationBean(); + SentinelProperties.Filter filterConfig = properties.getFilter(); - SentinelProperties.Filter filterConfig = properties.getFilter(); + if (null == filterConfig) { + filterConfig = new SentinelProperties.Filter(); + properties.setFilter(filterConfig); + } - if (null == filterConfig) { - filterConfig = new SentinelProperties.Filter(); - properties.setFilter(filterConfig); - } + if (filterConfig.getUrlPatterns() == null + || filterConfig.getUrlPatterns().isEmpty()) { + List defaultPatterns = new ArrayList<>(); + defaultPatterns.add("/*"); + filterConfig.setUrlPatterns(defaultPatterns); + } - if (filterConfig.getUrlPatterns() == null - || filterConfig.getUrlPatterns().isEmpty()) { - List defaultPatterns = new ArrayList<>(); - defaultPatterns.add("/*"); - filterConfig.setUrlPatterns(defaultPatterns); - } + registration.addUrlPatterns(filterConfig.getUrlPatterns().toArray(new String[0])); + Filter filter = new CommonFilter(); + registration.setFilter(filter); + registration.setOrder(filterConfig.getOrder()); + logger.info("[Sentinel Starter] register Sentinel with urlPatterns: {}.", + filterConfig.getUrlPatterns()); + return registration; - registration.addUrlPatterns(filterConfig.getUrlPatterns().toArray(new String[0])); - Filter filter = new CommonFilter(); - registration.setFilter(filter); - registration.setOrder(filterConfig.getOrder()); - logger.info("[Sentinel Starter] register Sentinel with urlPatterns: {}.", - filterConfig.getUrlPatterns()); - return registration; + } - } } \ No newline at end of file diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java index 2191f6a32..9112781b4 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java @@ -16,8 +16,18 @@ package org.springframework.cloud.alibaba.sentinel.custom; +import javax.annotation.PostConstruct; + +import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler; +import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner; +import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager; +import com.alibaba.csp.sentinel.adapter.servlet.config.WebServletConfig; +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.config.SentinelConfig; +import com.alibaba.csp.sentinel.init.InitExecutor; import com.alibaba.csp.sentinel.transport.config.TransportConfig; import com.alibaba.csp.sentinel.util.AppNameUtil; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -29,11 +39,6 @@ import org.springframework.cloud.alibaba.sentinel.datasource.SentinelDataSourceP import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; -import org.springframework.web.client.RestTemplate; - -import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; - -import javax.annotation.PostConstruct; /** * @author xiaojing @@ -49,16 +54,69 @@ public class SentinelAutoConfiguration { @Autowired private SentinelProperties properties; + @Autowired(required = false) + private UrlCleaner urlCleaner; + + @Autowired(required = false) + private UrlBlockHandler urlBlockHandler; + @PostConstruct private void init() { - if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME))) { + if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME)) + && StringUtils.hasText(projectName)) { System.setProperty(AppNameUtil.APP_NAME, projectName); } - if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT))) { - System.setProperty(TransportConfig.SERVER_PORT, properties.getPort()); + if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT)) + && StringUtils.hasText(properties.getTransport().getPort())) { + System.setProperty(TransportConfig.SERVER_PORT, + properties.getTransport().getPort()); + } + if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER)) + && StringUtils.hasText(properties.getTransport().getDashboard())) { + System.setProperty(TransportConfig.CONSOLE_SERVER, + properties.getTransport().getDashboard()); } - if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER))) { - System.setProperty(TransportConfig.CONSOLE_SERVER, properties.getDashboard()); + if (StringUtils.isEmpty(System.getProperty(TransportConfig.HEARTBEAT_INTERVAL_MS)) + && StringUtils + .hasText(properties.getTransport().getHeartbeatIntervalMs())) { + System.setProperty(TransportConfig.HEARTBEAT_INTERVAL_MS, + properties.getTransport().getHeartbeatIntervalMs()); + } + if (StringUtils.isEmpty(System.getProperty(SentinelConfig.CHARSET)) + && StringUtils.hasText(properties.getCharset())) { + System.setProperty(SentinelConfig.CHARSET, properties.getCharset()); + } + if (StringUtils + .isEmpty(System.getProperty(SentinelConfig.SINGLE_METRIC_FILE_SIZE)) + && StringUtils.hasText(properties.getMetric().getFileSingleSize())) { + System.setProperty(SentinelConfig.SINGLE_METRIC_FILE_SIZE, + properties.getMetric().getFileSingleSize()); + } + if (StringUtils + .isEmpty(System.getProperty(SentinelConfig.TOTAL_METRIC_FILE_COUNT)) + && StringUtils.hasText(properties.getMetric().getFileTotalCount())) { + System.setProperty(SentinelConfig.TOTAL_METRIC_FILE_COUNT, + properties.getMetric().getFileTotalCount()); + } + if (StringUtils.isEmpty(System.getProperty(SentinelConfig.COLD_FACTOR)) + && StringUtils.hasText(properties.getFlow().getColdFactor())) { + System.setProperty(SentinelConfig.COLD_FACTOR, + properties.getFlow().getColdFactor()); + } + + if (StringUtils.hasText(properties.getServlet().getBlockPage())) { + WebServletConfig.setBlockPage(properties.getServlet().getBlockPage()); + } + if (urlBlockHandler != null) { + WebCallbackManager.setUrlBlockHandler(urlBlockHandler); + } + if (urlCleaner != null) { + WebCallbackManager.setUrlCleaner(urlCleaner); + } + + // earlier initialize + if (properties.isEager()) { + InitExecutor.doInit(); } } diff --git a/spring-cloud-alibaba-sentinel/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java b/spring-cloud-alibaba-sentinel/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java index 0494216bf..957e2a6a3 100644 --- a/spring-cloud-alibaba-sentinel/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java +++ b/spring-cloud-alibaba-sentinel/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.cloud.alibaba.sentinel; import com.alibaba.csp.sentinel.slots.block.BlockException; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -33,7 +34,6 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon import static org.assertj.core.api.Assertions.assertThat; - /** * @author fangjian */ @@ -43,9 +43,10 @@ public class SentinelAutoConfigurationTests { @Before public void init() { - context.register(SentinelAutoConfiguration.class, SentinelWebAutoConfiguration.class, SentinelTestConfiguration.class); + context.register(SentinelAutoConfiguration.class, SentinelWebAutoConfiguration.class, + SentinelTestConfiguration.class); EnvironmentTestUtils.addEnvironment(this.context, - "spring.cloud.sentinel.port=8888", + "spring.cloud.sentinel.transport.port=8888", "spring.cloud.sentinel.filter.order=123", "spring.cloud.sentinel.filter.urlPatterns=/*,/test"); this.context.refresh(); @@ -65,14 +66,14 @@ public class SentinelAutoConfigurationTests { @Test public void testBeanPostProcessor() { assertThat(context.getBean("sentinelBeanPostProcessor") - .getClass() == SentinelBeanPostProcessor.class).isTrue(); + .getClass() == SentinelBeanPostProcessor.class).isTrue(); } @Test public void testProperties() { SentinelProperties sentinelProperties = context.getBean(SentinelProperties.class); assertThat(sentinelProperties).isNotNull(); - assertThat(sentinelProperties.getPort()).isEqualTo("8888"); + assertThat(sentinelProperties.getTransport().getPort()).isEqualTo("8888"); assertThat(sentinelProperties.getFilter().getUrlPatterns().size()).isEqualTo(2); assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0)).isEqualTo("/*"); assertThat(sentinelProperties.getFilter().getUrlPatterns().get(1)).isEqualTo("/test"); @@ -82,10 +83,10 @@ public class SentinelAutoConfigurationTests { public void testRestTemplate() { assertThat(context.getBeansOfType(RestTemplate.class).size()).isEqualTo(2); RestTemplate restTemplate = context.getBean("restTemplateWithBlockClass", - RestTemplate.class); + RestTemplate.class); assertThat(restTemplate.getInterceptors().size()).isEqualTo(1); assertThat(restTemplate.getInterceptors().get(0).getClass()) - .isEqualTo(SentinelProtectInterceptor.class); + .isEqualTo(SentinelProtectInterceptor.class); } @Configuration @@ -111,5 +112,4 @@ public class SentinelAutoConfigurationTests { } } - }