先描述一下本篇描述的適用場景(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.IOrderProcessor</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</RequiredService> //此處的配置沒有什么特別的 <ProvidedService>OrderModule.PublicInterfaces.IOrderProcessor</ProvidedService> </Module>
我的demo(里面有3個Host,宿主):
運行效果:
很好很強大,哈哈,相信以后會更加好。等我把這個重構下,再換上wcf。。。。這樣事務就一下子集成了。