柔情似水 发表于 2015-1-18 11:19:25

Linux编程:分享在Linux下利用OSGi.NET插件框架疾速完成一个散布式服务集群的办法仓酷云 ...

linux系统的文件布置,etc/,opt/目录的内容等;
在这篇文章我分享了怎样利用分层与模块化的办法来计划一个散布式服务集群。这个散布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架完成的。我将从计划思绪、方针和完成三方面来形貌。
1计划思绪
起首,我来讲明一下计划思绪。我们先来看看今朝OSGi.NET插件框架的服务。在这里,服务不是远程服务,它是轻量级的服务,由接口和完成类构成,以下图所示。服务左券插件界说了服务接口,服务虚现插件向服务总线注册服务,服务挪用插件使用服务左券(接口)从服务总线猎取完成的服务并挪用,服务虚现插件和服务挪用插件都依附于服务左券,但两者并未有依附。服务是插件间松耦合的挪用体例。

我们但愿在不变动现有的通信机制的情形下,将之前界说的在统一个框架下的服务可以间接不变动代码情形下,酿成远程服务。此时,基于远程服务的通信体例酿成以下图所示的体例。

这时候候,在不变动服务界说、服务注册的代码下,在OSGi.NET框架中安装一个远程服务宿主插件,它间接将服务总线的服务表露成远程服务;OSGi.NET插件框架安装一个远程服务客户端插件,就能够利用服务左券来猎取并挪用远程服务。
接上去,我们但愿能更进一步在不必要变动服务界说和注册代码情形下,来完成通明的集群撑持。

在这里,我们引进了负载平衡插件。起首,一个OSGi.NET插件框架安装了远程服务负载平衡插件,它办理一切远程服务的负载情况,并为集群供应了一致的会见和负载平衡撑持;接着,一切安装了远程服务宿主插件的OSGi.NET框架,会安装一个负载平衡客户端插件,它用于将远程服务注册到负载平衡器;服务挪用端安装了远程服务客户端插件,它经由过程负载平衡器来挪用远程服务。
这个思绪能够复杂形貌以下:
A)当地服务=OSGi.NET插件框架+服务左券插件+服务虚现插件+服务挪用插件;服务虚现和服务挪用在统一个OSGi.NET插件框架内,在统一个历程。
B)远程服务虚现=OSGi.NET插件框架+服务左券插件+服务虚现插件+远程服务宿主插件,远程服务挪用=OSGi.NET插件框架+服务左券插件+远程服务客户端插件;服务虚现和服务挪用能够在分歧的OSGi.NET插件框架,在分歧历程内。
C)负载平衡器=OSGi.NET插件框架+远程服务负载平衡插件,负载平衡远程服务虚现=OSGi.NET插件框架+服务左券插件+服务虚现插件+远程服务宿主插件+负载平衡客户端插件,远程服务挪用=OSGi.NET插件框架+服务左券插件+远程服务客户端插件;负载平衡器、远程服务、服务挪用都可以在分歧OSGi.NET插件框架和分歧历程,远程服务能够在多台呆板中,注册到负载平衡器。
2计划方针
远程服务和负载平衡的完成基于模块化思绪,以下图所示。

(1)不变动当地服务的界说、注册和利用办法;
(2)在当地服务的基本上,安装远程服务宿主插件,服务就表露成远程服务;
(3)在远程服务的基本上,安装负载平衡客户端插件和负载平衡器,远程服务就撑持集群及负载平衡。
以一个复杂的服务ISayHelloService为例,上面将形貌怎样经由过程以上体例来完成远程服务和服务集群。
2.1远程服务示例
2.1.1远程服务注册及完成
以下图所示,SayHelloServiceContract插件界说了一个ISayHelloService服务接口,SayHelloService界说了SayHelloServiceImpl服务虚现,在OSGi.NET插件框架安装了UIShell.RemoteServiceHostPlugin插件,如许我们就将当地服务表露成远程服务了。

