- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
.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);
}
ClientConnection 和 ConnectionCache 都实现此接口。 这允许通过创建客户端连接或连接缓存,然后在生成的实例上调用 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 管道在向调用器发出请求之前,通过在该管道中注册的拦截器来执行请求.
Outgoing request
了解如何创建传出请求 。
Outgoing request
为了创建 RPC,构造一个传出请求,然后将此请求作为参数传递给调用者invoke的调用方法.
传出请求携带调用者发送请求所需的所有信息
service address
传出请求还包含功能features。这些功能用于该管道内的本地通信;它们还用于管道中的调用者和应用程序代码之间的通信.
请求字段表示由"传输连接"的请求承载的带外信息". 这些字段通常由拦截器和中间件读取和写入,以协调客户端和服务器中相同请求的处理.
字段是字节序列的字典 RequestFieldKey 中的条目,其中 RequestFieldKey 是 Slice 中定义的枚举
unchecked enum RequestFieldKey : varuint62 {
Context = 0
TraceContext = 1
CompressionFormat = 2
Deadline = 3
Idempotent = 4
}
例如,当压缩拦截器压缩传出请求的有效负载时,它设置请求字段CompressionFormat。这告诉连接另一侧的压缩中间件"该有效负载是用 brotli 压缩的";然后压缩中间件可以解压缩该(传入)请求有效负载.
Payload
请求的有效负载是表示操作参数的字节流。 当连接发送请求时,它会读取这些字节并将其逻辑复制到网络连接,直到不再有字节需要读取.
另一方面,连接从网络读取这些字节,创建传入请求并将此请求提供给调度器 dispatcher.
传出请求的有效负载实际上分为两部分:连接在等待响应之前发送的第一部分,以及连接在等待、接收和返回响应时在后台发送的第二部分("继续").
另一方面,调度器仅看到单个连续的传入请求有效负载.
调用管道中的调用者在调用期间相互传输信息是很常见的。 例如,重试拦截器需要与连接缓存通信,以确保连接缓存不会继续使用相同的服务器地址重试。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同时提供请求字段(由请求承载)和响应字段(由响应承载),但只提供请求特性:由于它都是本地的,因此不需要响应特性.
最后此篇关于IceRPC之调用管道Invocationpipeline与传出请求Outgoingrequest->快乐的RPC的文章就讲到这里了,如果你想了解更多关于IceRPC之调用管道Invocationpipeline与传出请求Outgoingrequest->快乐的RPC的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当您编写 Happy 描述时,您必须定义所有可能出现的 token 类型。但您只能匹配 token 类型,而不是单个 token 值... 这有点问题。例如,考虑 data 关键字。根据 Haskel
为什么这会引发关于减少/减少冲突的警告 root : set1 'X' | set2 'X' 'X' set1 : 'A' | 'B'
这是代码: /** * some text. */ public class Foo { /** * Some comment... */ public enum Bar {
此导入工作正常,但在某些方面感觉很脏。主要是它使用 slice* 中的特定数字来获取父路径,这会惹恼 flake8 linter。 import os import sys sys.path.appe
我是一名优秀的程序员,十分优秀!