Remoting基本原理及其扩展机制(上)

CoreRemoting:具有经典.NET Remoting风格的RPC库 核心远程处理 具有经典.NET Remoting风格的RPC库(.NET Standard 2.0) NuGet软件包: : 这是为了什么? 帮助将使用.NET Remoting的应用程序迁移到.NET Core / .NET 5。 提供易于使用的RPC功能 在分布式应用程序中支持事件和委托 在Linux,Windows和Mac上运行 这不是为了什么? 为Javascript客户端创建REST-API 创建SOAP Web服务 与.NET以外的其他平台一起使用 创建需要在多个群集节点上运行的服务器应用程序 事实与特征 在运行时为远程服务创建代理对象(在后台使用Castle.DynamicProxy) 服务可以具有SingleCall或Singeton生命周期 默认情况下使用websocket进行TCP双工网络通信(基于webshocket-sharp) 可以插入自定义传输 立即下载

.NET Remoting是.NET平台上允许存在于不同应用程序域中的对象相互知晓对方并进行通讯的基础设施。调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象。简而言之,它就是.NET平台上实现分布式对象系统的框架。

传统的方法调用是通过栈实现,调用方法前将this指针以及方法参数压入线程栈中,线程执行方法时将栈中的参数取出作为本地变量,经过一番计算后,将方法的返回结果压入栈中。这样我们就完成了一次方法调用。如下图所示:



基于栈的方法调用在同一个应用程序域中很容易实现,但是如果要调用的方法所属的对象位于另一个应用程序域或另一个进程甚至是另一个机器,又当如何?应用程序域之间是无法共享同一个线程栈的,此时我们将转而使用另一种方法调用机制——基于消息的方法调用机制。在客户端通过代理对象将原先基于栈的方法调用信息(定位远程对象的信息、方法名、方法参数等)封装到一个消息对象中,再根据需要将这些消息对象转化成某个格式的数据流发送到远程对象所在的的应用程序域中。当经过格式化的消息到达服务器后,首先从中还原出消息对象,之后在远程对象所在的的应用程序域中构建出相应方法调用栈,此时就可以按照传统的基于栈的方法调用机制完成方法的调用,而方法返回结果的过程则按照之前的方法反向重复一遍。如下图所示:

在基于消息的远程方法调用中主要有以下几个重要角色:

Client Proxy: 负责在客户端处理基于栈的参数传递模式和基于消息的参数传递模式之间的转换。

Invoker:与Client Proxy的功能相反。

Requestor: 负责将消息对象转换成可在网络上传输的数据流,并将其发送到服务器。

Marshaller: 负责消息对象的序列化与反序列化。

Client Request Handle:负责以数据流的格式发送客户端的请求消息。

Server Request Handel:负责接收来自客户端的请求消息。

那么在.NET Remoting框架下,这些重要角色又各自对应了哪些对象呢?下图是一个Remoting框架的示意图:


图1

从中我们可以看到客户端的Transparent Proxy与服务器端的StackBuilderSink分别扮演了Client Proxy与Invoker的角色。Remoting依靠这两个对象实现了基于栈的方法调用与基于消息的方法调用的转换,并且这一过程对于开发者是完全隐藏的。

Marshaller的角色由Formmatter Sink完成,在Remoting中默认提供了两种Fommatter:一个实现了消息对象与二进制流的相互转换,另一个实现了消息对象与Soap数据包的相互转换,而支持Soap格式则说明Remoting具有实现Web Service技术的可能。

Client Request Handle与Server Request Handel都是.NET中实现网络底层通讯的对象,如HttpWebRequest、HttpServerSocketHandler等。在Remoting中我们并不直接接触这些对象,而是通过Channel对它们进行管理。在框架中默认提供了三种Channel:HttpChannel、TcpChannel与IpcChannel。但是在上面这副图中,我们并没有看到Channel对象,那么Channel又是如何影响网络底层的通讯协议的呢?

其实在上面这幅图中,真正能对通讯时所采用的网络协议产生影响的元素是Transport Sink,对应不同的协议Remoting框架中提供了三种共计六个Transport Sink:HttpClientTransportSink、HttpServerTransportSink与TcpClientTransportSink、TcpServerTransportSink以及IpcClientTransportSink、IpcServerTransportSink,它们分别放置在客户端与服务器端。既然Transport Sink才是通讯协议的决定元素,那么Channel肯定与它有着某种联系,让我们先暂时搁置此话题,留待后面进一步介绍。

