作者引言 .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之传入响应和拦截器的更多相关文章

  1. 快速了解AngularJs HTTP响应拦截器

    任何时候,如果我们想要为请求添加全局功能,例如身份认证.错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段. angularJs通过拦截器提供了一个从全局层面进行处理的途 ...

  2. 【转】AngularJs HTTP请求响应拦截器

    任何时候,如果我们想要为请求添加全局功能,例如身份认证.错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段. angularJs通过拦截器提供了一个从全局层面进行处理的途 ...

  3. AngularJs HTTP响应拦截器实现登陆、权限校验

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  4. vue配置请求拦截器和响应拦截器

    首先确保我们已经设置的store.js进行值的存取,这时候我们需要配置请求和响应的拦截器设置 main.js import Vue from 'vue' import App from './App' ...

  5. OkHttp 3.x 源码解析之Interceptor 拦截器

    拦截器 Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提 ...

  6. gRPC(3):拦截器

    在 gRPC 调用过程中,我们可以拦截 RPC 的执行,在 RPC 服务执行前或执行后运行一些自定义逻辑,这在某些场景下很有用,例如身份验证.日志等,我们可以在 RPC 服务执行前检查调用方的身份信息 ...

  7. AngularJS 拦截器和应用例子(转)

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  8. AngularJS 拦截器和好棒例子

    目录[-] 什么是拦截器? 异步操作 例子 Session 注入(请求拦截器) 时间戳(请求和响应拦截器) 请求恢复 (请求异常拦截) Session 恢复 (响应异常拦截器) 总结 Intercep ...

  9. AngularJS 拦截器实现全局$http请求loading效果

    日常项目开发中,当前端需要和后端进行数据交互时,为了友好的UI效果,一般都会在前端加个loading的状态提示(包括进度条或者icon显示),数据传输或交互完成之后,再隐藏/删除loading提示. ...

  10. CXF对Interceptor拦截器的支持

    前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似.在每个请求响应之前或响应之后,做一些事情.这里的Interceptor就和Filter. ...

随机推荐

  1. 内容分发策略与 SEO 优化指南

    内容分发 内容分发是指通过各种媒介分享.发布或传播内容给受众的过程.这些媒介可以包括不同的渠道,例如社交媒体平台(Facebook.Twitter.LinkedIn.朋友圈.微博.小红书.B 站.抖音 ...

  2. Python 安装与快速入门

    Python安装 许多PC和Mac已经预装了Python. 要检查在Windows PC上是否安装了Python,请在开始菜单中搜索Python,或在命令行(cmd.exe)上运行以下命令: C:\U ...

  3. Seaborn调色盘设置

    调色盘设置 设置调色 color_palette()设置调色盘,返回一个调色盘的颜色列表,默认6种颜色:deep, muted, bright, pastel, dark, colorblind. s ...

  4. HarmonyOS应用开发—资源分类与访问

     应用开发过程中,经常需要用到颜色.字体.间距.图片等资源,在不同的设备或配置中,这些资源的值可能不同. ● 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中 ...

  5. Launching Teamviewer remotely through SSH

    Launching Teamviewer remotely through SSH When you need to manage your Server remotely, but you can ...

  6. 谷歌浏览器新功能 Copy Declaration

    不知道最近大家有没有发现,从谷歌浏览器开发者工具复制 Css 代码到 Vs Code,粘贴之后 Css 代码错乱了.昨天在复制样式代码的时候,突然发现复制的 Css 代码粘贴之后就错乱了.具体表现如下 ...

  7. 01_Vue技术-Hello案例分析

    初始vue:       1.想让vue工作,就必须创建一个Vue实例,且要传入一个配置对象:       2.root容器里的代码依然符合html规范,只不过混入了一些特殊的vue语法:       ...

  8. Serverless 架构落地实践及案例解析

    简介: 技术演进的本质是更好服务业务,传统开发方式使企业花费更多的精力打磨底层技术细节,而 Serverless 架构就是让开发者专注业务实现从而创造更大的业务价值. 作者 | 丹坤   整理 | 徐 ...

  9. Flink 和 Iceberg 如何解决数据入湖面临的挑战

    简介: 4.17 上海站 Meetup 胡争老师分享内容:数据入湖的挑战有哪些,以及如何用 Flink + Iceberg 解决此类问题. 一.数据入湖的核心挑战 数据实时入湖可以分成三个部分,分别是 ...

  10. [FAQ] Vmmem 内存占用高的问题 -Win10 -WLS2

    1按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹 2新建文件 .wslconfig ,然后记事本编辑 3 填入以下内容并保存, memory为系统内存上限,这里 ...