1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00

sentinel support more properties in springboot 1.x

This commit is contained in:
fangjian0423 2018-10-11 22:14:21 +08:00
parent c8d911e89b
commit e0382d9876
4 changed files with 328 additions and 106 deletions

View File

@ -29,82 +29,244 @@ import org.springframework.core.Ordered;
@ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX) @ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX)
public class SentinelProperties { public class SentinelProperties {
/** /**
* Enable sentinel auto configure, the default value is true * 是否提前初始化心跳连接
*/ */
private boolean enabled = true; private boolean eager = false;
/** /**
* sentinel api port,default value is 8721 * Enable sentinel auto configure, the default value is true
*/ */
private String port = "8721"; private boolean enabled = true;
/** /**
* Sentinel dashboard address, won't try to connect dashboard when address is empty * 字符编码集
*/ */
private String dashboard = ""; private String charset = "UTF-8";
@NestedConfigurationProperty /**
private Filter filter; * 通信相关配置
*/
@NestedConfigurationProperty
private Transport transport = new Transport();
public boolean isEnabled() { /**
return enabled; * 监控数据相关配置
} */
@NestedConfigurationProperty
private Metric metric = new Metric();
public void setEnabled(boolean enabled) { /**
this.enabled = enabled; * web 相关配置
} */
@NestedConfigurationProperty
private Servlet servlet = new Servlet();
public String getPort() { /**
return port; * 限流相关
} */
@NestedConfigurationProperty
private Filter filter = new Filter();
public void setPort(String port) { @NestedConfigurationProperty
this.port = port; private Flow flow = new Flow();
}
public String getDashboard() { public boolean isEager() {
return dashboard; return eager;
} }
public void setDashboard(String dashboard) { public void setEager(boolean eager) {
this.dashboard = dashboard; this.eager = eager;
} }
public Filter getFilter() { public Flow getFlow() {
return filter; return flow;
} }
public void setFilter(Filter filter) { public void setFlow(Flow flow) {
this.filter = filter; this.flow = flow;
} }
public static class Filter { public String getCharset() {
return charset;
}
/** public void setCharset(String charset) {
* Sentinel filter chain order. this.charset = charset;
*/ }
private int order = Ordered.HIGHEST_PRECEDENCE;
/** public Transport getTransport() {
* URL pattern for sentinel filter,default is /* return transport;
*/ }
private List<String> urlPatterns;
public int getOrder() { public void setTransport(Transport transport) {
return this.order; this.transport = transport;
} }
public void setOrder(int order) { public Metric getMetric() {
this.order = order; return metric;
} }
public List<String> getUrlPatterns() { public void setMetric(Metric metric) {
return urlPatterns; this.metric = metric;
} }
public void setUrlPatterns(List<String> urlPatterns) { public Servlet getServlet() {
this.urlPatterns = urlPatterns; 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<String> urlPatterns;
public int getOrder() {
return this.order;
}
public void setOrder(int order) {
this.order = order;
}
public List<String> getUrlPatterns() {
return urlPatterns;
}
public void setUrlPatterns(List<String> urlPatterns) {
this.urlPatterns = urlPatterns;
}
}
} }

View File

@ -21,6 +21,8 @@ import java.util.List;
import javax.servlet.Filter; import javax.servlet.Filter;
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
/** /**
* @author xiaojing * @author xiaojing
*/ */
@ -41,37 +41,39 @@ import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
@ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true) @ConditionalOnProperty(name = "spring.cloud.sentinel.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SentinelProperties.class) @EnableConfigurationProperties(SentinelProperties.class)
public class SentinelWebAutoConfiguration { public class SentinelWebAutoConfiguration {
private static final Logger logger = LoggerFactory
.getLogger(SentinelWebAutoConfiguration.class);
@Autowired private static final Logger logger = LoggerFactory
private SentinelProperties properties; .getLogger(SentinelWebAutoConfiguration.class);
@Bean @Autowired
public FilterRegistrationBean servletRequestListener() { private SentinelProperties properties;
FilterRegistrationBean registration = new FilterRegistrationBean();
SentinelProperties.Filter filterConfig = properties.getFilter(); @Bean
public FilterRegistrationBean servletRequestListener() {
FilterRegistrationBean registration = new FilterRegistrationBean();
if (null == filterConfig) { SentinelProperties.Filter filterConfig = properties.getFilter();
filterConfig = new SentinelProperties.Filter();
properties.setFilter(filterConfig);
}
if (filterConfig.getUrlPatterns() == null if (null == filterConfig) {
|| filterConfig.getUrlPatterns().isEmpty()) { filterConfig = new SentinelProperties.Filter();
List<String> defaultPatterns = new ArrayList<>(); properties.setFilter(filterConfig);
defaultPatterns.add("/*"); }
filterConfig.setUrlPatterns(defaultPatterns);
}
registration.addUrlPatterns(filterConfig.getUrlPatterns().toArray(new String[0])); if (filterConfig.getUrlPatterns() == null
Filter filter = new CommonFilter(); || filterConfig.getUrlPatterns().isEmpty()) {
registration.setFilter(filter); List<String> defaultPatterns = new ArrayList<>();
registration.setOrder(filterConfig.getOrder()); defaultPatterns.add("/*");
logger.info("[Sentinel Starter] register Sentinel with urlPatterns: {}.", filterConfig.setUrlPatterns(defaultPatterns);
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;
}
}
} }

View File

@ -16,8 +16,18 @@
package org.springframework.cloud.alibaba.sentinel.custom; 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.transport.config.TransportConfig;
import com.alibaba.csp.sentinel.util.AppNameUtil; import com.alibaba.csp.sentinel.util.AppNameUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils; 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 * @author xiaojing
@ -49,16 +54,69 @@ public class SentinelAutoConfiguration {
@Autowired @Autowired
private SentinelProperties properties; private SentinelProperties properties;
@Autowired(required = false)
private UrlCleaner urlCleaner;
@Autowired(required = false)
private UrlBlockHandler urlBlockHandler;
@PostConstruct @PostConstruct
private void init() { 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); System.setProperty(AppNameUtil.APP_NAME, projectName);
} }
if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT))) { if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT))
System.setProperty(TransportConfig.SERVER_PORT, properties.getPort()); && StringUtils.hasText(properties.getTransport().getPort())) {
System.setProperty(TransportConfig.SERVER_PORT,
properties.getTransport().getPort());
} }
if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER))) { if (StringUtils.isEmpty(System.getProperty(TransportConfig.CONSOLE_SERVER))
System.setProperty(TransportConfig.CONSOLE_SERVER, properties.getDashboard()); && 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(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();
} }
} }

