IceRPC之傳入響應和攔截器->快樂的RPC

作者引言 .Net 8.0 下的新RPC

很高興啊,我們來到了IceRPC之傳入響應和攔截器->快樂的RPC, 基礎引導,讓自已不在迷茫,快樂的暢遊世界。

傳入響應 Incoming response

瞭解如何演繹傳入的響應。

收到傳入響應

調用器 invoker 異步返回傳入響應。該傳入響應是由連接從對等點接收響應時創建的。

傳入響應包含哪些內容:

  • 狀態代碼 status code
  • 錯誤消息,僅在狀態代碼不是OK時設置
  • 響應字段 fields
  • 響應的有效負載 payload

狀態代碼 Status code

狀態代碼表示對等方發送的狀態。Ok或錯誤都可以。StatusCodeSlice 中定義的枚舉:

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 本身就是調用器。
當在管道上進行調用時,請求會經過該調用器鏈。在返回的途中,傳入的響應以相反的順序穿過同一條調用者鏈。

--- title: An invocation pipeline with Logger, Compressor and ClientConnection --- flowchart LR app([application code]) -- request --> i1[Logger] -- request --> i2[Compressor] i2 -- request --> ti["client connection"] -- request --> connection connection -- response --> ti -- response --> i2 -- response --> i1 -- response --> app

安裝這些攔截器的順序很重要。 安裝的第一個攔截器是第一個執行的攔截器。通過上面創建的管道,日誌攔截器首先執行,然後在壓縮攔截器上調用 InvokeAsync,最後壓縮攔截器在客戶端連接上調用 InvokeAsync

作者結語

  • 一直做,不停做,才能提升速度
  • 翻譯的不好,請手下留情,謝謝
  • 如果對我有點小興趣,如可加我哦,一起探討人生,探討道的世界
  • 覺得還不錯的話,點個
    image
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章