diff --git a/sentinel-adapter/sentinel-zuul-adapter/README.md b/sentinel-adapter/sentinel-zuul-adapter/README.md index dde1c4eb..f86b4406 100755 --- a/sentinel-adapter/sentinel-zuul-adapter/README.md +++ b/sentinel-adapter/sentinel-zuul-adapter/README.md @@ -1,23 +1,19 @@ # Sentinel Zuul Adapter -Zuul does not provide rateLimit function, If use default `SentinelRibbonFilter` route filter. it wrapped by Hystrix Command. so only provide Service level -circuit protect. +Sentinel Zuul Adapter provides **ServiceId level** and **API Path level** flow control for Zuul gateway service. -Sentinel can provide `ServiceId` level and `API Path` level flow control for zuul gateway service. - -*Note*: this project is for zuul 1. +> *Note*: this adapter only support Zuul 1.x. ## How to use -1. Add maven dependency +1. Add Maven dependency to your `pom.xml`: ```xml - <dependency> - <groupId>com.alibaba.csp</groupId> - <artifactId>sentinel-zuul-adapter</artifactId> - <version>x.y.z</version> - </dependency> - +<dependency> + <groupId>com.alibaba.csp</groupId> + <artifactId>sentinel-zuul-adapter</artifactId> + <version>x.y.z</version> +</dependency> ``` 2. Register filters @@ -25,12 +21,12 @@ Sentinel can provide `ServiceId` level and `API Path` level flow control for zuu ```java // get registry final FilterRegistry r = FilterRegistry.instance(); -// this is property config. set filter ennable +// this is property config. set filter enable SentinelZuulProperties properties = new SentinelZuulProperties(); properties.setEnabled(true); -// set url cleaner, here use default +// set url cleaner, here use default DefaultUrlCleaner defaultUrlCleaner = new DefaultUrlCleaner(); -// set origin parser. here use default +// set origin parser. here use default DefaultRequestOriginParser defaultRequestOriginParser = new DefaultRequestOriginParser(); // register filters. you must register all three filters. @@ -44,22 +40,19 @@ r.put("sentinelErrorFilter", errorFilter); ## How it works -As Zuul run as per thread per connection block model, we add filters around `route Filter` to trace sentinel statistics. - -- `SentinelPreFilter`: Get an entry of resource,the first order is **ServiceId**(the key in RequestContext is `serviceId`, this can set in own custom filter), then **API Path**. -- `SentinelPostFilter`: When success response,exit entry. -- `SentinelPreFilter`: When get an `Exception`, trace the exception and exit context. - - -the order of Filter can be changed in property: +As Zuul run as per thread per connection block model, we add filters around `route Filter` to trace sentinel statistics. +- `SentinelPreFilter`: Get an entry of resource, the first order is **ServiceId** (the key in RequestContext is `serviceId`, this can set in own custom filter), then **API Path**. +- `SentinelPostFilter`: When success response, exit entry. +- `SentinelPreFilter`: When an `Exception` caught, trace the exception and exit context. +<img width="792" src="https://user-images.githubusercontent.com/9305625/47277113-6b5da780-d5ef-11e8-8a0a-93a6b09b0887.png"> -Filters create structure like: +The order of filters can be changed in property. +The invocation chain resembles this: ```bash - EntranceNode: machine-root(t:3 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) -EntranceNode: coke(t:2 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) --coke(t:2 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) @@ -68,38 +61,33 @@ EntranceNode: machine-root(t:3 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) -EntranceNode: book(t:1 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) --book(t:1 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) ---/book/coke(t:0 pq:0 bq:0 tq:0 rt:0 prq:0 1mp:0 1mb:0 1mt:0) - ``` -`book` and `coke` are serviceId. - -`---/book/coke` is api path, the real uri is `/coke`. - +- `book` and `coke` are serviceId. +- `/book/coke` is api path, the real API path is `/coke`. -## Integration with Sentinel DashBord +## Integration with Sentinel Dashboard -1. Start [Sentinel DashBord](https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0). - -2. Sentinel has full rule config features. see [Dynamic-Rule-Configuration](https://github.com/alibaba/Sentinel/wiki/Dynamic-Rule-Configuration) +1. Start [Sentinel Dashboard](https://github.com/alibaba/Sentinel/wiki/Dashboard). +2. You can configure the rules in Sentinel dashboard or via dynamic rule configuration. ## Fallbacks -Implements `SentinelFallbackProvider` to define your own Fallback Provider when Sentinel Block Exception throwing. the default -Fallback Provider is `DefaultBlockFallbackProvider`. +You can implement `SentinelFallbackProvider` to define your own fallback provider when Sentinel `BlockException` is thrown. +The default fallback provider is `DefaultBlockFallbackProvider`. -By default Fallback route is `ServiveId + URI PATH`, example `/book/coke`, first `book` is serviceId, `/coke` is URI PATH. so that both -can be needed. +By default fallback route is `ServiveId + URI PATH`, example `/book/coke`, first `book` is serviceId, `/coke` is URI PATH, so that both can be needed. Here is an example: ```java -// custom provider +// custom provider public class MyBlockFallbackProvider implements ZuulBlockFallbackProvider { private Logger logger = LoggerFactory.getLogger(DefaultBlockFallbackProvider.class); - - // you can define root as service level + + // you can define root as service level @Override public String getRoute() { return "/coke/coke"; @@ -115,16 +103,14 @@ public class MyBlockFallbackProvider implements ZuulBlockFallbackProvider { } } } - + // register fallback ZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider()); - ``` -Default block response +Default block response: ```json - { "code":429, "message":"Sentinel block exception", @@ -132,17 +118,15 @@ Default block response } ``` -## Origin parser +## Request origin parser -自定义解析URL +You can register customized request origin parser like this: ```java - -public class DefaultRequestOriginParser implements RequestOriginParser { +public class MyRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { - return ""; + return request.getRemoteAddr(); } } - -``` +``` \ No newline at end of file diff --git a/sentinel-adapter/sentinel-zuul-adapter/pom.xml b/sentinel-adapter/sentinel-zuul-adapter/pom.xml index bf2c2373..3894bbae 100755 --- a/sentinel-adapter/sentinel-zuul-adapter/pom.xml +++ b/sentinel-adapter/sentinel-zuul-adapter/pom.xml @@ -21,12 +21,19 @@ <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>${servlet.api.version}</version> + <scope>provided</scope> + </dependency> <dependency> <groupId>com.netflix.zuul</groupId> <artifactId>zuul-core</artifactId> <version>${zuul.version}</version> <scope>provided</scope> </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> @@ -37,12 +44,6 @@ <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>${servlet.api.version}</version> - <scope>provided</scope> - </dependency> </dependencies> </project> \ No newline at end of file