.NET简谈组件程序设计之(初识远程调用)

简介: 在.NET1.0版本出来的时候,要想进行远程调用基本上都是通过WebService的方式。而随着.NET2.0版本的出现,我们可以通过一个更加方便且高扩展性的框架来进行编写远程调用的程序,也就是我们都比较熟悉的.NetRemoting。

在.NET1.0版本出来的时候,要想进行远程调用基本上都是通过WebService的方式。而随着.NET2.0版本的出现,我们可以通过一个更加方便且高扩展性的框架来进行编写远程调用的程序,也就是我们都比较熟悉的.NetRemoting。

网上对.NetRemoting技术讲解的文章不计其数,但是很少有一本比较全面的、系统的学习书籍。我们都是从哪些零散的知识里慢慢摸索,效果不太理想。

今天我也来简单的介绍一下我理解的Remoting。不仔细研究一下还真不知道它的厉害,完全的托管平台、高扩展性、灵活性。框架完全采用面向接口编程,任何一个点我们都能提供自己的实现,信道、格式化器、租约、赞助方等等,系统都为我们预留了扩展的接口。[王清培版权所有,转载请给出署名]

在本人的“.NET简谈组件程序设计之(AppDomain应用程序域) ”一章中我简单的介绍了.NET托管运行时环境应用程序域(AppDomain)的概念。任何跨越应用程序域的访问.NET都将它视为远程调用,不管是在同一个进程中的两个应用程序域,还是一台PC上的两个进程中的两个应用程序域,还是跨越网络的两个应用程序域,.NET都通过代理的方式进行调用。

其实在一个进程中的两个应用程序域交互相对而言是简单的。当我们在默认的应用程序域中创建一个新的AppDomain对象,只需要实例化一个AppDomian然后通过MarshalByRefObject的CreateRefObject方法创建一个ObjRef将其新的应用程序域的代理所需要的所有信息带到客户端应用程序域中来,因为AppDomain也是派生与MarshalByRefObject类。后续的操作都是通过代理进行调用的,所有在域中创建的对象都不可能跑出来,只能被按值封送或者按引用封送。

同一个进程中的两个应用程序域共享一个物理进行空间,而线程是路径的物理执行单位,在CPU执行的时候才不管你是啥域,直接穿越。所以如果我们在同一个进程中用线程来进行处理的话,无需关心应用程序域的概念,但是这样有很多潜在的威胁,比如上下文安全、组件服务等都是要严格控制调用链的,在组件服务中都是通过上下文拦截来进行服务的调用,所以不提倡用线程来穿越域。详情请查看.NET企业服务相关技术。[王清培版权所有,转载请给出署名]

然而如果是跨进程的或者跨网络的远程调用就没这么简单了,当然这个不简单我们无需担心,NET为我们做好了。我们试着分析一下,如果要远程调用该会涉及哪些技术,这样便于我们有自主学习的能动力。

我们设想一下,.NET托管对象都宿主在物理进程中的,要想不同进程之间的通讯操作系统为我们提供了IPC技术,要想不同网络之间的进程通讯操作系统为我们提供了Socket。那么如果一个进程中的应用程序域想调用另一个进程中的应用程序域的对象必须通过物理进程的承载才行,也就是涉及到了IPC的调用。如果一个网络中的一个进程中的应用程序域想调用另一个网络中的进程中的应用程序域中的对象,就得通过操作系统为我们提供的Socket技术。[任何高层的应用均是建立在底层基础之上的]

同一台机器之间的调用:

不同机器之间的调用:

上面两幅图基本上就是对象之间的调用过程。看起来确实比较复杂,但是.NET为我们做了个很好的统一的远程处理框架.NetRemoting,我们只需要简单的配置就能很方便的进程远程调用。[王清培版权所有,转载请给出署名]

这篇文章是.NetRemoting的一个开篇铺垫吧,没涉及到多少Remoting的技术,但是这篇文章里面所讲的内容正是Remoting实现的类型,只有清楚的理解了这些关系之后我们才能很好的运用Remoting。

目录
相关文章
|
网络性能优化
1. VPP源码分析(内存管理之mheap)
1.1. mheap 1.1.1. mheap_t first_free_elt_uoffset_by_bin: User offsets for head of doubly-linked list of free objects of this size.
6958 1
|
10月前
|
UED
鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了强大的相机开发能力,特别是针对折叠屏设备的摄像头适配。本文详细介绍了如何在ArkTS中检测和适配不同折叠状态下的摄像头变更,确保相机应用在不同设备状态下的稳定性和用户体验。通过代码示例展示了具体的实现步骤。
343 8
|
10月前
|
人工智能 监控 数据可视化
低代码开发平台,快速搭建云MES系统
低代码平台是一种通过可视化操作减少手工编码的高效开发工具,适用于快速构建和交付应用软件。万界星空科技的AI低代码云MES系统具备快速开发、灵活可扩展、降低维护成本、智能分析与决策等优势,支持生产计划、质检、库存管理、数据大屏、自定义报表等功能,助力企业实现生产过程的数字化和智能化转型,提升运营效率和市场竞争力。
539 4
|
存储 缓存 NoSQL
使用Redis优化Java应用的性能
使用Redis优化Java应用的性能
|
XML JavaScript 数据格式
Qt5——图形与图片
Qt5——图形与图片
323 0
Qt5——图形与图片
|
存储 消息中间件 RocketMQ
一文搞懂 Apache RocketMQ 消费者关键配置,优化消息消费!
本文深入解析 RocketMQ 消费者相关配置,涵盖消费位点(consumeFromWhere)、订阅关系(subscription)、消费进度存储(offsetStore)、消费线程池数量(consumeThreadMin/Max)、并发消费跨度(consumeConcurrentlyMaxSpan)、拉取消息参数(pullInterval/pullBatchSize)及批量消费规模(consumeMessageBatchMaxSize)等内容。作者为魔都架构师,拥有丰富的大厂分布式系统实战经验,关注其专栏获取更多技术干货!
249 0
一文搞懂 Apache RocketMQ 消费者关键配置,优化消息消费!
|
JavaScript
妙!vue自定义指令实现一个可拖拽对话框(el-dialog专用)
element-plus 提供的 el-dialog 对话框功能非常强大,只是美中不足不能通过拖拽的方式改变位置,有点小遗憾,那么怎么办呢?我们可以通过 vue 的自定义指令来实现一个可以拖拽的对话框(el-dialog)。
妙!vue自定义指令实现一个可拖拽对话框(el-dialog专用)
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1225 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1204 87