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

支持更多Sentinel配置

This commit is contained in:
xiejiashuai 2018-09-08 13:07:30 +08:00
parent 31864b34d4
commit ee4d802f8c
4 changed files with 337 additions and 118 deletions

View File

@ -16,12 +16,12 @@
package org.springframework.cloud.alibaba.sentinel; package org.springframework.cloud.alibaba.sentinel;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import java.util.List;
/** /**
* @author xiaojing * @author xiaojing
* @author hengyunabc * @author hengyunabc
@ -29,11 +29,177 @@ import org.springframework.core.Ordered;
@ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX) @ConfigurationProperties(prefix = SentinelConstants.PROPERTY_PREFIX)
public class SentinelProperties { public class SentinelProperties {
/**
* 是否提前初始化心跳连接
*/
private boolean eager = false;
/** /**
* Enable sentinel auto configure, the default value is true * Enable sentinel auto configure, the default value is true
*/ */
private boolean enabled = 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 * sentinel api port,default value is 8721
*/ */
@ -44,15 +210,17 @@ public class SentinelProperties {
*/ */
private String dashboard = ""; private String dashboard = "";
@NestedConfigurationProperty /**
private Filter filter; * 客户端和DashBord心跳发送时间
*/
private String heartbeatIntervalMs;
public boolean isEnabled() { public String getHeartbeatIntervalMs() {
return enabled; return heartbeatIntervalMs;
} }
public void setEnabled(boolean enabled) { public void setHeartbeatIntervalMs(String heartbeatIntervalMs) {
this.enabled = enabled; this.heartbeatIntervalMs = heartbeatIntervalMs;
} }
public String getPort() { public String getPort() {
@ -71,12 +239,6 @@ public class SentinelProperties {
this.dashboard = 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 {
@ -107,4 +269,5 @@ public class SentinelProperties {
this.urlPatterns = urlPatterns; this.urlPatterns = urlPatterns;
} }
} }
} }

View File

@ -16,22 +16,28 @@
package org.springframework.cloud.alibaba.sentinel; package org.springframework.cloud.alibaba.sentinel;
import java.util.ArrayList; import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import java.util.List; import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;
import javax.servlet.Filter; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean; 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 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 * @author xiaojing
@ -48,6 +54,31 @@ public class SentinelWebAutoConfiguration {
@Autowired @Autowired
private SentinelProperties properties; private SentinelProperties properties;
@Autowired
@Qualifier
private Optional<UrlBlockHandler> urlBlockHandlerOptional;
@Autowired
@Qualifier
private Optional<UrlCleaner> 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());
}
}
@Bean @Bean
public FilterRegistrationBean servletRequestListener() { public FilterRegistrationBean servletRequestListener() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>(); FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
@ -75,4 +106,5 @@ public class SentinelWebAutoConfiguration {
return registration; return registration;
} }
} }

View File

@ -16,6 +16,10 @@
package org.springframework.cloud.alibaba.sentinel.custom; 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.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;
@ -29,9 +33,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; import javax.annotation.PostConstruct;
@ -51,15 +52,38 @@ public class SentinelAutoConfiguration {
@PostConstruct @PostConstruct
private void init() { private void init() {
if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME))) { if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME))) {
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)) && StringUtils.hasText(properties.getTransport().getPort())) {
System.setProperty(TransportConfig.SERVER_PORT, properties.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)) && StringUtils.hasText(properties.getTransport().getDashboard())) {
System.setProperty(TransportConfig.CONSOLE_SERVER, properties.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 (properties.isEager()) {
// 加载Env
NodeBuilder nodeBuilder = Env.nodeBuilder;
}
} }
@Bean @Bean

View File

@ -65,7 +65,7 @@ public class SentinelAutoConfigurationTests {
this.contextRunner.run(context -> { this.contextRunner.run(context -> {
SentinelProperties sentinelProperties = context SentinelProperties sentinelProperties = context
.getBean(SentinelProperties.class); .getBean(SentinelProperties.class);
assertThat(sentinelProperties.getPort()).isEqualTo("8888"); assertThat(sentinelProperties.getTransport().getPort()).isEqualTo("8888");
assertThat(sentinelProperties.getFilter().getUrlPatterns().size()) assertThat(sentinelProperties.getFilter().getUrlPatterns().size())
.isEqualTo(2); .isEqualTo(2);
assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0)) assertThat(sentinelProperties.getFilter().getUrlPatterns().get(0))