Remoting的扩展(自定义Sink)

第一集,讲述了故事的起源以及解决方案的设计,没有代码的出现

起源

故事发生在这么一个大背景下:

某天,当我们需要再次向Cookie保存东西的时候,发现他已经臃肿的一塌糊涂了。不能在被折腾了。于是我们想到了瘦身,然后咨询了一下往Cookie里写数据的童鞋们,他们坚持声称他们的Cookie是很重要,很重要,很重要的,并且已经是最精简模式,不能被抛弃或瘦身了。矛盾发生了!

东西肯定是越存越多的,当大家都不想改变的时候,就只能牺牲空间了,给他们更大的空间去存。然后就是找到一条解决之路。

于是这个问题被抽象成了这样:

需要一种机制,让点A存到某个存储介质D。那如果点A是一个集合A{A1,A2,A3……An}。他们都应该存储到DD应该也会是一个集合D{D1,D2,D3……Dn}。那么A在存取的时候可能会头大,D也会头大。

这个时候想法变成了这样:

出现一个中间伙伴PP不需要是一个集合,是一个定点P。所有的A将需要的操作提交给P,由P来决定将操作落实到D中的哪一个。用一张图来描述的话是这样的:

 

这么做的积极意义很明显:对于A来说,目的地D被完全的隐藏了;反过来对D来说,源头A也被隐藏了。并且所有的任务将会集中在P这个点,扩展与管理都是十分的便捷的。

接着就是分工与落实:

A在这里表示的web服务器。这里将会特指IIS 6.0+.net 2.0的组合。

P在这里表示由.net Remoting技术开发的组件,并且将这个组件搭建成一个Windows Service

D在这里使用的是Memcached技术,与平台无关。


 

介绍

IIS,关于IIS的介绍地址如下:

http://baike.baidu.com/view/850.htm

http://en.wikipedia.org/wiki/Internet_Information_Services

remoting,关于.net remoting的介绍地址如下:

http://baike.baidu.com/view/742675.html?fromTaglist

http://en.wikipedia.org/wiki/.NET_Remoting

http://msdn.microsoft.com/en-us/library/ms973857.aspx

Memcached,关于Memcached的介绍地址如下:

http://baike.baidu.com/view/794242.htm

http://en.wikipedia.org/wiki/Memcached

http://memcached.org/

于是抽象图变的具象了:

 

具体实现方法:

Memcached:按照默认是的实现方法搭建。

WebServer:按照IIS默认的实现方法搭建。

Remoting

这个环节一共需要做三件事情,以及重点:

1、 构建一个代理类(Proxy Class),对于Memcached的操作全部都由它来完成。

a)         使用Enyim的第三方插件操作Memcached

b)         Proxy Class提供一个接口,供客户端调用。

2、 构建一个基础的Remoting应用包括服务端组件,客户端组件。

a)         客户端、服务端的设置均以配置文件形式存在。

3、 一个Windows Service部署组件。将服务端组件注册为Windows系统服务。

a)         使用Log4net记录必要的信息。

整个工程看起来就是这样的

 

DSS.Client

1,客户端组件

2,客户端配置文件

DSS.General

1,Proxy Class

2,Memcached配置文件

DSS.IService

    1,Proxy Class接口

DSS.ServiceHost

1,Windows Service安装组件

2,服务端配置文件

3,启动程序

4,Log4Net配置文件

DSS.Sink

    1,自定义管道

DSS.UnitTest

1,单元测试

 


 

最终

 

这个时候一个完整的架构图就出来了:

 

这里仅仅是一个初步的示意图,因为在Channel这里我轻描淡写了,其实这里才是真正的重点。

 

其他基本没有任何的技术难点,任何人都可以方便的实现出来。

 

自定义Sink,这才是本章节的重点:

为什么要自定义Remoting Sink?这里依然有一个背景知识,还是关于文章一开始说道的A,P,D的事情。假如P和D属于一个网段,A自己孤立的属于一个网段,那么它们之间的通信必需走Internet的HTTP。这是由历史原因造成的,那么如果不扩展Remoting的话, 一旦RemotingServer的IP被别有用心的人知道以后,则将是很恐怖的一件事情。

 

于是,继承.net framework原有的Remoting机制进行一定的扩展就成了当务之急。好在他并不是很难写,属于一套比较复杂的Hello World写法。全部都可以依样画葫芦。下图便是Remoting真正的实现机制示意图:

 

具体的实现有一套模板化做法,文件结构图如下:

 

这里IpManage.IpManageHelper是我额外加上去的。主要用来添加一个受信任的IP白名单。实现简单不做赘述。

 

最后给出一个MSDN上描述此扩展的链接:

http://msdn.microsoft.com/en-us/magazine/cc300447.aspx

 

posted on 2010-06-02 17:29  干田  阅读(477)  评论(2编辑  收藏  举报