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

icerpc,invocation,pipeline,outgoing,request,rpc · 浏览次数 : 0

小编点评

**作者引言** 作者介绍了 .Net 8.0 下的新 RPC 调用管道 Invocation pipeline,并解释了它如何帮助 developers 在调用远程 RPC 服务时简化代码和提高效率。 **调用管道 Invocation pipeline** Invocation pipeline 是一个用于发送请求并接收响应的管道,它允许开发者通过在调用之前执行附加处理来优化调用效率。 **三种常见调用者类型** * **Leaf invoker**:用于在调用管道中创建和执行请求。 * **Interceptor**:用于拦截调用并将其转发到下一个拦截器。 * **Pipeline管道**:用于将请求传递到多个调用器,并执行中间处理。 **请求字段** 请求有效负载包含请求的字段和属性,这些字段用于在调用管道中传递数据。 **请求管道中的调用者** 请求管道中的调用者负责将请求传递到调用器,并处理响应。它们可以是调用器链或树,用于将请求路由到不同的服务。 **请求字段的管理** 请求有效负载包含请求字段,这些字段用于在调用管道中进行数据传递。这些字段可以通过拦截器和中间件读取和写入,以协调客户端和服务器中相同请求的处理。

正文

作者引言 .Net 8.0 下的新RPC

很高兴啊,我们来到了IceRPC之调用管道 Invocation pipeline与传出请求 Outgoing request->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界。

调用管道 Invocation pipeline

了解如何发送请求requests和接收响应responses

定义

发送请求并接收相应响应的过程称为调用。

通常会通过客户端连接进行调用。然而,由于客户端和服务器连接具有相同的功能,因此也可以反过来调用,从连接的服务器端到此连接的客户端。

调用抽象

IceRPC总是通过调用调用器invoker来进行调用。调用器是一个简单的抽象,它接受传出的请求并返回传入的响应。

C# 中, 这个抽象是 IInvoker 接口:

namespace IceRpc;

public interface IInvoker
{
    Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken = default);
}

ClientConnectionConnectionCache 都实现此接口。 这允许通过创建客户端连接或连接缓存,然后在生成的实例上调用 InvokeAsync 来进行调用:

await using var clientConnection = new ClientConnection(new Uri("icerpc://hello.zeroc.com"));
using var request = new OutgoingRequest(...);

// Make an invocation by calling the IInvoker.InvokeAsync method implemented by ClientConnection.
IncomingResponse response = await clientConnection.InvokeAsync(request);

处理调用

在将其提供给连接之前,通常会对调用执行附加处理。例如,可能需要压缩请求的有效负载、为每个请求添加遥测字段、添加截止时间或简单地添加日志记录等。

调用器实现可以调用另一个调用器,它本身调用另一个调用器,等等;用于进行调用的调用器可以是调用器链或树的头,称为"调用管道"invocation pipeline.

3种常见的调用者类型:

  • Leaf invoker
    这是调用管道中的一片叶子。该调用器通常是连接。

  • Interceptor
    拦截器拦截调用,并将其转发到"下一个"next拦截器。IceRPC提供了几个内置的拦截器,用于记录,压缩等。

  • Pipeline
    管道在向调用器发出请求之前,通过在该管道中注册的拦截器来执行请求。

--- title: A typical invocation pipeline --- flowchart LR app([application code]) -- request --> i1["interceptor #1"] -- request --> i2["interceptor #2"] i2 -- request --> ti["ClientConnection\n or ConnectionCache"] -- request --> connection connection -- response --> ti -- response --> i2 -- response --> i1 -- response --> app

传出请求 Outgoing request

了解如何创建传出请求

Creating an outgoing request

为了创建 RPC,构造一个传出请求,然后将此请求作为参数传递给调用者invoke的调用方法。

传出请求携带调用者发送请求所需的所有信息:

  • 目标服务的服务地址service address
  • 调用此服务的操作名称
  • 请求字段
  • 请求的有效负载

传出请求还包含功能features。这些功能用于该管道内的本地通信;它们还用于管道中的调用者和应用程序代码之间的通信。

请求字段

请求字段表示由"传输连接"的请求承载的带外信息". 这些字段通常由拦截器和中间件读取和写入,以协调客户端和服务器中相同请求的处理。

字段是字节序列的字典 RequestFieldKey 中的条目,其中 RequestFieldKeySlice 中定义的枚举:

unchecked enum RequestFieldKey : varuint62 {
    Context = 0
    TraceContext = 1
    CompressionFormat = 2
    Deadline = 3
    Idempotent = 4
}

例如,当压缩拦截器压缩传出请求的有效负载时,它设置请求字段CompressionFormat。这告诉连接另一侧的压缩中间件"该有效负载是用 brotli 压缩的";然后压缩中间件可以解压缩该(传入)请求有效负载。

请求有效负载和继续有效负载

请求的有效负载是表示操作参数的字节流。 当连接发送请求时,它会读取这些字节并将其逻辑复制到网络连接,直到不再有字节需要读取。

另一方面,连接从网络读取这些字节,创建传入请求并将此请求提供给调度器 dispatcher

传出请求的有效负载实际上分为两部分:连接在等待响应之前发送的第一部分,以及连接在等待、接收和返回响应时在后台发送的第二部分("继续")。

sequenceDiagram Local-)Remote: request header + payload par Remote--)Local: response header + payload and Local-)Remote: request payload continuation end

另一方面,调度器仅看到单个连续的传入请求有效负载。

请求功能

调用管道中的调用者在调用期间相互传输信息是很常见的。 例如,重试拦截器需要与连接缓存通信,以确保连接缓存不会继续使用相同的服务器地址重试。C# 中,这些调用者获取并设置请求的 IFeatureCollection 以相互通信。

还可以使用这些功能与调用管道进行通信。例如,您可以设置功能 ICompressFeature 以要求压缩机拦截器(如果已安装)压缩请求的有效负载:

using var request = new OutgoingRequest(serviceAddress)
{
    Payload = largePayload,
    Features = new FeatureCollection().With<ICompressFeature>(CompressFeature.Compress)
};

// Hopefully invoker is an invocation pipeline with a compressor interceptor.
IncomingResponse response = await invoker.InvokeAsync(request);

按照惯例,这些功能是使用接口类型进行管控的,例如上面示例中的 ICompressFeature

字段用于"传输连接"进行通信,而特征用于调用管道内的本地通信。IceRPC同时提供请求字段(由请求承载)和响应字段(由响应承载),但只提供请求特性:由于它都是本地的,因此不需要响应特性。

作者结语

  • 一直做,不停做,才能提升速度
  • 翻译的不好,请手下留情,谢谢
  • 如果对我有点小兴趣,如可加我哦,一起探讨人生,探讨道的世界
  • 觉得还不错的话,点个
    image

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

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

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

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

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

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

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

IceRPC之依赖注入>快乐的RPC

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

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

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

IceRPC之传入响应和拦截器

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

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

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