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

icerpc,rpc · 浏览次数 : 0

小编点评

**作者引言** 作者在介绍 IceRPC 中调度管道时,首先介绍了调度类型、基础引导和请求有效负载,并简述了中间件的作用。 **调度类型** 调度类型包括连接、本地和远程。 **基础引导** 基础引导是指在用户请求处理之前执行的一系列初始化操作,例如创建连接、设置默认参数等。 **请求有效负载** 有效负载包含操作参数的字节流,用于执行操作。 **中间件** 中间件是位于中间路径上的调度程序,它可以处理请求和响应,并提供通信功能。 **路由** 路由器根据请求路径将请求路由到合适的调度程序。 **示例代码** 作者展示了如何使用路由器安装和使用中间件,以及如何在中间件中执行操作。

正文

作者引言

很高兴啊,我们来到了IceRPC之深入理解调度管道->快乐的RPC,为上篇的续篇,深入理解常见的调度类型, 基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界。

传入请求

了解如何处理传入的请求

接收传入的请求

调度器的调度方法接受传入的请求。该传入请求是由连接,在收到来自对等点的请求时创建的。

请求持有如下内容:

  • 目标服务的路径
  • 服务上的操作名称
  • 请求字段
  • 请求的有效负载payload

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

请求有效负载 payload

传入请求的有效负载是表示操作参数的字节流。IceRPC 而言,该流中的字节数是未知的。

请求功能

调度管道中的调度员在调度期间相互传输信息是很常见的。C# 中,这些调度获取并设置请求的 IFeatureCollection 用于这些通信。

还可以使用这些功能与服务代码进行通信。例如,如果安装调度信息中间件,它会设置 IDispatchInformationFeature,并且可以在代码中检索此功能:

// In Slice service implementation
public ValueTask OpAsync(string message, FeatureCollection features, CancellationToken cancellationToken)
{
    if (features.Get<IDispatchInformationFeature> is IDispatchInformationFeature dispatchInformation)
    {
        EndPoint from = dispatchInformation.ConnectionContext.TransportConnectionInformation.RemoteNetworkAddress;
        Console.WriteLine($"dispatching request from {from}");
    }
    Console.WriteLine(message);
    return default;
}

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

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

传出响应Outgoing response

了解如何创建传出响应。

创建传出响应

调度程序异步返回传出响应。

传出响应携带如下内容:

  • 状态代码
  • 错误消息,仅在状态代码非OK时设置
  • 响应字段
  • 响应的有效负载payload

响应有效负载

响应的有效负载,是表示操作返回值的字节流。调用者(发送传入请求的连接)读取这些字节,并逻辑地复制到网络连接,直到不再有字节需要读取。

C#中,传出响应的有效负载,被分割为有效负载和有效负载延续,就像传出请求的有效负载一样。这种分割,使得响应有效负载的编码,对于Slice生成的代码来说,更加方便和高效,但在其他方面,是不必要的。出发响应有效负载,在概念上是一个连续的字节流。

中间件Middleware

了解如何安装和编写中间件。

拦截传入的请求

中间件是在传入请求到达目标服务之前拦截传入请求的代码。相同的代码还会在服务发送回呼叫者之前拦截服务提供的传出响应。

在技术层面上,中间件是调度程序,它保存另一个调度程序("下一个")并在下一个调度程序上调用调度,作为其自己的调度方法实现的一部分。下一个调度程序可以是另一个中间件、服务、路由器或其他类型的调度程序;就中间件而言,它只是另一个调度程序。

中间件可以包括在下一个调度程序调用调度之前(在处理请求之前)和在下一个调度程序调用调度之后(在收到响应之后)的逻辑。 中间件还可以通过返回缓存响应或返回错误(具有 Ok 以外的状态代码的响应)来短路调度管道。

例如,一个简单的 C# 中间件可能如下所示:

public class SimpleMiddleware : IDispatcher
{
    private readonly IDispatcher _next;

    public SimpleMiddleware(IDispatcher next) => _next = next;

