IceRPC之传入响应和拦截器

icerpc · 浏览次数 : 0

小编点评

**作者引言** 作者介绍了 .Net 8.0 中的新 RPC 框架 IceRPC 之传入响应和拦截器。该框架允许开发人员在调用远程服务时对传入响应进行拦截和处理。 **主要内容** * IceRPC 提供传入响应和拦截器的机制,允许开发者在调用远程服务时对传入响应进行拦截。 * 输入响应包含状态代码 status code 错误消息、有效负载 payload 和字段。 * 拦截器可以拦截请求和响应,并在处理过程中进行逻辑。 * 开发人员可以通过安装拦截器来监控和控制远程服务的请求和响应。 **关键概念** * **传入响应:**由连接从对等点接收响应时创建的响应,包含状态代码、错误消息、有效负载 payload 和字段。 * **拦截器:**在调用管道中安装的调用器,用于拦截请求和响应。 * **管道:**一系列调用器链接的序列,用于处理远程服务请求。 * **拦截:**拦截器在请求和响应中进行逻辑处理。 * **状态代码:**表示远程服务响应的状态。

正文

作者引言 .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

与IceRPC之传入响应和拦截器相似的内容:

IceRPC之传入响应和拦截器

# 作者结语 * **一直做,不停做**,才能提升速度 * 翻译的不好,请手下**留情**,谢谢 * 如果对我有点小兴趣,如可加我哦,一起探讨人生,探讨**道的世界**。 * 觉得还不错的话,点个赞哦 ![image](https://img2024.cnblogs.com/blog/127234/...

IceRPC之深入理解调度管道->快乐的RPC

作者引言 很高兴啊,我们来到了IceRPC之深入理解调度管道->快乐的RPC,为上篇的续篇,深入理解常见的调度类型, 基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界。 传入请求 了解如何处理传入的请求 接收传入的请求 调度器的调度方法接受传入的请求。该传入请求是由连接,在收到来自

IceRPC之多路复用传输>快乐的RPC

作者引言 很高兴啊,我们来到了IceRPC之多路复用传输>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界。 icerpc 和多路复用传输 了解 icerpc 协议和多路复用传输 icerpc 协议 当创建到服务器地址 icerpc://hello.zeroc.com 的客户端连

IceRPC之调用管道Invocation pipeline与传出请求Outgoing request->快乐的RPC

作者引言 .Net 8.0 下的新RPC 很高兴啊,我们来到了IceRPC之调用管道 Invocation pipeline与传出请求 Outgoing request->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界。 调用管道 Invocation pipeline 了解如何发送请求r

IceRPC之依赖注入>快乐的RPC

作者引言 很高兴啊,我们来到了IceRPC之依赖注入>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界。 依赖注入和IceRPC 了解 IceRPC (C#) 如何为依赖注入(DI)提供支持。 DI作为可选功能 DI的第一条规则是:不要引入对DI的依赖。 IceRPC (C#)

IceRPC之调度管道->快乐的RPC

作者引言 很高兴啊,我们来到了IceRPC之调度管道->快乐的RPC, 基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界。 调度管道 Dispatch pipeline 了解如何接受请求并返回响应。 定义 接受/完成请求,并返回响应的过程称为调度。 调度通常由服务器连接创建: 服务

IceRPC之服务器地址与TLS的安全性->快乐的RPC

作者引言 .Net 8.0 下的新RPC 很高兴啊,我们来到了IceRPC之服务器地址与TLS的安全性->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界。 服务器地址 ServerAddress 了解服务器地址的概念和语法。 语法 服务器地址URI具有以下语法: protocol://ho