Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0a976d1

Browse files
author
kun.wang1
committed
zuul rate limiter
1 parent 45cfa0f commit 0a976d1

File tree

8 files changed

+168
-5
lines changed

8 files changed

+168
-5
lines changed

‎chapter5/eureka-server/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<dependency>
4343
<groupId>org.springframework.cloud</groupId>
4444
<artifactId>spring-cloud-dependencies</artifactId>
45-
<version>Dalston.RC1</version>
45+
<version>Dalston.SR4</version>
4646
<type>pom</type>
4747
<scope>import</scope>
4848
</dependency>

‎chapter5/service-feign/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<dependency>
5151
<groupId>org.springframework.cloud</groupId>
5252
<artifactId>spring-cloud-dependencies</artifactId>
53-
<version>Dalston.RC1</version>
53+
<version>Dalston.SR4</version>
5454
<type>pom</type>
5555
<scope>import</scope>
5656
</dependency>

‎chapter5/service-hi/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<dependency>
4747
<groupId>org.springframework.cloud</groupId>
4848
<artifactId>spring-cloud-dependencies</artifactId>
49-
<version>Dalston.RC1</version>
49+
<version>Dalston.SR4</version>
5050
<type>pom</type>
5151
<scope>import</scope>
5252
</dependency>

‎chapter5/service-hi/src/main/resources/bootstrap.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ eureka:
33
serviceUrl:
44
defaultZone: http://localhost:8761/eureka/
55
server:
6-
port: 8762
6+
port: 8763
77
spring:
88
application:
99
name: service-hi