    public async ValueTask<OutgoingResponse> DispatchAsync(
        IncomingRequest request,
        CancellationToken cancellationToken)
    {
        Console.WriteLine("before _next.DispatchAsync");
        OutgoingResponse response = await _next.DispatchAsync(request, cancellationToken);
        Console.WriteLine($"after _next.DispatchAsync; the response status code is {response.StatusCode}");
        return response;
    }
}

安装中间件

可以使用路由器,创建调度管道并在此调度管道中安装一个或多个中间件。

路由 Router

了解如何根据路径路由传入的请求。

基于路径的路由

路由是根据请求的路径,将传入的请求,路由到其他调度器的调度器。它还可以沿着这条路线执行中间件。

--- title: Path-based request routing --- flowchart LR subgraph Router direction LR m1["middleware #1"] --> m2["middleware #2"] -- /greeter --> s1[" greeter service mapped at /greeter"] m2 -- /user/joe --> s2["account service mounted at /user"] m2 -- /user/bob --> s2 end connection --> m1

这些其他调度程序使用mapmount方法在路由器上注册。

  • map 将调度程序与路由器中的路径相关联。

    例如,可以将路径/greeter映射到chatbot服务,这是一场完全匹配的。具有路径/greeter2/greeter/foo 的请求是不匹配。

    C#中,会像如下代码一样:

    var router = new Router();
    router.Map("/greeter", chatbot);
    
  • mount 将调度程序与路由器中的路径前缀相关联。

    例如,您可以将路径前缀/user挂载到account服务。具有路径/user
    /user/foo 的请求是匹配的。而具有路径 /, /user2的请求是不匹配。

    C#中, 代码如下:

    var router = new Router();
    router.Mount("/user", account);
    

映射子叶调度程序(例如服务和安装子路由器)很常见,但这并不是一个硬性规则。

以映射并安装完全相同的路径(例如/greeter)。路由器将带有路径/greeter的请求,引导到映射的调度器,并将带有路径/greeter/foo的请求,引导到安装的调度器。

如果路由器没有找到,传入请求路径的映射或安装调度程序,则它会返回具有状态代码 NotFound 的响应。

子路由

子路由器是在另一个"父"路由器注册的路由器。它有一个与其安装点相对应的前缀;当它查找通过mapmount注册的调度员时,它会删除该前缀。

--- title: Path-based request routing with a sub-router --- flowchart LR subgraph Router direction LR m1["middleware #1"] --> m2["middleware #2"] -- /greeter --> s1["service #1"] end subgraph Sub-router m3["middleware #3"] -- /superAdmin --> s2["service #2"] end m2 -- /admin/superAdmin --> m3 connection --> m1

C# 中, 可以创建一个子路由, 并使用 Route 扩展方法单步安装:

var router = new Router();

// create a sub-router and mount it at /admin
router.Route("/admin", subRouter => subRouter.UseDispatchInformation().Map("/superAdmin", root));

此示例的根服务的完整路径是/admin/superAdmin。管理子路由器在尝试将此路径与其映射和挂载字典中的条目匹配之前,会从请求的路径中删除/admin

在路由中安装中间件

路由可以在将请求,移交给映射或安装的调度程序之前执行一个或多个中间件。

在 C# 中,这些中间件通过类路由上的 Use{Name} 扩展方法注册。例如:

Router router = new Router().UseLogger(loggerFactory).UseCompressor();
router.Map("/greeter", new Chatbot());

安装这些中间件的顺序通常很重要。安装的第一个中间件,是第一个要执行的中间件。通过上面的示例,记录器中间件首先执行,然后在压缩器中间件上调用 DispatchAsync,最后压缩器中间件在/greeter 映射的 Chatbot 服务上调用 DispatchAsync

路由总是将传入的请求发送到其注册的中间件,即使它最终返回带有状态代码 NotFound 的响应。

收尾

基础概念难啊,不好写,怕写的不好,误导大家,大家看看,不用太深入,以官方为主。

作者结语

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

与IceRPC之深入理解调度管道->快乐的RPC相似的内容:

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之调度管道->快乐的RPC

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

IceRPC之传入响应和拦截器

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

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

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

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

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