基于XML的可配置服务实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于XML的可配置服务实现及应用1简介在合适的应用场景中,使用模块化、可配置的服务可很大程度上降低代码量,提高系统健壮性,减少代码调试工作量。本案实现的服务有以下特性:1、通过配置定制服务行为以响应不同的请求。2、服务模块化、不同的业务逻辑可通过实现约定接口的服务类来响应不同的业务请求,服务类可通过配置文件指定服务行为并装载类实例。3、在跨边界的通讯中,可通过同一通道传输服务配置文档来请求服务,调用者接口相对简单,传输通道和传输方式可灵活多样。4、通过XML传输请求以及结果回复,使用方便快捷,各平台都支持良好。具有广泛的通用性。5、在频繁的业务变更时,通过修改配置来适应业务逻辑变化。2默认约定默认情况下,本案提及的配置或代码清单均用.net框架实现,读者请结合所使用的开发平台以及框架加以理解。3必备知识XML、XPath、XQuery、Reflection。4应用场景1、本方案适用的场景有如下特点:2、跨边界3、业务可抽象为单一或数量不多的接口4、跨语言5通讯模型客户端请求时,将调用细节封装为一个Xml报文,通过单一传输通道进行传输,而通道可用多种方式实现,如WCF、Socket等方式,根据实际情况合理选择。服务端收到请求报文后,解释报文,获取相应的服务来响应请求,请求完成后,将结果以Xml的方式通过传输通道返回给调用者。服务请求方服务提供方服务名参数列表XMLXML通道WCFSocketMessageNamedPipes报文解释服务池ServiceServiceService6应用场景样例1.1服务请求服务接口(Query)参数SchDate=2011-12-01SchCode=100101DstNode=GAXMLrootheadersrcserver30003/srcservertagserverDC/tagserverserviceQuery/servicetransid//headerparametersSchDate2011-12-01/SchDateSchCode100101/SchCodeDstNodeGA/DstNode/parametersresponseerrcode0/errcodeerrmsg/errmsg/responsedata//root服务(Query)DB服务池服务池服务池服务池1.2请求响应服务接口(Query)XML?xmlversion=1.0encoding=utf-8?rootheadersrcserver30003/srcservertagserverDC/tagserverserviceQuery/servicetransid//headerparameters/parametersresponseerrcode0/errcodeerrmsg/errmsg/responsedatarowSTCode=1001STName=龙头寺汽车站/rowSTCode=2001STName=朝天门汽车总站//data/root服务(Query)DB服务池服务池服务池服务池1.3三方通讯客户端请求接口(Query)参数SchDate=2011-12-01SchCode=100101DstNode=GAXMLrootheadersrcserver30003/srcservertagserverDC/tagserverserviceQuery/servicetransid//headerparametersSchDate2011-12-01/SchDateSchCode100101/SchCodeDstNodeGA/DstNode/parametersresponseerrcode0/errcodeerrmsg/errmsg/responsedata//root中心服务(Query)客户端服务响应接口(Query)服务响应接口SchDate=2011-12-01SchCode=100101DstNode=GA服务池服务池服务池服务池转发服务应用边界?xmlversion=1.0encoding=utf-8?rootheadersrcserver30003/srcservertagserverDC/tagserverserviceQuery/servicetransid//headerparameters/parametersresponseerrcode0/errcodeerrmsg/errmsg/responsedatarowSTCode=1001STName=龙头寺/rowSTCode=2001STName=朝天门//data/root注:三方通讯时,中心主要起转发作用,中心服务仅在请求需要拦截处理时调用。7服务实现1.4服务端1.4.1通讯接口由于系统使用同一传输通道进行传输,定义一个通讯接口即可:publicRequestMessageRequest(RequestMessageRequestMsg)1.4.2服务接口约定方法参数返回值备注ConstructXmlNodenode无构造服务,配置服务行为。ExecuteObjectmsgobject运行服务。IsFree无bool检测服务是否空闲,用于构造服务缓冲池。SetFreeboolFree无设置服务空闲状态。1.4.3服务配置1.4.3.1样例一以下是一个访问数据库的服务配置样例,不同服务可单独实现不同的配置内容,只要在Construct方法内识别即可:QueryServiceRC.XmlDbService.XmlDbService,RC.XmlDbService/ServiceCommandTextP_Query/CommandTextCommandTypeStoredProcedure/CommandTypeNHConfigFileNamehibernate.cfg.xml/NHConfigFileNameParamsParaname=SchDatexpath=/root/parameters/SchDatedefault=mandatory=False/Paraname=SchCodexpath=/root/parameters/SchCodedefault=mandatory=False/Paraname=DstNodexpath=/root/parameters/DstNodedefault=mandatory=False//Params/Query1.4.3.2样例二以下是一个动态调用WebService接口的服务配置样例,由单独的程序把WSDL编译成一个Dll,调用WebService时只要访问此服务即可:QueryServiceRC.XmlWSService.XmlWSService,RC.XmlWSService/ServiceAssemblyNameRC.Webservice.NetSaleService/AssemblyNameClassNameNetSaleService/ClassNameMethodNameP_Query/MethodNameParamsParaname=StartStationxpath=/root/parameters/StartStationdefault=mandatory=True//Params/Query1.4.4实现步骤1.4.4.1实例化服务实例时,必须通过反射机制装载,不能硬编码实例化服务类,否则,应用与服务之间就会紧密藕合。通过反射机制,读取配置节点“Service”,获取程序集(dll、jar)即可实例化类。为了使用反射机制实例化,必须实现一个无参数构造函数。特征代码如下:AssmblyInfo=ServiceNodes[ServiceName].SelectSingleNode(Service).InnerText.Split(',');stringClassName=AssmblyInfo[0].Trim();stringAssemblyName=AssmblyInfo[1].Trim();System.Reflection.Assemblyasm=System.Reflection.Assembly.Load(AssemblyName);Typet=asm.GetType(ClassName);IMessageServicesvc=Activator.CreateInstance(t)asIMessageService;1.4.4.2服务构造服务实例化后,通过Construct方法,加载服务行为配置。特征代码如下:svc.Construct(ServiceNode);Construct实现样例见“代码清单_服务构造.txt”。1.4.4.3请求处理服务通过Execute进行请求响应处理,传入参数为Xml报文,此设计是为了在请求处理的时候可以获取完整的请求信息。如果使用强命名的参数,由于接口参数数量和类型不一,接口难以约定。特征代码见“代码清单_请求处理.txt”。1.4.4.4缓冲池设计完成服务请求有空闲服务?取出服务互斥阻塞标志繁忙请求处理标志空闲Y缓冲达上限?构造服务标志繁忙入池NNY返回错误完成尝试超5秒?YN隔50ms重试特征代码见“代码清单_缓冲池.txt”。1.5请求端由于系统使用同一传输通道进行传输,定义一个通讯接口即可:publicRequestMessageRequest(RequestMessageRequestMsg)。接口只逻辑尽量简化,只是将参数封装为Xml报文和做必要的验证及异常处理即可。程序样例见“代码清单_报文封装.txt”。金鳞子QQ:657501127

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功