- This has been replaced with Spring Cloud Alibaba Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -18,7 +18,6 @@ | |||
<module>sentinel-web-servlet</module> | |||
<module>sentinel-dubbo-adapter</module> | |||
<module>sentinel-grpc-adapter</module> | |||
<module>sentinel-spring-boot-starter</module> | |||
</modules> | |||
<properties> | |||
@@ -1,18 +0,0 @@ | |||
# Sentinel Spring Boot Starter | |||
Sentinel Spring Boot Starter provides out-of-box integration with Spring Boot applications | |||
(e.g. web applications, Dubbo services). | |||
## Web Servlet | |||
Web servlet integration is enabled by default. You need to configure URL patterns in your config file (e.g. properties file): | |||
``` | |||
spring.sentinel.servletFilter.urlPatterns=/* | |||
``` | |||
By default the URL pattern is `/*`. | |||
## Dubbo | |||
Dubbo integration is enabled by default. You need to disable the filters manually if you don't want them. |
@@ -1,95 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<artifactId>sentinel-adapter</artifactId> | |||
<groupId>com.alibaba.csp</groupId> | |||
<version>0.1.1-SNAPSHOT</version> | |||
</parent> | |||
<modelVersion>4.0.0</modelVersion> | |||
<packaging>jar</packaging> | |||
<artifactId>sentinel-spring-boot-starter</artifactId> | |||
<properties> | |||
<spring.boot.version>1.5.14.RELEASE</spring.boot.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-core</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-transport-simple-http</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-web-servlet</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-dubbo-adapter</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-api</artifactId> | |||
<version>1.7.25</version> | |||
<scope>compile</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>compile</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-autoconfigure</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>compile</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-configuration-processor</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>compile</scope> | |||
<optional>true</optional> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-web</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>provided</scope> | |||
<optional>true</optional> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-actuator</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>compile</scope> | |||
<optional>true</optional> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<version>${spring.boot.version}</version> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>junit</groupId> | |||
<artifactId>junit</artifactId> | |||
<version>${junit.version}</version> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -1,31 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel; | |||
/** | |||
* @author Eric Zhao | |||
*/ | |||
public final class Constants { | |||
/** | |||
* Property prefix in application.properties. | |||
*/ | |||
public static final String PREFIX = "spring.sentinel"; | |||
public static final String SENTINEL_SERVLET_ENABLED = "spring.sentinel.servletFilter.enabled"; | |||
public static final String SENTINEL_ENABLED = "spring.sentinel.enabled"; | |||
private Constants() {} | |||
} |
@@ -1,85 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel.config; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import javax.servlet.Filter; | |||
import com.alibaba.boot.sentinel.Constants; | |||
import com.alibaba.boot.sentinel.property.SentinelProperties; | |||
import com.alibaba.boot.sentinel.property.SentinelProperties.ServletFilterConfig; | |||
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
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.CollectionUtils; | |||
/** | |||
* Auto configuration for Sentinel web servlet filter. | |||
* | |||
* @author Eric Zhao | |||
*/ | |||
@Configuration | |||
@ConditionalOnWebApplication | |||
@ConditionalOnProperty(name = {Constants.SENTINEL_ENABLED, Constants.SENTINEL_SERVLET_ENABLED}, matchIfMissing = true) | |||
@EnableConfigurationProperties(SentinelProperties.class) | |||
public class SentinelWebServletAutoConfiguration { | |||
private final Logger logger = LoggerFactory.getLogger(SentinelWebServletAutoConfiguration.class); | |||
@Autowired | |||
private SentinelProperties properties; | |||
@Bean | |||
@ConditionalOnWebApplication | |||
public FilterRegistrationBean sentinelFilterRegistrationBean() { | |||
FilterRegistrationBean registrationBean = new FilterRegistrationBean(); | |||
if (!properties.isEnabled()) { | |||
return registrationBean; | |||
} | |||
ServletFilterConfig filterConfig = properties.getServletFilter(); | |||
if (null == filterConfig) { | |||
filterConfig = new ServletFilterConfig(); | |||
properties.setServletFilter(filterConfig); | |||
} | |||
if (CollectionUtils.isEmpty(filterConfig.getUrlPatterns())) { | |||
List<String> defaultPatterns = new ArrayList<String>(); | |||
defaultPatterns.add("/*"); | |||
filterConfig.setUrlPatterns(defaultPatterns); | |||
logger.info("[Sentinel Starter] Using default patterns for web servlet filter: {}", defaultPatterns); | |||
} | |||
registrationBean.addUrlPatterns(filterConfig.getUrlPatterns().toArray(new String[0])); | |||
Filter filter = new CommonFilter(); | |||
registrationBean.setFilter(filter); | |||
registrationBean.setOrder(filterConfig.getOrder()); | |||
logger.info("[Sentinel Starter] Web servlet filter registered with urlPatterns: {}", | |||
filterConfig.getUrlPatterns()); | |||
return registrationBean; | |||
} | |||
} |
@@ -1,68 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel.endpoint; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import com.alibaba.boot.sentinel.property.SentinelProperties; | |||
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.FlowRuleManager; | |||
import com.alibaba.csp.sentinel.slots.system.SystemRule; | |||
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.boot.actuate.endpoint.mvc.AbstractMvcEndpoint; | |||
import org.springframework.boot.context.properties.ConfigurationProperties; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.ResponseBody; | |||
/** | |||
* @author duanling | |||
* @author Eric Zhao | |||
*/ | |||
@ConfigurationProperties("endpoints.sentinel") | |||
public class SentinelActuatorEndpoint extends AbstractMvcEndpoint { | |||
@Autowired | |||
private SentinelProperties sentinelProperties; | |||
public SentinelActuatorEndpoint() { | |||
super("/sentinel", false); | |||
} | |||
@RequestMapping | |||
@ResponseBody | |||
public Map<String, Object> invoke() { | |||
Map<String, Object> result = new HashMap<String, Object>(); | |||
result.put("version", this.getClass().getPackage().getImplementationVersion()); | |||
result.put("properties", sentinelProperties); | |||
List<FlowRule> flowRules = FlowRuleManager.getRules(); | |||
List<DegradeRule> degradeRules = DegradeRuleManager.getRules(); | |||
List<SystemRule> systemRules = SystemRuleManager.getRules(); | |||
result.put("flowRules", flowRules); | |||
result.put("degradeRules", degradeRules); | |||
result.put("systemRules", systemRules); | |||
return result; | |||
} | |||
} |
@@ -1,39 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel.endpoint; | |||
import com.alibaba.boot.sentinel.property.SentinelProperties; | |||
import org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration; | |||
import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; | |||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | |||
import org.springframework.boot.context.properties.EnableConfigurationProperties; | |||
import org.springframework.context.annotation.Bean; | |||
/** | |||
* @author duanling | |||
*/ | |||
@ManagementContextConfiguration | |||
@EnableConfigurationProperties({SentinelProperties.class}) | |||
public class SentinelEndpointManagementContextConfiguration { | |||
@Bean | |||
@ConditionalOnMissingBean | |||
@ConditionalOnEnabledEndpoint("sentinel") | |||
public SentinelActuatorEndpoint sentinelEndPoint() { | |||
return new SentinelActuatorEndpoint(); | |||
} | |||
} |
@@ -1,93 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel.property; | |||
import java.util.List; | |||
import org.springframework.boot.context.properties.ConfigurationProperties; | |||
import org.springframework.core.Ordered; | |||
/** | |||
* @author Eric Zhao | |||
*/ | |||
@ConfigurationProperties(prefix = "spring.sentinel") | |||
public class SentinelProperties { | |||
private boolean enabled = true; | |||
private ServletFilterConfig servletFilter; | |||
public boolean isEnabled() { | |||
return enabled; | |||
} | |||
public SentinelProperties setEnabled(boolean enabled) { | |||
this.enabled = enabled; | |||
return this; | |||
} | |||
public ServletFilterConfig getServletFilter() { | |||
return servletFilter; | |||
} | |||
public SentinelProperties setServletFilter( | |||
ServletFilterConfig servletFilter) { | |||
this.servletFilter = servletFilter; | |||
return this; | |||
} | |||
public static class DubboFilterConfig {} | |||
public static class ServletFilterConfig { | |||
private boolean enabled = true; | |||
/** | |||
* Chain order for Sentinel servlet filter. | |||
*/ | |||
private int order = Ordered.HIGHEST_PRECEDENCE; | |||
/** | |||
* URL pattern for Sentinel servlet filter. | |||
*/ | |||
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; | |||
} | |||
public boolean isEnabled() { | |||
return enabled; | |||
} | |||
public ServletFilterConfig setEnabled(boolean enabled) { | |||
this.enabled = enabled; | |||
return this; | |||
} | |||
} | |||
} |
@@ -1,5 +0,0 @@ | |||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ | |||
com.alibaba.boot.sentinel.config.SentinelWebServletAutoConfiguration | |||
org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration=\ | |||
com.alibaba.boot.sentinel.endpoint.SentinelEndpointManagementContextConfiguration |
@@ -1 +0,0 @@ | |||
provides: sentinel-core |
@@ -1,53 +0,0 @@ | |||
/* | |||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.alibaba.boot.sentinel; | |||
import com.alibaba.csp.sentinel.node.ClusterNode; | |||
import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
import org.springframework.context.annotation.PropertySource; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
/** | |||
* @author Eric Zhao | |||
*/ | |||
@SpringBootApplication | |||
@RestController | |||
@PropertySource("classpath:web-servlet.properties") | |||
public class SimpleWebApplication { | |||
@RequestMapping("/foo") | |||
public String foo() { | |||
return "Hello!"; | |||
} | |||
@RequestMapping("/baz") | |||
public String baz() { | |||
ClusterNode node = ClusterBuilderSlot.getClusterNode("/foo"); | |||
if (node == null) { | |||
return "/foo has not been called!"; | |||
} else { | |||
return "/foo total request in metrics: " + node.totalRequest(); | |||
} | |||
} | |||
public static void main(String[] args) { | |||
SpringApplication.run(SimpleWebApplication.class, args); | |||
} | |||
} |
@@ -1,3 +0,0 @@ | |||
spring.sentinel.enabled=true | |||
spring.sentinel.servletFilter.enabled=true | |||
spring.sentinel.servletFilter.urlPatterns=/foo |