[英]How to close a channel gracefully before ssl handshake in Netty?
我在我的应用程序中添加了一个限制功能,当传入的请求率超过阈值时,它需要在 SSL 握手之前关闭通道以减少 CPU 使用率。 现在我使用 Netty SslHandler
和服务器模式来进行握手。 我当前的实现是在SslHandler
之前添加一个ChannelInboundHandlerAdapter
并重写channelActive
方法:
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
if (!limiter.tryAcquire()) {
ctx.close();
return;
}
ctx.pipeline().remove(this);
ctx.fireChannelActive();
}
通过这种方式,通道可以在变为活动状态时关闭。 但是,我会在握手失败时收到SslHandshakeCompletionEvent
。 我阅读了 Netty SslHandler
的源代码。 当 channelInactive 事件被触发时,它会在channelInactive
方法中设置握手失败。 所以我想知道是否有更好的方法来关闭通道而不触发握手失败事件,因为当我的节流关闭通道时握手过程还没有开始。
你在错误的一端解决问题。 这个想法不是关闭太快被接受的通道,而是不要太快接受它们,这将在接受处理程序中完成,而不是在通道处理程序中完成。
你的做法是差不多吧,不过,这将是正确的覆盖channelRegistered
方法,而不是channelActive
。
@Override
public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
if (isGlobalLimitReached()) {
ctx.close();
} else {
ctx.pipeline().remove(this);
ctx.pipeline().addFirst(sslCtx.newHandler(ctx.alloc()));
ctx.fireChannelRegistered();
}
}
此外,您需要在管道的开始处动态添加SslHandler
并且仅当您的条件满足时(未达到限制)。
在这种情况下,您将不会获得SslHandshakeCompletionEvent
。 当SslHandler
添加到管道并且channel.isActive()
返回 true (你在上面的代码中的情况channel.isActive()
时,握手开始。
channelRegistered
是您可以拒绝/关闭连接的最新点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.