先描述一下本篇描述的適用場景(3台server, 各個模塊分布在各個Server上 ,分布式模塊互相依賴、交互的場景):
多個OSIG引擎交互上,使用的是.net remoting實現的,原理:
當請求某個接口時(也就是要獲取某Service Instance時),OSGI通過 remoting連接到提供這個服務的url上,如:tcp://localhost:8888/OSGI
連接成功後,源OSGI發送OpenService命令,讓目標OSGI注冊TCP Channel
根據接口type、dll路徑、appdomain name,在某個AppDomain中執行解析接口 ,然後連接到目標OSGI新開的服務上(AppDomain.DoCallBack)
在配置上,除了上篇文章中的模塊配置信息外,在Manifests.xml文件中也加 入了分布式服務配置,如下:
Manifests.xml
<?xml version="1.0" encoding="utf-8" ?> <Manifests> <ServicePort>1000</ServicePort> <RemoteServiceMap> <Service TargetIP="127.0.0.1" TargetPort="2000">OrderModule.PublicInterfaces.IOrderProce ssor</Service> </RemoteServiceMap> </Manifests>//這個代表:當前宿主沒有模塊承載,但是能和其他宿主通 信,達到轉發的目的
既有本地模塊,又有遠程服務依賴時的配置文件
<?xml version="1.0" encoding="utf-8" ?> <Manifests> <ServicePort>2000</ServicePort> <Manifest>D:\documents\visual studio 2010 \Projects\OSGIDemo\OrderModule\bin\Debug\Manifest.xml</Manifest> //本地模塊定義 <RemoteServiceMap> <Service TargetIP="127.0.0.1" TargetPort="3000">LoggingModule.PublicInterfaces.ILog</ Service> //給ILog這個接口提供服務的真正服務在遠程server上,是個遠程 依賴 </RemoteServiceMap> </Manifests>
<?xml version="1.0" encoding="utf-8" ?> <Module> <Name>Order Module</Name> <Version>1</Version> <Assembly>OrderModule</Assembly> <Activator>OrderModule.Activator</Activator> <RequiredService>LoggingModule.PublicInterfaces.ILog</Required Service> //此處的配置沒有什麼特別的 <ProvidedService>OrderModule.PublicInterfaces.IOrderProcessor< /ProvidedService> </Module>
查看本欄目
我的demo(裡面有3個Host,宿主):
運行效果:
很好很強大,哈哈,相信以後會更加好。等我把這個重構下,再換上wcf。。 。。這樣事務就一下子集成了。
代碼下載:http://files.cnblogs.com/aarond/OSGIDemo2.rar