View File

@ -17,6 +17,7 @@
package org.springframework.cloud.alibaba.sentinel; package org.springframework.cloud.alibaba.sentinel;
import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -33,7 +34,6 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
* @author fangjian * @author fangjian
*/ */
@ -43,9 +43,10 @@ public class SentinelAutoConfigurationTests {
@Before @Before
public void init() { public void init() {
context.register(SentinelAutoConfiguration.class, SentinelWebAutoConfiguration.class, SentinelTestConfiguration.class); context.register(SentinelAutoConfiguration.class, SentinelWebAutoConfiguration.class,
SentinelTestConfiguration.class);
EnvironmentTestUtils.addEnvironment(this.context, 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.order=123",
"spring.cloud.sentinel.filter.urlPatterns=/*,/test"); "spring.cloud.sentinel.filter.urlPatterns=/*,/test");
this.context.refresh(); this.context.refresh();
@ -65,14 +66,14 @@ public class SentinelAutoConfigurationTests {
@Test @Test
public void testBeanPostProcessor() { public void testBeanPostProcessor() {
assertThat(context.getBean("sentinelBeanPostProcessor") assertThat(context.getBean("sentinelBeanPostProcessor")
.getClass() == SentinelBeanPostProcessor.class).isTrue(); .getClass() == SentinelBeanPostProcessor.class).isTrue();
} }
@Test @Test
public void testProperties() { public void testProperties() {
SentinelProperties sentinelProperties = context.getBean(SentinelProperties.class); SentinelProperties sentinelProperties = context.getBean(SentinelProperties.class);
assertThat(sentinelProperties).isNotNull(); 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().size()).isEqualTo(2);
assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0)).isEqualTo("/*"); assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0)).isEqualTo("/*");
assertThat(sentinelProperties.getFilter().getUrlPatterns().get(1)).isEqualTo("/test"); assertThat(sentinelProperties.getFilter().getUrlPatterns().get(1)).isEqualTo("/test");
@ -82,10 +83,10 @@ public class SentinelAutoConfigurationTests {
public void testRestTemplate() { public void testRestTemplate() {
assertThat(context.getBeansOfType(RestTemplate.class).size()).isEqualTo(2); assertThat(context.getBeansOfType(RestTemplate.class).size()).isEqualTo(2);
RestTemplate restTemplate = context.getBean("restTemplateWithBlockClass", RestTemplate restTemplate = context.getBean("restTemplateWithBlockClass",
RestTemplate.class); RestTemplate.class);
assertThat(restTemplate.getInterceptors().size()).isEqualTo(1); assertThat(restTemplate.getInterceptors().size()).isEqualTo(1);
assertThat(restTemplate.getInterceptors().get(0).getClass()) assertThat(restTemplate.getInterceptors().get(0).getClass())
.isEqualTo(SentinelProtectInterceptor.class); .isEqualTo(SentinelProtectInterceptor.class);
} }
@Configuration @Configuration
@ -111,5 +112,4 @@ public class SentinelAutoConfigurationTests {
} }
} }
} }