Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -33,6 +33,7 @@ | |||||
<module>sentinel-demo-spring-webflux</module> | <module>sentinel-demo-spring-webflux</module> | ||||
<module>sentinel-demo-apache-dubbo</module> | <module>sentinel-demo-apache-dubbo</module> | ||||
<module>sentinel-demo-spring-cloud-gateway</module> | <module>sentinel-demo-spring-cloud-gateway</module> | ||||
<module>sentinel-demo-zuul-gateway</module> | |||||
</modules> | </modules> | ||||
<dependencies> | <dependencies> | ||||
@@ -0,0 +1,36 @@ | |||||
<?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-demo</artifactId> | |||||
<groupId>com.alibaba.csp</groupId> | |||||
<version>1.6.0-SNAPSHOT</version> | |||||
</parent> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<artifactId>sentinel-demo-zuul-gateway</artifactId> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.cloud</groupId> | |||||
<artifactId>spring-cloud-starter-netflix-zuul</artifactId> | |||||
<version>2.0.3.RELEASE</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.fasterxml.jackson.core</groupId> | |||||
<artifactId>jackson-databind</artifactId> | |||||
<version>2.9.4</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba.csp</groupId> | |||||
<artifactId>sentinel-zuul-adapter</artifactId> | |||||
<version>${project.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba.csp</groupId> | |||||
<artifactId>sentinel-transport-simple-http</artifactId> | |||||
</dependency> | |||||
</dependencies> | |||||
</project> |
@@ -0,0 +1,111 @@ | |||||
/* | |||||
* Copyright 1999-2019 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 | |||||
* | |||||
* https://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.csp.sentinel.demo.zuul.gateway; | |||||
import java.util.HashSet; | |||||
import java.util.Set; | |||||
import javax.annotation.PostConstruct; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayParamFlowItem; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager; | |||||
import com.alibaba.csp.sentinel.slots.block.RuleConstant; | |||||
import org.springframework.context.annotation.Configuration; | |||||
/** | |||||
* @author Eric Zhao | |||||
*/ | |||||
@Configuration | |||||
public class GatewayRuleConfig { | |||||
@PostConstruct | |||||
public void doInit() { | |||||
// Prepare some gateway rules and API definitions (only for demo). | |||||
// It's recommended to leverage dynamic data source or the Sentinel dashboard to push the rules. | |||||
initCustomizedApis(); | |||||
initGatewayRules(); | |||||
} | |||||
private void initCustomizedApis() { | |||||
Set<ApiDefinition> definitions = new HashSet<>(); | |||||
ApiDefinition api1 = new ApiDefinition("some_customized_api") | |||||
.setPredicateItems(new HashSet<ApiPredicateItem>() {{ | |||||
add(new ApiPathPredicateItem().setPattern("/ahas")); | |||||
add(new ApiPathPredicateItem().setPattern("/aliyun_product/**") | |||||
.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_PREFIX)); | |||||
}}); | |||||
ApiDefinition api2 = new ApiDefinition("another_customized_api") | |||||
.setPredicateItems(new HashSet<ApiPredicateItem>() {{ | |||||
add(new ApiPathPredicateItem().setPattern("/**") | |||||
.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_PREFIX)); | |||||
}}); | |||||
definitions.add(api1); | |||||
definitions.add(api2); | |||||
GatewayApiDefinitionManager.loadApiDefinitions(definitions); | |||||
} | |||||
private void initGatewayRules() { | |||||
Set<GatewayFlowRule> rules = new HashSet<>(); | |||||
rules.add(new GatewayFlowRule("aliyun-product-route") | |||||
.setCount(10) | |||||
.setIntervalSec(1) | |||||
); | |||||
rules.add(new GatewayFlowRule("aliyun-product-route") | |||||
.setCount(2) | |||||
.setIntervalSec(2) | |||||
.setBurst(2) | |||||
.setParamItem(new GatewayParamFlowItem() | |||||
.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP) | |||||
) | |||||
); | |||||
rules.add(new GatewayFlowRule("another-route-httpbin") | |||||
.setCount(10) | |||||
.setIntervalSec(1) | |||||
.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) | |||||
.setMaxQueueingTimeoutMs(600) | |||||
.setParamItem(new GatewayParamFlowItem() | |||||
.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_HEADER) | |||||
.setFieldName("X-Sentinel-Flag") | |||||
) | |||||
); | |||||
rules.add(new GatewayFlowRule("another-route-httpbin") | |||||
.setCount(1) | |||||
.setIntervalSec(1) | |||||
.setParamItem(new GatewayParamFlowItem() | |||||
.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM) | |||||
.setFieldName("pa") | |||||
) | |||||
); | |||||
rules.add(new GatewayFlowRule("some_customized_api") | |||||
.setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME) | |||||
.setCount(5) | |||||
.setIntervalSec(1) | |||||
.setParamItem(new GatewayParamFlowItem() | |||||
.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_URL_PARAM) | |||||
.setFieldName("pn") | |||||
) | |||||
); | |||||
GatewayRuleManager.loadRules(rules); | |||||
} | |||||
} |
@@ -0,0 +1,46 @@ | |||||
/* | |||||
* Copyright 1999-2019 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 | |||||
* | |||||
* https://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.csp.sentinel.demo.zuul.gateway; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulErrorFilter; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPostFilter; | |||||
import com.alibaba.csp.sentinel.adapter.gateway.zuul.filters.SentinelZuulPreFilter; | |||||
import com.netflix.zuul.ZuulFilter; | |||||
import org.springframework.context.annotation.Bean; | |||||
import org.springframework.context.annotation.Configuration; | |||||
/** | |||||
* @author Eric Zhao | |||||
*/ | |||||
@Configuration | |||||
public class ZuulConfig { | |||||
@Bean | |||||
public ZuulFilter sentinelZuulPreFilter() { | |||||
return new SentinelZuulPreFilter(10000); | |||||
} | |||||
@Bean | |||||
public ZuulFilter sentinelZuulPostFilter() { | |||||
return new SentinelZuulPostFilter(1000); | |||||
} | |||||
@Bean | |||||
public ZuulFilter sentinelZuulErrorFilter() { | |||||
return new SentinelZuulErrorFilter(-1); | |||||
} | |||||
} |
@@ -0,0 +1,41 @@ | |||||
/* | |||||
* Copyright 1999-2019 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 | |||||
* | |||||
* https://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.csp.sentinel.demo.zuul.gateway; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; | |||||
/** | |||||
* <p>A demo for using Zuul 1.x with Spring Cloud and Sentinel.</p> | |||||
* | |||||
* <p>To integrate with Sentinel dashboard, you can run the demo with the parameters (an example): | |||||
* <code> | |||||
* -Dproject.name=zuul-gateway -Dcsp.sentinel.dashboard.server=localhost:8080 | |||||
* -Dcsp.sentinel.api.port=8720 -Dcsp.sentinel.app.type=1 | |||||
* </code> | |||||
* </p> | |||||
* | |||||
* @author Eric Zhao | |||||
*/ | |||||
@SpringBootApplication | |||||
@EnableZuulProxy | |||||
public class ZuulGatewayDemoApplication { | |||||
public static void main(String[] args) { | |||||
SpringApplication.run(ZuulGatewayDemoApplication.class, args); | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
server: | |||||
port: 8097 | |||||
spring: | |||||
application: | |||||
name: zuul-gateway | |||||
zuul: | |||||
routes: | |||||
aliyun-product-route: | |||||
path: /aliyun_product/** | |||||
url: https://www.aliyun.com/product | |||||
another-route-httpbin: | |||||
path: /another/** | |||||
url: https://httpbin.org |