diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java index eb1f2be77..8e51c8553 100644 --- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java +++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelProperties.java @@ -16,12 +16,12 @@ package org.springframework.cloud.alibaba.sentinel; -import java.util.List; - import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.core.Ordered; +import java.util.List; + /** * @author xiaojing * @author hengyunabc @@ -29,82 +29,245 @@ 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"; + /** + * 是否提前初始化心跳连接 + */ + 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 = ""; + /** + * Sentinel dashboard address, won't try to connect dashboard when address is empty + */ + private String dashboard = ""; - @NestedConfigurationProperty - private Filter filter; + /** + * 客户端和DashBord心跳发送时间 + */ + private String heartbeatIntervalMs; - public boolean isEnabled() { - return enabled; - } + public String getHeartbeatIntervalMs() { + return heartbeatIntervalMs; + } - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } + public void setHeartbeatIntervalMs(String heartbeatIntervalMs) { + this.heartbeatIntervalMs = heartbeatIntervalMs; + } - public String getPort() { - return port; - } + public String getPort() { + return port; + } - public void setPort(String port) { - this.port = port; - } + public void setPort(String port) { + this.port = port; + } - public String getDashboard() { - return dashboard; - } + public String getDashboard() { + return dashboard; + } - public void setDashboard(String dashboard) { - this.dashboard = 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 { - public static class Filter { + /** + * Sentinel filter chain order. + */ + private int order = Ordered.HIGHEST_PRECEDENCE; - /** - * Sentinel filter chain order. - */ - private int order = Ordered.HIGHEST_PRECEDENCE; + /** + * URL pattern for sentinel filter,default is /* + */ + private List urlPatterns; - /** - * URL pattern for sentinel filter,default is /* - */ - private List urlPatterns; + public int getOrder() { + return this.order; + } - public int getOrder() { - return this.order; - } + public void setOrder(int order) { + this.order = order; + } - public void setOrder(int order) { - this.order = order; - } + public List getUrlPatterns() { + return urlPatterns; + } - public List getUrlPatterns() { - return urlPatterns; - } + public void setUrlPatterns(List urlPatterns) { + this.urlPatterns = urlPatterns; + } + } - public void setUrlPatterns(List urlPatterns) { - this.urlPatterns = urlPatterns; - } - } } diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java index f982e8ceb..967819add 100644 --- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/SentinelWebAutoConfiguration.java @@ -16,22 +16,28 @@ package org.springframework.cloud.alibaba.sentinel; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.Filter; - +import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; +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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; -import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; +import javax.annotation.PostConstruct; +import javax.servlet.Filter; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; /** * @author xiaojing @@ -42,37 +48,63 @@ import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; @EnableConfigurationProperties(SentinelProperties.class) public class SentinelWebAutoConfiguration { - private static final Logger logger = LoggerFactory - .getLogger(SentinelWebAutoConfiguration.class); + private static final Logger logger = LoggerFactory + .getLogger(SentinelWebAutoConfiguration.class); + + @Autowired + private SentinelProperties properties; + + @Autowired + @Qualifier + private Optional urlBlockHandlerOptional; + + @Autowired + @Qualifier + private Optional urlCleanerOptional; + + @PostConstruct + public void init() { + + if (urlBlockHandlerOptional.isPresent()) { + WebCallbackManager.setUrlBlockHandler(urlBlockHandlerOptional.get()); + } + + if (urlCleanerOptional.isPresent()) { + WebCallbackManager.setUrlCleaner(urlCleanerOptional.get()); + } + + if (StringUtils.hasText(properties.getServlet().getBlockPage())) { + WebServletConfig.setBlockPage(properties.getServlet().getBlockPage()); + } + + } - @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-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java index 623422926..98b3a6ddd 100644 --- a/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java @@ -16,6 +16,10 @@ package org.springframework.cloud.alibaba.sentinel.custom; +import com.alibaba.csp.sentinel.Env; +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.config.SentinelConfig; +import com.alibaba.csp.sentinel.node.NodeBuilder; import com.alibaba.csp.sentinel.transport.config.TransportConfig; import com.alibaba.csp.sentinel.util.AppNameUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -29,9 +33,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; @@ -51,34 +52,57 @@ public class SentinelAutoConfiguration { @PostConstruct private void init() { + if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME))) { 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.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(TransportConfig.CONSOLE_SERVER))) { - System.setProperty(TransportConfig.CONSOLE_SERVER, properties.getDashboard()); + 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 (properties.isEager()) { + // 加载Env + NodeBuilder nodeBuilder = Env.nodeBuilder; + } + } - @Bean - @ConditionalOnMissingBean - public SentinelResourceAspect sentinelResourceAspect() { - return new SentinelResourceAspect(); - } + @Bean + @ConditionalOnMissingBean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } - @Bean - @ConditionalOnMissingBean - @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate") - public SentinelBeanPostProcessor sentinelBeanPostProcessor() { - return new SentinelBeanPostProcessor(); - } + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate") + public SentinelBeanPostProcessor sentinelBeanPostProcessor() { + return new SentinelBeanPostProcessor(); + } - @Bean - @ConditionalOnMissingBean - public SentinelDataSourcePostProcessor sentinelDataSourcePostProcessor() { - return new SentinelDataSourcePostProcessor(); - } + @Bean + @ConditionalOnMissingBean + public SentinelDataSourcePostProcessor sentinelDataSourcePostProcessor() { + return new SentinelDataSourcePostProcessor(); + } } diff --git a/spring-cloud-alibaba-sentinel-autoconfigure/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java b/spring-cloud-alibaba-sentinel-autoconfigure/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java index 29fbc8ee2..521e7d7c9 100644 --- a/spring-cloud-alibaba-sentinel-autoconfigure/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java +++ b/spring-cloud-alibaba-sentinel-autoconfigure/src/test/java/org/springframework/cloud/alibaba/sentinel/SentinelAutoConfigurationTests.java @@ -65,7 +65,7 @@ public class SentinelAutoConfigurationTests { this.contextRunner.run(context -> { SentinelProperties sentinelProperties = context .getBean(SentinelProperties.class); - assertThat(sentinelProperties.getPort()).isEqualTo("8888"); + assertThat(sentinelProperties.getTransport().getPort()).isEqualTo("8888"); assertThat(sentinelProperties.getFilter().getUrlPatterns().size()) .isEqualTo(2); assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0))