作者引言 .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. 使用OHOS SDK构建bullet

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/bulletphysic ...

  2. 寻找OpenHarmony「锦鲤」|万元豪礼+技术干货全是你的!

    开源项目 OpenHarmony 是每个人的 OpenHarmony 战"码"先锋第二期蓄力出发! 同时,我们也推出了全网寻找开源锦鲤的活动 只为每一位参与OpenHarmony开 ...

  3. C#只允许启动一个WinFrom进程

      [STAThread] public static void Main() { bool ret; System.Threading.Mutex mutex = new System.Thread ...

  4. std::thread 四:异步(async)

    *:如果 std::async 中传递参数 std::lunnch::deferred ,就需要等待调用 get() 或者 wait() 才会执行,并且代码非子线程运行,而是在主线程中执行 #incl ...

  5. openGauss每日一练第三天

    openGauss 每日一练第三天 本文出处:https://www.modb.pro/db/193083 学习目标 学习 openGauss 创建数据库.修改数据库属性和删除数据库 课后作业 1.分 ...

  6. ArkUI框架,更懂程序员的UI信息语法

     原文:https://mp.weixin.qq.com/s/LQA6AYiG8O_AeGE1PZwxZg,点击链接查看更多技术内容.   ArkUI框架简化代码的"秘密" 在传统 ...

  7. CentOS SSH安装和配置

    CentOS SSH安装和配置 赞 0 CentOS  SSH  安装  配置  OpenSSH SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Worki ...

  8. 使用纯c#在本地部署多模态模型,让本地模型也可以理解图像

    之前曾经分享过纯c#运行开源本地大模型Mixtral-8x7B 当时使用的是llamasharp这个库和Mixtral的模型在本地部署和推理,前段时间我看到llamasharp更新到了0.11.1版本 ...

  9. ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现

    在上文<Keycloak中授权的实现>中,以一个实际案例介绍了Keycloak中用户授权的设置方法.现在回顾一下这个案例: 服务供应商(Service Provider)发布/Weathe ...

  10. 力扣58(java)-最后一个单词的长度(简单)

    题目: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开.返回字符串中 最后一个 单词的长度. 单词 是指仅由字母组成.不包含任何空格字符的最大子字符串. 示例 1: 输入:s = &q ...