观察上面这副图,我们可以发现其中包含了一系列的Sink,而所谓的Sink就是一个信息接收器,它接受一系列的输入信息,为了达到某种目的对这些信息做一些处理,然后将处理后信息再次输出到另一个Sink中,这样一个个的Sink串联起来就构成了一个Pipeline(管道)。Pipeline模式在分布式框架中经常可以看到,应用该模式可以使框架具有良好的灵活性。当我们需要构建一个系统用于处理并转换一串输入数据时,如果通过一个大的组件按部就班的来实现此功能,那么一旦需求发生变化,比如其中的两个处理步骤需要调换次序,或者需要加入或减去某些处理,系统将很难适应,甚至需要重写。而Pipeline模式则将一个个的处理模块相互分离,各自独立,然后按照需要将它们串联起来即可,此时前者的输出就会作为后者的输入。此时,每个处理模块都可以获得最大限度的复用。当需求发生变化时,我们只需重新组织各个处理模块的链接顺序,或者删除或加入新的处理模块即可。在这些处理模块(Sink)中最重要的两类是Formatter Sink与Transport Sink,也就是图1中的红色部分,当我们需要通过网络访问远程对象时,首先要将消息转化为可在网络上传播的数据流,然后需要通过特定的网络协议完成数据流的发送与接收,这正是这两类Sink所负责的功能。虽然它们本身也可以被自定义的Sink所替换,不过Remoting中提供的现有实现已经可以满足绝大多数的应用。

那么.NET Remoting中又是如何创建这个Pipeline的呢?以HttpChannel为例,在创建客户端的Pipeline的时候,会调用它的CreateMessageSink方法,此时又会进一步调用HttpClientChannel的构造函数,在构造函数中调用了一个名为SetupChannel()的私有方法,看一下它的实现:

private void SetupChannel()
{
if (this._sinkProvider != null)
{
CoreChannel.AppendProviderToClientProviderChain(this._sinkProvider,
new HttpClientTransportSinkProvider(this._timeout));
}
else
{
this._sinkProvider = this.CreateDefaultClientProviderChain();
}
}

再看看在没有提供自定义SinkProvider的默认情况下CreateDefaultClientProviderChain()会创建出哪些Sink


private IClientChannelSinkProvider CreateDefaultClientProviderChain()
{
IClientChannelSinkProvider provider = new SoapClientFormatterSinkProvider();
provider.Next = new HttpClientTransportSinkProvider(this._timeout);
return provider;
}

其中包含了SoapClientFormatterSinkProvider与HttpClientTransportSinkProvider,自然地,到了创建Pipeline的时候,它们会分别创建出SoapClientFormatterSink与HttpClientTransportSink,前者用于实现消息对象的Soap格式化,而后者则表示将用Http协议来实现消息的通讯。这样我们就明白了为什么使用HttpChannel就会采用Http协议作为网络通讯协议,并且消息将以SOAP格式传递。但是仔细观察SetupChannel方法中的下段代码,我们可以发现通过提供自定义的SinkProvider,我们可以改变消息的编码格式,因为此时只创建了一个HttpClientTransportSinkProvider,并没有定义FormatterSinkProvider,而FormatterSinkProvider完全可以在自定义的SinkProvider中自由设定。

 

那么我们又如何在.NET Remoting中定义自己的SinkProvider并让它发挥作用呢?下面这幅图演示如果使用自定义SinkProvider对Pipeline进行定制。

 

图2

首先在配置文件中引用自定义的ChannelSinkProvider的类名及其所在程序集,然后编写自定义的ChannelSinkProvider的具体实现,也就是加入你需要的ChannelSink,最后在自定义的ChannelSink中实现具体的处理操作。这样我们向Pipeline中成功地添加了自定义处理模块。这里需要提醒大家注意,接收方的Pipeline信道与发送方Pipeline之间存在着一个根本的差异。发送方Pipeline为每个远程对象的真实代理创建一个接收器(Sink)链。接收方信道在其创建之时创建了接收器(Sink)链,这条链将为所有通过这个接收方Pipeline进行转送的调用所使用,不论与这个调用相关联的对象是哪个。下图展示了这个差异:


图3

