作者引言 .Net 8.0 下的新RPC
很高興啊,我們來到了IceRPC之傳入響應和攔截器->快樂的RPC, 基礎引導,讓自已不在迷茫,快樂的暢遊世界。
傳入響應 Incoming response
瞭解如何演繹傳入的響應。
收到傳入響應
調用器 invoker
異步返回傳入響應。該傳入響應是由連接從對等點接收響應時創建的。
傳入響應包含哪些內容:
- 狀態代碼
status code
- 錯誤消息,僅在狀態代碼不是
OK
時設置 - 響應字段
fields
- 響應的有效負載
payload
狀態代碼 Status code
狀態代碼表示對等方發送的狀態。Ok
或錯誤都可以。StatusCode
是 Slice
中定義的枚舉:
unchecked enum StatusCode : varuint62 {
Ok = 0
ApplicationError
NotFound
NotImplemented
... more errors ...
}
消耗響應的調用者,使用此狀態代碼來計算響應有效負載 payload
的內容。例如,當調用者是由 Slice
編譯器生成的代碼時,它將 Ok 時,意味着響應payload
持有 Slice
編碼的返回值。
響應字段 fields
響應字段表示響應攜帶的帶外信息。這些字段通常由中間件middleware
和攔截器interceptors
讀取和寫入,以協調服務器和客戶端中相同響應的處理。
字段是字典 ResponseFieldKey
中字節序列的條目,其中 ResponseFieldKey
是在 Slice
中定義的枚舉。
unchecked enum ResponseFieldKey : varuint62 {
CompressionFormat = 2
...
}
例如,當壓縮中間件壓縮傳出響應的有效負載時,它會設置響應字段 CompressionFormat
。這告訴連接另一側的壓縮機攔截器"該有效載荷被 brotli
壓縮";然後壓縮攔截器可以解壓縮該(傳入)響應有效負載。
有效負載響應 Response payload
傳入響應的有效負載是表示操作返回值的字節流。IceRPC而言,該流中的字節數是未知的。
攔截器 Interceptor
瞭解如何編寫攔截器以及如何在調用管道中安裝攔截器。
攔截傳出的請求
攔截器是在通過網絡連接發送傳出請求之前攔截傳出請求的代碼。 相同的代碼還會在遠程服務到達調用者之前攔截它返回的傳入響應。
在技術層面上,攔截器是持有另一個調用器(next
)並在下一個調用器上調用,調用的調用器invoke
,作爲其自己的調用方法實現的一部分。
下一個調用器可以是客戶端連接、連接緩存、另一個攔截器或其他類型的調用器;就攔截器而言,它只是另一個調用器。
攔截器可以在調用下一個調用器調用調用之前(在發送請求之前)和調用下一個調用器調用調用之後(在收到響應之後)包含邏輯。 攔截器還可以使調用管道短路,返回緩存響應或拋出異常。
例如,一個簡單的 C# 攔截器可能如下所示:
public class SimpleInterceptor : IInvoker
{
private readonly IInvoker _next;
public SimpleInterceptor(IInvoker next) => _next = next;
public async Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken)
{
Console.WriteLine("before _next.InvokeAsync");
IncomingResponse response = await _next.InvokeAsync(request, cancellationToken);
Console.WriteLine($"after _next.InvokerAsync; the response status code is {response.StatusCode}");
return response;
}
}
安裝攔截器
C# 中,可以通過創建類 Pipeline
的實例,然後調用 Use{Name}
擴展方法來創建調用管道,以便在此管道上安裝攔截器。
例如:
Pipeline pipeline = new Pipeline()
.UseLogger(loggerFactory)
.UseCompressor()
.Into(clientConnection);
需要使用 Into
指定管道的最後一個調用器。 它通常是客戶端連接或連接緩存,但它也可以是另一個管道,因爲 Pipeline
本身就是調用器。
當在管道上進行調用時,請求會經過該調用器鏈。在返回的途中,傳入的響應以相反的順序穿過同一條調用者鏈。
安裝這些攔截器的順序很重要。 安裝的第一個攔截器是第一個執行的攔截器。通過上面創建的管道,日誌攔截器首先執行,然後在壓縮攔截器上調用 InvokeAsync
,最後壓縮攔截器在客戶端連接上調用 InvokeAsync
。
作者結語
- 一直做,不停做,才能提升速度
- 翻譯的不好,請手下留情,謝謝
- 如果對我有點小興趣,如可加我哦,一起探討人生,探討道的世界。
- 覺得還不錯的話,點個贊哦