‎chapter5/service-ribbon/pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
<dependency>
6565
<groupId>org.springframework.cloud</groupId>
6666
<artifactId>spring-cloud-dependencies</artifactId>
67-
<version>Dalston.RC1</version>
67+
<version>Dalston.SR4</version>
6868
<type>pom</type>
6969
<scope>import</scope>
7070
</dependency>
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.forezp;
2+
3+
import com.google.common.collect.Maps;
4+
import com.google.common.util.concurrent.RateLimiter;
5+
import com.netflix.zuul.ZuulFilter;
6+
import com.netflix.zuul.context.RequestContext;
7+
import com.netflix.zuul.exception.ZuulException;
8+
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
9+
import org.springframework.core.Ordered;
10+
import org.springframework.http.HttpStatus;
11+
import org.springframework.http.MediaType;
12+
import org.springframework.stereotype.Component;
13+
import org.springframework.util.ReflectionUtils;
14+
15+
import javax.servlet.http.HttpServletResponse;
16+
import java.net.URL;
17+
import java.util.Map;
18+
19+
/**
20+
* Created by user on 2019年2月24日
21+
* refer http://www.itmuch.com/spring-cloud-sum/spring-cloud-ratelimit/
22+
*/
23+
@Component
24+
public class RateLimitZuulFilter extends ZuulFilter {
25+
26+
private static final String SERVICE_ID_KEY = "serviceId";
27+
public static final double PERMITS_PER_SECOND = 3;
28+
public static final double PERMITS_PER_SECOND1 = 2;
29+
private Map<String, RateLimiter> map = Maps.newConcurrentMap();
30+
31+
@Override
32+
public String filterType() {
33+
return FilterConstants.PRE_TYPE;
34+
}
35+
36+
@Override
37+
public int filterOrder() {
38+
// 这边的order一定要大于org.springframework.cloud.netflix.zuul.filters.pre.PreDecorationFilter的order
39+
// 也就是要大于5
40+
// 否则,RequestContext.getCurrentContext()里拿不到serviceId等数据。
41+
return Ordered.LOWEST_PRECEDENCE;
42+
}
43+
44+
@Override
45+
public boolean shouldFilter() {
46+
// 这里可以考虑弄个限流开启的开关,开启限流返回true,关闭限流返回false,你懂的。
47+
return true;
48+
}
49+
50+
@Override
51+
public Object run() {
52+
try {
53+
RequestContext context = RequestContext.getCurrentContext();
54+
HttpServletResponse response = context.getResponse();
55+
56+
String key = null;
57+
// 对于service格式的路由,走RibbonRoutingFilter
58+
String serviceId = (String) context.get(SERVICE_ID_KEY);
59+
if (serviceId != null) {
60+
key = serviceId;
61+
map.putIfAbsent(serviceId, RateLimiter.create(PERMITS_PER_SECOND));
62+
}
63+
// 如果压根不走RibbonRoutingFilter,则认为是URL格式的路由
64+
else {
65+
// 对于URL格式的路由,走SimpleHostRoutingFilter
66+
URL routeHost = context.getRouteHost();
67+
if (routeHost != null) {
68+
String url = routeHost.toString();
69+
key = url;
70+
map.putIfAbsent(url, RateLimiter.create(PERMITS_PER_SECOND1));
71+
}
72+
}
73+
RateLimiter rateLimiter = map.get(key);
74+
if (!rateLimiter.tryAcquire()) {
75+
HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;
76+
77+
response.setContentType(MediaType.TEXT_PLAIN_VALUE);
78+
response.setStatus(httpStatus.value());
79+
response.getWriter().append(httpStatus.getReasonPhrase());
80+
81+
context.setSendZuulResponse(false);
82+
83+
throw new ZuulException(
84+
httpStatus.getReasonPhrase(),
85+
httpStatus.value(),
86+
httpStatus.getReasonPhrase()
87+
);
88+
}
89+
} catch (Exception e) {
90+
ReflectionUtils.rethrowRuntimeException(e);
91+
}
92+
return null;
93+
}
94+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.forezp;
2+
3+
import com.google.common.util.concurrent.RateLimiter;
4+
import com.netflix.zuul.ZuulFilter;
5+
import com.netflix.zuul.context.RequestContext;
6+
import com.netflix.zuul.exception.ZuulException;
7+
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
8+
import org.springframework.core.Ordered;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.stereotype.Component;
12+
import org.springframework.util.ReflectionUtils;
13+
14+
import javax.servlet.http.HttpServletResponse;
15+
16+
/**
17+
* Created by user on 2019年2月24日
18+
* 这种是整体限流,经过zuul低下的所有微服务都是同一个限制条件
19+
*/
20+
//@Component
21+
public class RateLimitZuulFilterAll extends ZuulFilter {
22+
23+
private final RateLimiter rateLimiter = RateLimiter.create(2.0);
24+
25+
@Override
26+
public String filterType() {
27+
return FilterConstants.PRE_TYPE;
28+
}
29+
30+
@Override
31+
public int filterOrder() {
32+
return Ordered.HIGHEST_PRECEDENCE;
33+
}
34+
35+
@Override
36+
public boolean shouldFilter() {
37+
// 这里可以考虑弄个限流开启的开关,开启限流返回true,关闭限流返回false,你懂的。
38+
return true;
39+
}
40+
41+
@Override
42+
public Object run() {
43+
try {
44+
RequestContext currentContext = RequestContext.getCurrentContext();
45+
HttpServletResponse response = currentContext.getResponse();
46+
if (!rateLimiter.tryAcquire()) {
47+
HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;
48+
49+
response.setContentType(MediaType.TEXT_PLAIN_VALUE);
50+
response.setStatus(httpStatus.value());
51+
response.getWriter().append(httpStatus.getReasonPhrase());
52+
53+
currentContext.setSendZuulResponse(false);
54+
55+
throw new ZuulException(
56+
httpStatus.getReasonPhrase(),
57+
httpStatus.value(),
58+
httpStatus.getReasonPhrase()
59+
);
60+
}
61+
} catch (Exception e) {
62+
ReflectionUtils.rethrowRuntimeException(e);
63+
}
64+
return null;
65+
}
66+
}

‎chapter5/service-zuul/src/main/java/com/forezp/ServiceZuulApplication.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
88
import org.springframework.context.annotation.Bean;
99

10+
/**
11+
* refer https://www.fangzhipeng.com/springcloud/2017/06/05/sc05-zuul.html
12+
*/
1013
@EnableZuulProxy
1114
@EnableEurekaClient
1215
@SpringBootApplication

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /