簡體   English   中英

如何在 Netty 中的 ssl 握手之前優雅地關閉通道?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM