Skip to content

Commit eec8099

Browse files
committed
后端请求异步化
1 parent 76abd3f commit eec8099

21 files changed

+269
-106
lines changed

src/main/java/love/wangqi/codec/DefaultHttpRequestBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public DefaultHttpRequestBuilder() {
3939
}
4040

4141
@Override
42-
public DefaultHttpRequestBuilder setRouteMapper(RouteMapper routeMapper) {
42+
public HttpRequestBuilder setRouteMapper(RouteMapper routeMapper) {
4343
this.routeMapper = routeMapper;
4444
return this;
4545
}

src/main/java/love/wangqi/codec/HttpRequestBuilder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@ public interface HttpRequestBuilder {
1616
* @param routeMapper
1717
* @return
1818
*/
19-
DefaultHttpRequestBuilder setRouteMapper(RouteMapper routeMapper);
19+
HttpRequestBuilder setRouteMapper(RouteMapper routeMapper);
2020

2121
/**
2222
* 生成新的请求
23+
* @param originRequest
2324
* @return
2425
* @throws Exception
2526
*/
2627
RequestHolder build(FullHttpRequest originRequest) throws Exception;
2728

2829
/**
2930
* 获取路由
31+
* @param originRequest
3032
* @return
3133
*/
3234
Route getRoute(FullHttpRequest originRequest);

src/main/java/love/wangqi/config/GatewayConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.netty.channel.ChannelInboundHandler;
55
import io.netty.channel.ChannelOutboundHandler;
66
import love.wangqi.codec.HttpRequestBuilder;
7+
import love.wangqi.core.ResponseHandler;
78
import love.wangqi.exception.handler.ExceptionHandler;
89
import love.wangqi.filter.FilterRegistry;
910
import love.wangqi.filter.GatewayFilter;
@@ -80,6 +81,10 @@ public List<GatewayFilter> getFiltersByType(String filterType) {
8081
* 异常处理器
8182
*/
8283
private ExceptionHandler exceptionHandler;
84+
/**
85+
* 响应处理器
86+
*/
87+
private ResponseHandler responseHandler;
8388

8489

8590
private GatewayConfig() {
@@ -151,4 +156,12 @@ public ExceptionHandler getExceptionHandler() {
151156
public void setExceptionHandler(ExceptionHandler exceptionHandler) {
152157
this.exceptionHandler = exceptionHandler;
153158
}
159+
160+
public ResponseHandler getResponseHandler() {
161+
return responseHandler;
162+
}
163+
164+
public void setResponseHandler(ResponseHandler responseHandler) {
165+
this.responseHandler = responseHandler;
166+
}
154167
}

src/main/java/love/wangqi/context/HttpRequestContext.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.netty.channel.Channel;
44
import io.netty.channel.ChannelHandlerContext;
5+
import io.netty.handler.codec.http.FullHttpResponse;
56
import io.netty.handler.codec.http.HttpRequest;
67

78
import java.util.concurrent.ConcurrentHashMap;
@@ -30,7 +31,7 @@ public static HttpRequestContext getInstance() {
3031
}
3132

3233
public void setRequestChannel(HttpRequest httpRequest, Channel channel) {
33-
requestChannel.putIfAbsent(httpRequest, channel);
34+
requestChannel.put(httpRequest, channel);
3435
set(channel, RequestConstant.HTTPREQUEST, httpRequest);
3536
}
3637

@@ -47,9 +48,9 @@ public void set(Channel channel, String key, Object value) {
4748
ConcurrentHashMap<String, Object> context = getContext(channel);
4849
if (context == null) {
4950
context = new ConcurrentHashMap<>();
50-
channelContext.putIfAbsent(channel, context);
51+
channelContext.put(channel, context);
5152
}
52-
context.putIfAbsent(key, value);
53+
context.put(key, value);
5354
}
5455

5556
public <T> T get(HttpRequest httpRequest, String key) {
@@ -102,15 +103,15 @@ public void setException(Channel channel, Exception exception) {
102103
set(channel, RequestConstant.EXCEPTION, exception);
103104
}
104105

105-
public void setResponse(Channel channel, Object response) {
106+
public void setResponse(Channel channel, FullHttpResponse response) {
106107
set(channel, RequestConstant.RESPONSE, response);
107108
}
108109

109-
public Object getResponse(Channel channel) {
110+
public FullHttpResponse getResponse(Channel channel) {
110111
return get(channel, RequestConstant.RESPONSE);
111112
}
112113

113-
public Object getResponse(HttpRequest httpRequest) {
114+
public FullHttpResponse getResponse(HttpRequest httpRequest) {
114115
return get(httpRequest, RequestConstant.RESPONSE);
115116
}
116117
}

src/main/java/love/wangqi/context/RequestConstant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ public class RequestConstant {
1111
public static final String EXCEPTION = "exception";
1212
public static final String STATUSCODE = "statusCode";
1313
public static final String RESPONSE = "response";
14+
public static final String KEEPALIVE = "keepAlive";
1415
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package love.wangqi.core;
2+
3+
import io.netty.channel.Channel;
4+
import io.netty.channel.ChannelFuture;
5+
import io.netty.channel.ChannelFutureListener;
6+
import io.netty.handler.codec.http.FullHttpResponse;
7+
import io.netty.handler.codec.http.HttpHeaderNames;
8+
import io.netty.handler.codec.http.HttpUtil;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
import love.wangqi.config.GatewayConfig;
12+
import love.wangqi.context.HttpRequestContext;
13+
import love.wangqi.context.RequestConstant;
14+
15+
/**
16+
* @author: wangqi
17+
* @description:
18+
* @date: Created in 2018/9/28 下午6:14
19+
*/
20+
public class ResponseHandler {
21+
private Logger logger = LoggerFactory.getLogger(ResponseHandler.class);
22+
23+
private GatewayConfig config = GatewayConfig.getInstance();
24+
private HttpRequestContext httpRequestContext = HttpRequestContext.getInstance();
25+
26+
public void send(Channel channel, FullHttpResponse response) {
27+
response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
28+
Boolean keepAlive = httpRequestContext.get(channel, RequestConstant.KEEPALIVE);
29+
HttpUtil.setKeepAlive(response, keepAlive == null ? false : keepAlive);
30+
channel.writeAndFlush(response).addListener(new ChannelFutureListener() {
31+
@Override
32+
public void operationComplete(ChannelFuture future) throws Exception {
33+
if (config.getChannelCloseFutureListener() != null) {
34+
config.getChannelCloseFutureListener().operationComplete(channel, future);
35+
}
36+
}
37+
});
38+
}
39+
}

src/main/java/love/wangqi/exception/GatewayTimeoutException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
public class GatewayTimeoutException extends GatewayException {
1111

1212
public GatewayTimeoutException() {
13-
super(HttpResponseStatus.REQUEST_TIMEOUT, "timeout");
13+
super(HttpResponseStatus.REQUEST_TIMEOUT, "request timeout");
1414
}
1515
}

src/main/java/love/wangqi/exception/handler/DefaultExceptionHandler.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package love.wangqi.exception.handler;
22

3-
import io.netty.channel.ChannelFutureListener;
43
import io.netty.channel.ChannelHandlerContext;
5-
import io.netty.handler.codec.http.DefaultFullHttpResponse;
6-
import io.netty.handler.codec.http.FullHttpResponse;
7-
import io.netty.handler.codec.http.HttpResponseStatus;
8-
import io.netty.handler.codec.http.HttpVersion;
4+
import io.netty.handler.codec.http.*;
5+
import love.wangqi.config.GatewayConfig;
96
import love.wangqi.exception.GatewayException;
107

118
import java.net.ConnectException;
@@ -17,6 +14,8 @@
1714
* @date: Created in 2018/6/5 下午6:16
1815
*/
1916
public class DefaultExceptionHandler extends AbstractExceptionHandler {
17+
private GatewayConfig config = GatewayConfig.getInstance();
18+
2019
@Override
2120
public ExceptionResponse getExceptionResponse(Exception exception) {
2221
ExceptionResponse exceptionResponse = new ExceptionResponse();
@@ -45,10 +44,10 @@ public ExceptionResponse getExceptionResponse(Exception exception) {
4544
public void send(ChannelHandlerContext ctx, ExceptionResponse exceptionResponse) {
4645
String content = exceptionResponse.getContent();
4746
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, exceptionResponse.getStatus());
47+
response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
4848
if (content != null) {
4949
response.headers().set("X-Ca-Error-Message", content);
5050
}
51-
ctx.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
52-
ctx.channel().close();
51+
config.getResponseHandler().send(ctx.channel(), response);
5352
}
5453
}

src/main/java/love/wangqi/filter/SendForwardFilter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import io.netty.channel.ChannelHandlerContext;
44
import io.netty.handler.codec.http.FullHttpRequest;
5-
import love.wangqi.codec.DefaultHttpRequestBuilder;
65
import love.wangqi.codec.HttpRequestBuilder;
76
import love.wangqi.codec.RequestHolder;
87
import love.wangqi.config.GatewayConfig;
@@ -30,7 +29,7 @@ public int filterOrder() {
3029

3130
@Override
3231
public void filter(FullHttpRequest httpRequest) throws Exception {
33-
HttpRequestBuilder httpRequestBuilder = new DefaultHttpRequestBuilder()
32+
HttpRequestBuilder httpRequestBuilder = config.getHttpRequestBuilder()
3433
.setRouteMapper(config.getRouteMapper());
3534

3635
RequestHolder requestHolder = httpRequestBuilder.build(httpRequest);

src/main/java/love/wangqi/filter/SendResponseFilter.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package love.wangqi.filter;
22

33
import io.netty.channel.Channel;
4-
import io.netty.channel.ChannelFutureListener;
54
import io.netty.handler.codec.http.FullHttpRequest;
5+
import io.netty.handler.codec.http.FullHttpResponse;
6+
import love.wangqi.handler.GatewayRunner;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import love.wangqi.config.GatewayConfig;
610
import love.wangqi.context.HttpRequestContext;
711

812
/**
@@ -11,8 +15,12 @@
1115
* @date: Created in 2018/9/5 下午2:16
1216
*/
1317
public class SendResponseFilter extends GatewayFilter {
18+
private static final Logger logger = LoggerFactory.getLogger(SendResponseFilter.class);
19+
1420
private HttpRequestContext httpRequestContext = HttpRequestContext.getInstance();
1521

22+
private GatewayConfig config = GatewayConfig.getInstance();
23+
1624
@Override
1725
public String filterType() {
1826
return "post";
@@ -28,8 +36,11 @@ public void filter(FullHttpRequest httpRequest) throws Exception {
2836
Channel channel = httpRequestContext.getChannel(httpRequest);
2937
Exception e = httpRequestContext.getException(httpRequest);
3038
if (channel != null && e == null) {
31-
Object response = httpRequestContext.getResponse(httpRequest);
32-
channel.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
39+
FullHttpResponse response = httpRequestContext.getResponse(httpRequest);
40+
// logger.info("*** content {}", response.content().toString(Charset.defaultCharset()));
41+
config.getResponseHandler().send(channel, response);
42+
} else {
43+
GatewayRunner.getInstance().errorAction((FullHttpRequest) httpRequestContext.getHttpRequest(channel));
3344
}
3445
}
3546
}

0 commit comments

Comments
 (0)