下图是SayHelloServiceImpl服务的完成和服务注册。

下图则是服务注册。

你能够发明,为了撑持远程服务,我们仅仅是安装了一个远程服务宿主插件,而没有变动服务的完成和注册办法。
2.1.2远程服务挪用
远程服务挪用以下所示,在OSGi.NET插件框架安装了远程服务客户端插件。服务挪用插件利用服务左券,来挪用远程服务。

挪用远程服务的步骤为:
1利用远程服务客户端插件的IRemoteServiceProxyService来猎取远程服务;
2间接挪用远程服务的办法。
因而,你能够发明,远程服务的界说和利用都十分的复杂。接上去我们再看看负载平衡远程服务的利用。
2.2负载平衡远程服务示例
2.2.1负载平衡器
负载平衡器相称于远程服务注册表,它用于注册表露远程服务的一切呆板和每个呆板每个服务的负载平衡情况,并供应负载平衡撑持。下图是负载平衡器的完成。

负载平衡器向外表露一个流动的IP地点和端标语,用于注册远程服务,并供应负载平衡。
2.2.2负载平衡远程服务
撑持负载平衡的远程服务必要安装一个负载平衡客户端插件,以下所示。负载平衡客户端插件用于将远程服务注册到负载平衡器,从而,负载平衡器能够来办理远程服务的负载情形,当产生妨碍时能够完成负载转移和完成负载平衡。

这里,远程负载平衡器客户端插件会毗连到负载平衡服务器,向其注书籍呆板的远程服务。
2.2.3负载平衡远程服务挪用
挪用负载平衡远程服务与间接挪用远程服务办法相似,以下图所示。它利用GetFirstOrDefaultLoadBalancerService接口来会见负载平衡器,猎取经由负载平衡的远程服务。

你能够发明,挪用负载平衡远程服务的办法也十分复杂。上面,我来先容一下怎样完成。
3计划完成
起首,我们先来看看远程服务的完成。
3.1远程服务的完成
远程服务的完成能够回结为以下几点:(1)远程服务宿主插件用于表露一个WCF服务,这个WCF服务相称于当地服务的Bridge,即客户端对远程服务的挪用先中专到这个WCF服务,再由WCF服务来挪用当地服务,然后前往给客户端;(2)客户端利用DynamicProxy为服务左券天生一个代办署理,对这个代办署理的办法挪用将会被拦阻,然后挪用远程服务宿主插件的WCF服务,将挪用了局再前往。
3.1.1远程服务宿主插件完成
该插件起首界说了一个IRemoteServiceInvoker的WCF服务接口,这个接口及参数的界说以下。

它的感化就是经由过程挪用这个WCF远程服务来挪用OSGi.NET框架当地服务,到达将当地服务表露成远程服务的目标。
这个WCF的完成代码以下所示,其目标就是对WCF的挪用转换成对当地服务办法的挪用并前往。

