JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架相关的知识,希望对你有一定的参考价值。
JointCode.Shuttle 是一个用于 AppDomain 间通信的服务架构。
1. 什么情况下使用 JointCode.Shuttle
在 .net / mono 开发中,一般不太需要使用额外的 AppDomain,但在一些 特定情况 下,让代码运行在新的 AppDomain 中也许是一个好的选择。
当代码需要跨越 AppDomain 边界访问另一个 AppDomain 时,便产生了跨 AppDomain 通信的问题,JointCode.Shuttle 正是专为此目的而开发的一个服务框架。
2. 为什么开发 JointCode.Shuttle
一般来说,在进行跨 AppDomain 调用时,大部分人会选择使用默认提供的 remoting 库作为底层通信机制。代码也很简单,例如:
1 namespace JoitCode.Shuttle.SimpleSample 2 { 3 public class MyService : MarshalByRefObject 4 { 5 public void Do() { } 6 } 7 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 // 在默认 AppDomain 中创建一个子 AppDomain 13 var serviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null); 14 15 var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap 16 (typeof(MyService).Assembly.FullName, 17 "JoitCode.Shuttle.SimpleSample.MyService"); 18 19 myService.Do(); 20 21 Console.Read(); 22 } 23 } 24 }
这种方式有什么问题?
- AppDomain 的访问是单点的,即它只能由创建它的宿主(或称父 AppDomain)访问,而不能由其他 AppDomain 访问,即使是由相同宿主创建的其他 AppDomain,甚至其宿主的父宿主也不行。
- 缺少灵活性,由于要求服务类必须继承 MarshalByrefObject 类,这限制了灵活性。
- remoting 库的架构设计复杂(这一点是由需求决定的,因为 remoting 不仅仅是一个跨 AppDomain 通信组件),从本质来说更适合于进程间通信。事实上,进程间通讯才是它的初衷,AppDomain 之间的通信只是其附带产生的价值。
- remoting 的性能问题,由于架构设计的复杂性,必然带来额外的性能开销,因此它造成的最大问题显然是两个 AppDomain 之间访问的速度太慢(测试结果表明跨 AppDomain 访问比普通对象访问慢几百到一千倍)(示例)
- 双向通信。remoting 尽管也支持双向通信,但是服务端如果要调用客户端的代码,需要使用事件 / 回调。对于 AppDomain 之间的通讯来说,这不是一种自然的方式。事实上,它采用的还是一种客户端服务端的思路。
3. JointCode.Shuttle 的特点
与 remoting 相比,JointCode.Shuttle 除了具备相同的跨 AppDomain 通信的功能之外,还有自己的一些特点:
- 面向接口/服务
- 服务可管理:可动态注册/注销服务组
- 更好的性能:比 remoting 快 60~70 倍
- 使用 Attribute 方式标注服务,对代码无侵入
- 强类型,使用方便(remoting 依赖 magic string 来查找服务类)
- 内置 IoC 功能,自动管理服务的依赖项
- 支持延迟加载类型 / 程序集
- 支持访问任意 AppDomain 的服务
- 简单,快速上手
- 更自然的、任意 AppDomain 之间的通信(remoting 也可以实现双向通信,但不那么自然)
- 可通过租约方式管理远程服务生命期,也可自行管理
- 支持 .net 2.0
4. 目前的限制
JointCode.Shuttle 是一个非常新颖的框架,现在功能还不是十分完备,尽管作者计划在未来继续完善现有功能,并推出更多新的功能,但目前还是存在着一些不足,包括:
- 仅支持 32 位应用程序
- 仅支持 Windows(目前仅支持 .net framework,不支持 mono)
- 暂时不支持事件
- 测试得不够
5. 如何使用 JointCode.Shuttle
如果您对 JointCode.Shuttle 有兴趣,请移步前往 这里,我们提供了一个简单的示例来说明如何使用这个框架。
以上是关于JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架的主要内容,如果未能解决你的问题,请参考以下文章
使用 JointCode.Shuttle 管理远程服务对象的生命期
使用 JointCode.Shuttle 动态注册 / 注销服务
使用 JointCode.Shuttle 访问任意 AppDomain 的服务