Skip to content

Commit e47f187

Browse files
committed
加入读写超时控制
1 parent d7ad43b commit e47f187

File tree

8 files changed

+33
-2
lines changed

8 files changed

+33
-2
lines changed

src/main/java/love/wangqi/GatewayServerDemo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ protected List<Route> locateRouteList(Set<Long> ids) {
4141
routeList.add(new Route(8L, HttpMethod.GET, "/path", new URL("http://127.0.0.1:9990/path")));
4242
routeList.add(new Route(9L, HttpMethod.GET, "/html", new URL("http://10.100.64.71/html/user.json")));
4343
routeList.add(new Route(10L, HttpMethod.GET, "/css", new URL("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/mantpl/css/news/init_7637f86c.css")));
44+
routeList.add(new Route(11L, HttpMethod.GET, "/google", new URL("https://www.google.com")));
45+
routeList.add(new Route(12L, HttpMethod.GET, "/local", new URL("http://127.0.0.1:9999")));
4446
} catch (MalformedURLException e) {
4547
}
4648
return routeList;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public RequestHolder build(FullHttpRequest originRequest) throws Exception {
5757
throw new GatewayNoRouteException();
5858
}
5959
URL url = route.getMapUrl();
60-
logger.debug("proxy_pass {}", url.toString());
60+
logger.info("proxy_pass {}", url.toString());
6161

6262
// 请求路径
6363
QueryStringEncoder queryStringEncoder = new QueryStringEncoder(url.getPath());

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.netty.handler.codec.http.FullHttpRequest;
66
import io.netty.handler.codec.http.FullHttpResponse;
77
import io.netty.util.AttributeKey;
8+
import love.wangqi.codec.RequestHolder;
89

910
/**
1011
* @author: wangqi
@@ -18,4 +19,5 @@ public interface Attributes {
1819
AttributeKey<Boolean> KEEPALIVE = AttributeKey.newInstance("keepAlive");
1920
AttributeKey<Channel> SERVER_CHANNEL = AttributeKey.newInstance("serverChannel");
2021
AttributeKey<SimpleChannelPool> CLIENT_POOL = AttributeKey.newInstance("clientPool");
22+
AttributeKey<RequestHolder> REQUEST_HOLDER = AttributeKey.newInstance("requestHolder");
2123
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.netty.channel.Channel;
44
import io.netty.handler.codec.http.FullHttpRequest;
55
import io.netty.handler.codec.http.FullHttpResponse;
6+
import love.wangqi.codec.RequestHolder;
67

78

89
/**
@@ -35,6 +36,14 @@ public static Boolean getKeepAlive(Channel channel) {
3536
return channel.attr(Attributes.KEEPALIVE).get();
3637
}
3738

39+
public static void setRequestHolder(Channel channel, RequestHolder requestHolder) {
40+
channel.attr(Attributes.REQUEST_HOLDER).set(requestHolder);
41+
}
42+
43+
public static RequestHolder getRequestHolder(Channel channel) {
44+
return channel.attr(Attributes.REQUEST_HOLDER).get();
45+
}
46+
3847
public static void setException(Channel channel, Exception exception) {
3948
channel.attr(Attributes.EXCEPTION).set(exception);
4049
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package love.wangqi.filter;
22

33
import io.netty.channel.Channel;
4+
import love.wangqi.codec.RequestHolder;
45
import love.wangqi.config.GatewayConfig;
56
import love.wangqi.context.ContextUtil;
67
import org.slf4j.Logger;
@@ -30,7 +31,8 @@ public int filterOrder() {
3031
public void filter(Channel channel) throws Exception {
3132
Exception e = ContextUtil.getException(channel);
3233
if (e != null) {
33-
logger.error(e.getMessage(), e);
34+
RequestHolder requestHolder = ContextUtil.getRequestHolder(channel);
35+
logger.error("Route Id: " + requestHolder.route.getId() + " Route Url: " + requestHolder.route.getMapUrl() + " " + e.getMessage(), e);
3436
config.getExceptionHandler().handle(channel, e);
3537
}
3638
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public synchronized void filter(Channel channel) throws Exception {
3434
FullHttpRequest httpRequest = ContextUtil.getRequest(channel);
3535
RequestHolder requestHolder = httpRequestBuilder.build(httpRequest);
3636
httpRequest.release();
37+
ContextUtil.setRequestHolder(channel, requestHolder);
3738

3839
BackClientPool.INSTANCE.request(requestHolder, channel);
3940
}

src/main/java/love/wangqi/handler/back/BackClientPool.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@
1212
import io.netty.channel.socket.nio.NioSocketChannel;
1313
import io.netty.handler.codec.http.HttpRequest;
1414
import io.netty.handler.codec.http.multipart.HttpPostRequestEncoder;
15+
import io.netty.handler.timeout.ReadTimeoutHandler;
16+
import io.netty.handler.timeout.WriteTimeoutHandler;
1517
import io.netty.util.concurrent.Future;
1618
import io.netty.util.concurrent.FutureListener;
1719
import love.wangqi.codec.RequestHolder;
1820
import love.wangqi.context.Attributes;
1921
import org.slf4j.Logger;
2022
import org.slf4j.LoggerFactory;
2123

24+
import java.util.concurrent.TimeUnit;
25+
2226

2327
/**
2428
* @author: wangqi
@@ -59,6 +63,13 @@ public synchronized void request(RequestHolder requestHolder, Channel serverChan
5963
HttpPostRequestEncoder bodyRequestEncoder = requestHolder.bodyRequestEncoder;
6064

6165
Channel clientChannel = future.getNow();
66+
67+
// 添加读写超时控制器
68+
clientChannel.pipeline().addFirst("ReadTimeoutHandler",
69+
new ReadTimeoutHandler(requestHolder.route.getTimeoutInMilliseconds(), TimeUnit.MILLISECONDS));
70+
clientChannel.pipeline().addFirst("WriteTimeoutHandler",
71+
new WriteTimeoutHandler(500, TimeUnit.MILLISECONDS));
72+
6273
clientChannel.attr(Attributes.SERVER_CHANNEL).set(serverChannel);
6374
clientChannel.attr(Attributes.CLIENT_POOL).set(pool);
6475

src/main/java/love/wangqi/handler/back/BackHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public void channelRead0(ChannelHandlerContext ctx, FullHttpResponse response) t
3838
GatewayRunner.getInstance().postRoutAction(serverChannel);
3939

4040
clientChannel.attr(Attributes.CLIENT_POOL).get().release(clientChannel);
41+
42+
// 移除读写超时控制器
43+
ctx.channel().pipeline().remove("ReadTimeoutHandler");
44+
ctx.channel().pipeline().remove("WriteTimeoutHandler");
4145
}
4246

4347
@Override

0 commit comments

Comments
 (0)