@@ -33,6 +33,7 @@ | |||
<module>sentinel-demo-spring-webflux</module> | |||
<module>sentinel-demo-apache-dubbo</module> | |||
<module>sentinel-demo-spring-cloud-gateway</module> | |||
<module>sentinel-demo-zuul-gateway</module> | |||
</modules> | |||
<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 |