1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Threading;6usingSystem.Reflection;7usingSystem.Threading.Tasks;8usingfastJSON;9usingFasterflect;10usingUIShell.OSGi.Utility;1112namespaceUIShell.RemoteServiceHostPlugin13{14publicclassRemoteServiceInvoker:IRemoteServiceInvoker15{16publicstaticReaderWriterLockLocker=newReaderWriterLock();17publicstaticDictionary<string,System.Tuple<MethodInfo,Type[],MethodInvoker>>InvokerCache=newDictionary<string,System.Tuple<MethodInfo,Type[],MethodInvoker>>();1819publicstringInvokeService(RemoteServiceInvocationinvocation)20{21AssertUtility.NotNull(invocation);22AssertUtility.ArgumentHasText(invocation.ContractName,"servicecontractname");23AssertUtility.ArgumentHasText(invocation.MethodName,"servicemethodname");2425varservice=Activator.Context.GetFirstOrDefaultService(invocation.ContractName);26stringmsg=string.Empty;27if(service==null)28{29msg=string.Format("RemoteService{0}notfound.",invocation.ContractName);30FileLogUtility.Warn(msg);31thrownewException(msg);32}3334System.Tuple<MethodInfo,Type[],MethodInvoker>invokerTuple;35using(varlocker=ReaderWriterLockHelper.CreateReaderLock(Locker))36{37InvokerCache.TryGetValue(invocation.Key,outinvokerTuple);38}3940if(invokerTuple==null)41{42TypeserviceType=service.GetType();4344varserviceMethodInfo=serviceType.GetMethod(invocation.MethodName);45if(serviceMethodInfo==null)46{47msg=string.Format("Themethod{1}oftheremoteservice{0}notfound.",invocation.ContractName,invocation.MethodName);48FileLogUtility.Warn(msg);49thrownewException(msg);50}5152if(invocation.JsonSerializedParameters==null){53invocation.JsonSerializedParameters=newList<string>();54}5556varparameterInfos=serviceMethodInfo.GetParameters();57if(invocation.JsonSerializedParameters.Count!=parameterInfos.Length)58{59msg=string.Format("Theparameterscountisnotmatchwiththemethod{0}ofservice{1}.Theexpectedcountis{2},theactualcountis{3}.",invocation.MethodName,invocation.ContractName,parameterInfos.Length,invocation.JsonSerializedParameters.Count);60FileLogUtility.Warn(msg);61thrownewException(msg);62}6364varparameterTypes=newType;65for(inti=0;i<parameterInfos.Length;i++)66{67parameterTypes=parameterInfos.ParameterType;68}6970try71{72varmethodInvoker=serviceType.DelegateForCallMethod(invocation.MethodName,parameterTypes);7374invokerTuple=newSystem.Tuple<MethodInfo,Type[],MethodInvoker>(serviceMethodInfo,parameterTypes,methodInvoker);7576using(varlocker=ReaderWriterLockHelper.CreateWriterLock(Locker))77{78if(!InvokerCache.ContainsKey(invocation.Key))79{80InvokerCache=invokerTuple;81}82}83}84catch(Exceptionex)85{86msg=string.Format("Failedtocreatedelegatemethodforthemethod{0}ofservice{1}.",invocation.MethodName,invocation.ContractName);87FileLogUtility.Warn(msg);88FileLogUtility.Warn(ex);89thrownewException(msg,ex);90}91}9293varparamters=newobject;9495for(inti=0;i<invokerTuple.Item2.Length;i++)96{97try98{99paramters=JSON.ToObject(invocation.JsonSerializedParameters,invokerTuple.Item2);100}101catch(Exceptionex)102{103msg=string.Format("Failedtounserializethe{0}thparameterforthemethod{1}ofservice{2}.",i+1,invocation.MethodName,invocation.ContractName);104FileLogUtility.Warn(msg);105FileLogUtility.Warn(ex);106thrownewException(msg,ex);107}108}109110try111{112returnJSON.ToJSON(invokerTuple.Item3(service,paramters));113}114catch(Exceptionex)115{116msg=string.Format("Failedtoinvokethemethod{0}ofservice{1}.",invocation.MethodName,invocation.ContractName);117FileLogUtility.Warn(msg);118FileLogUtility.Warn(ex);119thrownewException(msg,ex);120}121}122}123}
3.1.2远程服务客户端插件的完成
接上去,我们看看远程服务客户端插件的完成。它界说了一个IRemoteServiceProxyService服务,表露了两个接口分离用于对远程服务和负载平衡远程服务的挪用。

该服务的远程服务猎取完成以下所示。

它仅仅时经由过程DynamicProxy创立远程服务代办署理类,此时,对代办署理类办法的挪用会转换成远程服务挪用。上面看看拦阻机的完成。