细心的读者可能已经注意到之前我们定制的是ChannelSink,为什么要加上一个Channel呢?让我们回过头去再看看图1,其中有两个绿色的Sink,他们都是Remoting中可选的组件,也是我们对Pipeline进行扩展的地方。你可以在这两个地方加入自定义的Sink,从而对流经Pipeline的数据做某些需要的处理,前者需实现IMessageSink接口,后者需要实现IXXXChannelSink接口,那么它们又有何不同呢?注意看图1,我们会发现其中隔了一个Formmatter Sink,而Formmatter Sink的作用就是将原来的.NET消息变成可在网络上传播的数据流(可以是Binary或Soap格式),这也就表明前者的输入是消息对象,而后者的输入是数据流(Stream)。这也就决定了他们各自所能实现的扩展功能是不同的。比如,操作消息对象,我们可以把远程方法的参数变一变(比如从英文翻成中文),而操作数据流,我们可以实现数据流的加密或压缩之类功能。如何定制新的ChannelSink并将其加入到Pipeline中已经在图2中演示过了,那么MessageSink呢?请关注下节内容。

 

参考资料:

《Advanced Remoting》

《Pattern oriented software architecture vol1》

《Remoting Patterns》

《Pratical .NET2 and C#2》

---

 

 

   if (this._sinkProvider != null)
{
CoreChannel.AppendProviderToClientProviderChain(this._sinkProvider,
new HttpClientTransportSinkProvider(this._timeout));
}
 
python等级考试——一级知识点汇总(不包含turtle画图) 本篇文章是针对中国电子学会青少年编程等级考试的,适合初学者以及青少年编程学习者 阅读详情

相关推荐

提升仿真效率:Synopsys VCS高级编译选项优化技巧(2023最新版)

本文深入探讨了Synopsys VCS 2023版本中的高级编译选项优化技巧,帮助工程师提升仿真效率。通过并行编译、智能代码分析、精准覆盖率采样等策略,结合真实案例展示如何显著缩短仿真周期并优化资源使用,适用于数字芯片验证和大型SoC设计。

weixin_30338481的博客 114

Remoting技术

一 Remoting技术出现的背景 1)分布式应用需求的迅速增长(Peer-to-Peer, Grid等技术的出现) 2)原有的C/S, B/S模式和技术已经不能胜任(串口RS232,Socket,RPC,DCOM技术各有缺点) 二 什么是Romoting? 采用分布式进行编程的一种技术,Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况下,Remoting使

ShuLiu's Log Book 2529

从零到一:RK3588嵌入式开发中的SDK与MPP集成实战解析

本文详细解析了RK3588嵌入式开发中SDK与MPP(Media Process Platform)的集成实战,涵盖开发环境构建、SDK架构解析、MPP集成关键技术点及常见问题诊断。通过Qt5.12.10交叉编译环境配置和硬件加速优化,帮助开发者高效完成嵌入式视觉项目开发,特别适合边缘计算应用场景。

weixin_29189381的博客 511

.NETRemoting框架的使用

Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。其目的之一是为了提供一种必要的基础接口,一隐藏远程对象调用的方法和返回结果的复杂性。下面就来介绍该框架的使用方法:    首先我们要引入必要的名字空间            using System;            using System.Runtime.Remoting;     

yjmtv0817的专栏 508

相衬成像介绍

相衬成像介绍

qq_41981768的博客 2913

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2152

Remoting的基本概念

一 Remoting技术出现的背景 1)分布式应用需求的迅速增长(Peer-to-Peer, Grid等技术的出现) 2)原有的C/S, B/S模式和技术已经不能胜任(串口RS232,Socket,RPC,DCOM技术各有缺点) 二 什么是Romoting? 采用分布式进行编程的一种技术,Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况下,Remotin...

weixin_34248705的博客 294

如何用Bertalign快速搞定多语言句对齐?5分钟上手教程(附避坑指南)

本文详细介绍了如何利用Bertalign工具快速实现多语言句对齐,从安装配置到实战应用的全流程指南。通过LaBSE句向量技术,Bertalign显著提升了对齐准确率,支持25种语言的任意组合,特别适合处理复杂句式。文章还提供了常见问题的解决方案和性能优化技巧,帮助用户高效完成多语言文本对齐任务。

weixin_42538752的博客 352

Remoting基本概念&牛刀小试

