[英]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.