1classRemoteServiceProxyInterceptor:IInterceptor,IDisposable2{3privateRemoteServiceContext_remoteServiceContext;4privateRemoteServiceClient_remoteServiceClient;5publicRemoteServiceProxyInterceptor(RemoteServiceContextcontext)6{7_remoteServiceContext=context;8_remoteServiceClient=newRemoteServiceClient(_remoteServiceContext.IPAddress,_remoteServiceContext.Port);9_remoteServiceClient.Start();10}11publicvoidIntercept(IInvocationinvocation)12{13try14{15varjsonParameters=newList<string>();16foreach(varparamininvocation.Arguments)17{18jsonParameters.Add(JSON.ToJSON(param));19}2021varresultJson=_remoteServiceClient.Invoke(invocation.Method.DeclaringType.FullName,invocation.Method.Name,jsonParameters);2223if(!invocation.Method.ReturnType.FullName.Equals("System.Void"))24{25invocation.ReturnValue=JSON.ToObject(resultJson,invocation.Method.ReturnType);26}27else28{29invocation.ReturnValue=null;30}31}32catch(Exceptionex)33{34FileLogUtility.Error(string.Format("FailedtoinvoketheremoteserviceRemoteService:{0},Method:{1}.",35invocation.Method.DeclaringType.FullName,invocation.Method.Name));36throw;37}38}3940publicvoidDispose()41{42if(_remoteServiceClient!=null)43{44_remoteServiceClient.Stop();45_remoteServiceClient=null;46}47}48}
拦阻机的代码很复杂,对远程服务代办署理类办法的挪用将间接转换成对远程服务宿主插件的WCF服务的挪用。上面看看负载平衡远程服务的完成。
3.2负载平衡远程服务的完成
有了以上的手艺,关于负载平衡远程服务的完成,就复杂多了。负载平衡远程服务的目标就是将一切远程服务一致在负载平衡服务器举行注册,并完成负载的静态办理。因而,必要在远程服务基本上,创立一个负载平衡服务器和负载平衡客户端。负载平衡服务器用于办理一切远程服务及供应远程服务的呆板,办理一切远程服务的负载情形,并完成负载平衡及妨碍转移;负载平衡客户真个目标时将远程服务注册到负载平衡器,而且当远程服务封闭时从负载平衡器卸载。上面,看看负载平衡器的完成。
3.2.1负载平衡器完成
负载平衡服务器表露了以下WCF服务。这个服务用于供应远程服务注册和卸载和负载平衡哀求。

这个服务的完成以下所示。

它利用远程服务注册表来完成远程服务的办理和负载平衡的完成。
3.2.2负载平衡客户真个完成
负载平衡客户真个目标时完成远程服务的注册与卸载,经由过程该插件将远程服务表露到负载平衡服务器。如许服务挪用者就能够经由过程负载平衡器来挪用远程服务。

3.2.3负载平衡远程服务挪用
负载平衡远程服务的挪用体例的完成和远程服务相似。它由远程服务代办署理服务的GetFirstOrDefaultLoadBalancerService接口来完成。

该接口的完成以下所示,次要时创立代办署理和办法拦阻机。


当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。

金色的骷髅 发表于 2015-1-20 12:21:01

选择一些适于初学者的Linux社区。

蒙在股里 发表于 2015-1-23 22:03:06

永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。

第二个灵魂 发表于 2015-1-31 20:08:04

当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。

老尸 发表于 2015-2-1 23:14:37

以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。

小女巫 发表于 2015-2-13 03:57:08

linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!

小魔女 发表于 2015-3-3 13:23:13

笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机

只想知道 发表于 2015-3-7 17:54:00

Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。

冷月葬花魂 发表于 2015-3-9 00:01:40

其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。

兰色精灵 发表于 2015-3-16 18:22:48

我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。

山那边是海 发表于 2015-3-22 23:37:07

当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
页: [1]
查看完整版本: Linux编程:分享在Linux下利用OSGi.NET插件框架疾速完成一个散布式服务集群的办法仓酷云 ...