Remoting技术简介 一 Remoting技术出现的背景 1)分布式应用需求的迅速增长(Peer-to-Peer, Grid等技术的出现)2)原有的C/S, B/S模式和技术已经不能胜任(串口RS232,Socket,RPC,DCOM技术各有缺点) 二 什么是Romoting? 采用分布式进行编程的一种技术,Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在...

Jeremychen2015的博客 332

YOLO11,ultralytics-main源代码目录结构详解

本文详细介绍了YOLO11框架的ultralytics-main源代码目录结构,帮助用户更好地理解和使用YOLO模型。主要目录包括:docker文件夹,包含多种Docker镜像文件,适用于不同硬件环境;docs文件夹,存放YOLO的说明文档;examples文件夹,提供YOLO使用的示例代码;tests文件夹,包含单元测试模块;ultralytics文件夹,为核心代码所在,包含推理逻辑、配置、数据处理等模块。其中,engine文件夹负责训练和推理引擎,models文件夹存放模型架构,nn定义神经网络结构

qq_30279827的博客 1284

Debezium 性能调优实战:吞吐量、延迟与资源平衡

摘要: 本文分享了团队如何通过系统性调优将Debezium从初始3,200 TPS/2.8秒延迟提升至15,200 TPS/210ms延迟的实战经验。优化涵盖四个层面:1)Debezium连接器配置(批处理、快照并行、消息精简);2)Kafka分区策略与Avro序列化缓存;3)JVM改用ZGC及OS参数调优;4)MySQL的binlog与I/O优化。关键发现包括分区数黄金公式、sync_binlog调整带来56%的I/O负载下降,以及避免盲目增大队列内存等陷阱。最终实现吞吐量提升4.75倍,并强调性能调优需

爱丹丹的博客 358

Remoting基本原理及其扩展机制

在本系列的文章中将介绍.NET Remoting框架实现远程调用的基本原理,以及如何对其加以扩展。 Remoting基本原理及其扩展机制(上) Remoting基本原理及其扩展机制(中) Remoting基本原理及其扩展机制(下) 参考资料: 《Advanced Remoting》 《Pattern oriented software architecture vol1》 《

jiangxinyu的专栏 977

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Remoting基本原理及其扩展机制(2)

在上一篇文章我 们已经介绍到通过在配置文件中指定自定义的ChannelSinkProvider,我们可以在Pipeline中加入自己的ChannelSink,此 时我们就可以加入自己的信息处理模块,但是这里我们所能操作的对象是已经经过格式化的消息(即数据流),我们看不到原始的消息对象,这也势必影响了我们所 能实现的扩展功能。而在上文的图1中, 我们看到除了ChannelSink可以扩展之外...

weixin_30416497的博客 134

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Remoting基本原理及其扩展机制(中)

在上一篇文章我们已经介绍到通过在配置文件中指定自定义的ChannelSinkProvider,我们可以在Pipeline中加入自己的ChannelSink,此时我们就可以加入自己的信息处理模块,但是这里我们所能操作的对象是已经经过格式化的消息(即数据流),我们看不到原始的消息对象,这也势必影响了我们所能实现的扩展功能。而在上文的图1中,我们看到除了ChannelSink可以扩展之外,我们还可以加入

accpyy的专栏 556

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Remoting基本原理及其扩展机制(ZZ)

 .NET Remoting是.NET平台上允许存在于不同应用程序域中的对象相互知晓对方并进行通讯的基础设施。调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象。简而言之,它就是.NET平台上实现分布式对象系统的框架。传统的方法调用是通过栈实现,调用方法前将this指针以及方法参数压入线程栈中,线程执行方法时将栈中的参数取出作为本地变量,经过一番计算后,将方法的返回结果压入栈中

虫子的专栏 1720

[ZZ]Remoting基本原理及其扩展机制(中)

在上一篇文章我 们已经介绍到通过在配置文件中指定自定义的ChannelSinkProvider,我们可以在Pipeline中加入自己的ChannelSink,此 时我们就可以加入自己的信息处理模块,但是这里我们所能操作的对象是已经经过格式化的消息(即数据流),我们看不到原始的消息对象,这也势必影响了我们所 能实现的扩展功能。而在上文的图1中, 我们看到除了ChannelSink可以扩展之外...

weixin_30646505的博客 89
上一篇: oracle SQL性能优化
下一篇: Remoting基本原理及其扩展机制(中)
vainnetwork
博客等级 码龄20年 17粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值