发明内容
发明目的:本发明所要解决的技术问题是针对上述技术的不足,提供一种高时效性的分布式服务集成调用系统,一方面使得在网络中传输的服务消息长度尽可能缩短,节省网络带宽资源,提高消息传输效率速度;另一方面,通过为服务请求者和服务定义统一的地址表示方法,并为两者之间绑定最优的传输通道,提高调用性能。
技术方案:本发明公开了一种高时效性的分布式服务集成调用系统,应用于具有多个服务请求者和多个服务的分布式服务集成调用环境中;包括服务请求者、服务、服务接口描述文件、服务消息编解码子系统、服务消息传输子系统,其特征在于,服务请求者与服务之间的调用,采用二进制字节流格式的服务消息交换协议;
所述二进制字节流格式的服务消息交换协议包括二进制格式的服务消息头和二进制格式的服务消息正文;
所述服务消息包含服务消息头和服务消息正文,服务消息正文紧接在服务消息头之后;
所述的服务消息头和服务消息正文按照网络字节序进行排列;
所述服务消息头包含类型标识、版本信息、消息头长度、消息关联标识、超时时间值、响应回送IP地址、响应回送实体标识、服务标识长度、服务接口标识长度、服务标识、服务接口标识;
所述类型标识占4个比特位,用作判断服务消息的类型,进行服务消息分类;其中,类型标识(0000)2表示该消息是服务请求消息,服务请求消息正文中的内容包含编码后的服务输入参数值;类型标识(0001)2表示该消息是服务响应消息,服务响应消息正文中的内容包含编码后的服务输出参数值;类型标识(0010)2表示该消息是服务错误消息,服务错误消息正文中的内容是服务错误代码值;
所述消息关联标识用于在实现服务同步或异步调用时关联服务请求消息与服务响应消息;
所述超时时间值表示本条服务消息过期失效的时间,是基于UTC(Universal TimeCoordinated,通用协调时)的绝对时间值;
所述响应回送IP地址,是发起服务调用的服务请求者地址或者需要服务指定发送的一个目的地址;
所述服务消息在被发送前进行编码,在被接收后、处理前进行解码。
本发明中,所述的服务消息编解码子系统根据服务接口描述文件实现对各个服务消息的通用编码和解码处理,包括服务请求消息正文编码接口、服务请求消息正文解码接口、服务响应消息正文编码接口以及服务响应消息正文解码接口;
所述服务请求消息正文编码接口在服务请求者调用服务时执行,在服务请求者端对服务输入参数进行编码,所述服务输入参数包括服务接口的输入参数、输入输出参数,编码处理顺序与服务接口描述文件中的服务输入参数顺序一致,编码后的结果数据是服务请求消息正文;
所述服务请求消息正文解码接口在服务接收到服务请求消息时执行,服务端对服务请求消息正文中编码过的服务输入参数进行解码,解码处理顺序与服务输入参数编码处理顺序一致,解码后的结果数据是服务输入参数值;
所述服务响应消息正文编码接口在服务返回调用结果时执行,服务端对服务输出参数进行编码,服务输出参数包括服务接口的输出参数、输入输出参数和返回值,编码处理顺序与服务接口描述文件中的服务输出参数顺序一致,其中,返回值被最后编码,编码后的结果数据是服务响应消息正文;
所述服务响应消息正文解码接口在服务请求者接收到服务响应消息时执行,在服务请求者端对服务响应消息正文中编码过的服务输出参数进行解码,解码处理顺序与服务输出参数编码处理顺序一致,解码后的结果数据是服务输出参数值;
所述服务输入参数和服务输出参数都是服务参数,它们的类型包括基本类型、指针类型和复杂类型;其中,基本类型包括字符型、短整型、整型、长整型、单精度浮点型、双精度浮点型、字符串型;复杂类型包括结构类型、数组类型。
本发明中,所述的服务接口描述文件采用XML语言描述服务接口,一个服务接口描述文件用于描述一个服务的多个接口,描述文件的内容包括服务元素(SERVICE)、服务名称元素(SERVICENAME)、服务接口元素(METHOD)、接口名称元素(METHODNAME)、参数元素(PARAMETER)、参数元素属性、参数类型元素(TYPE)、参数类型属性;所述服务元素是服务接口描述的根元素;服务接口元素表示接口,作为服务元素的子元素;所述接口名称元素描述服务的接口名称;参数元素是接口参数的描述,接口的每个参数对应一个参数元素;参数元素属性包括参数名(PARANAME)、参数类型(PARATYPE)、参数序号(PARANO)、参数指针标志(isPOINTER)、参数模式标识(INOUT)、参数数组特性(NUMS);参数类型元素是参数类型的描述;参数类型属性包括类型名称(TYPENAME)、类型长度(TYPELENGTH)以及类型分类标识(KIND)。
本发明中,所述的服务消息传输子系统包括消息传输通道绑定模块、基于socket套接字的消息传输通道、基于共享区的消息传输通道和基于直接地址调用的消息传输通道;按照实现的传输效率的高低进行比较,基于直接地址调用的消息传输通道传输效率最高,其次是基于共享区的消息传输通道,最后是基于socket的消息传输通道;
所述服务消息传输子系统定义了标识服务或服务请求者位置的地址表示方法,所述地址表示方法为网络中的服务或服务请求者统一分配一个唯一的地址。所述地址由IP地址和实体标识两部分组成,实体标识表示服务或服务请求者的软件运行单元,各个服务或服务请求者采用相互区别的实体标识,所述IP地址用数值表示,占4个字节,所述实体标识用数值表示,占2个字节。
所述消息传输通道绑定模块是被服务请求者或服务调用的接口函数库,包括实体注册接口、消息通用传输接口;服务请求者或服务在初始化时调用实体注册接口将自己的实体标识注册到消息传输通道绑定模块中,服务消息通过消息通用传输接口收发。消息通用传输接口在收发服务消息时,根据服务请求者和服务的地址和已注册的实体标识信息,分析并判断服务请求者与服务之间的软件单元部署关系,实时绑定对应传输方式的消息通道,提高服务消息的传输效率。其中,服务和服务请求者之间的软件单元部署关系的判断方法为:服务请求者和服务的实体标识信息在消息传输通道绑定模块中都已注册,表示两者在同一个进程空间;服务请求者和服务的实体标识信息在消息传输通道绑定模块中未同时注册,但两者的IP地址相同,表示两者在同一个主机节点,不在同一个进程空间;服务请求者和服务的IP地址不同,表示两者不在同一个主机节点;
如果判断服务和服务请求者在同一个进程空间则绑定基于直接地址调用的消息传输通道,是将服务消息作为函数参数在两者的接口之间进行直接传递;
如果判断服务和服务请求者在同一个主机节点,但不在一个进程空间则绑定基于共享区的消息传输通道,是通过共享区交互和信号灯互斥的方式将服务消息在两者之间进行进程间通信传递;该通道主要包括共享区初始化接口、写共享区接口、读共享区接口、共享区退出接口;
如果判断服务和服务请求者不在同一个主机节点则绑定基于socket套接字的消息传输通道,是采用TCP/IP协议的socket接口方式将服务消息在两者之间进行网络通信传输;该通道主要包括网络传输初始化接口、网络发送接口、网络接收接口、网络传输退出接口。
有益效果:本发明由于采用了二进制字节流的方式作为协议,减少了基于XML的协议标签信息,并且在字节流中不包含参数名、参数类型等信息,而是将这些信息放到了服务接口描述文件中,又大大减少了网络中传输的消息长度。同时,在服务消息传输子系统中定义了标识服务或服务请求者位置的地址表示方法,使消息传输通道绑定模块可以实时绑定到最优的传输通道,从而有利于提高服务消息的传输效率,增强服务调用性能。
具体实施方式:
如图1所示,本发明公开了一种高时效性的分布式服务集成系统,该系统针对服务集成需要解决的时效性问题,进行了如下实现:该系统可以集成分布式网络环境中的多个服务请求者与多个服务,服务请求者与服务之间的调用采用二进制字节流格式的服务消息交换协议,调用产生的服务消息由服务消息编解码子系统通过解析服务接口描述文件进行编码和解码处理,服务消息的传递由服务消息传输子系统完成,服务消息传输子系统包括消息传输通道绑定模块和三种适用于不同情况且传输效率不同的消息通道,按传输效率的高低,它们分别是基于直接地址调用的消息传输通道、基于共享区的消息传输通道、基于TCP/IP的消息传输通道,服务消息的传递具体使用哪个消息通道,是由消息传输通道绑定模块根据服务和服务请求者之间的地址关系进行实时绑定的。
图2显示了本发明中的二进制字节流格式的服务消息交换协议(Binary-BasedService Message Exchange Protocol,简称BBSMEP)组成。所有的服务消息遵循服务消息交换协议,服务消息包括服务消息头和服务消息正文两部分,服务消息头在每条服务消息中都存在。图中,协议内容上方的数字代表比特位,从0~31,共32位,4个字节,协议中各组成部分对应的范围表示其占用的比特位个数。协议内容从左到右,从上至下的排列关系表示了协议中各组成部分在服务消息中的位置关系。服务消息头包括定长和不定长两个部分,定长部分占28个字节,其中包括3个字节的保留位,可用于扩展;变长部分为服务标识、服务接口标识。服务消息正文为可变长度,其内容可以是服务请求消息正文、服务响应消息正文或服务错误消息正文。
服务消息头包括类型标识(TypeID)、版本信息(Version)、消息头长度(HeadLength)、消息关联标识(CorrelationID)、超时时间值(Timeout)、响应回送IP地址(ReplyIP)、响应回送实体标识(ReplyEntity)、服务标识长度(SvcIDLength)、服务接口标识长度(InfIDLength)、服务标识(SvcID)、服务接口标识(InfID)以及保留位(Reserve)信息。类型标识(TypeID)是表示服务消息的类型,如果类型标识=(0000)2表示该消息是服务请求消息,消息正文中的内容包含编码过的服务输入参数值;如果类型标识=(0001)2表示该消息是服务响应消息,消息正文中的内容包含编码过的服务输出参数值;如果类型标识=(0010)2表示该消息是服务错误消息,消息正文中的内容是服务错误代码值。消息关联标识(CorrelationID)是服务请求消息与服务响应消息的关联标识,用于实现服务的同步或异步调用。超时时间值(Timeout)表示本条消息过期失效的时间,填写的是基于UTC的绝对时间值,单位为毫秒。当该值=0,表示本条服务消息永不过期。该协议字段帮助了时间敏感性较强的应用系统避免去处理已经过期的消息。响应回送IP地址(ReplyIP)和响应回送实体标识(ReplyEntity)共同组成来表示服务响应消息要发送的目的地地址。响应回送IP地址(ReplyIP)是占4个字节的数值型数据,响应回送实体标识(ReplyEntity)是占2个字节的数值型数据,当ReplyIP=0时,表示本次服务请求不需要返回响应,与此同时,CorrelationID可以被应用系统自定义用作其它扩展用途。
服务消息正文包括服务请求消息正文、服务响应消息正文以及服务错误消息正文。其中,服务错误消息正文中填写的是服务调用过程中产生的错误代码值,服务请求消息正文和服务响应消息正文中包含的是经过服务消息编解码子系统编码处理后的服务输入参数或服务输出参数值。服务请求消息正文和服务响应消息正文缓冲区结构如图3所示,图中所指的参数根据消息正文类型的不同含义不同,如果是服务请求消息正文,参数是指所有的服务输入参数,且参数的顺序与服务接口中的输入参数顺序一致;如果是服务响应消息正文,参数是指所有的服务输出参数,包括返回值,其中,返回值作为最后一个服务输出参数。以服务请求消息正文缓冲区为例,设缓冲区的起始地址=0,从起始地址0开始的4个字节存放服务请求消息正文的总长度;从地址4开始的2个字节存放第一个服务输入参数值的缓冲区字节长度,设存放的该参数值缓冲区字节长度为x,那么接下来从地址6开始的x个字节存放该参数值;如果有第二个服务输入参数,并且该服务输入参数是结构类型,它有两个成员参数,则接下来从地址6+x开始的2个字节存放第二个服务输入参数值的缓冲区字节长度,而该参数值的缓冲区字节长度是等于两个成员参数所占缓冲区字节长度之和,设第一个成员参数值的缓冲区字节长度为y1,第二个成员参数值的缓冲区字节长度为y2,那么存放的第二个参数值的缓冲区字节长度等于2+y1+2+y2;接下来从地址6+x+2开始的2个字节存放第二个服务输入参数的第一个成员参数值的缓冲区字节长度y1,从地址6+x+2+2开始的y1个字节存放第二个服务输入参数的第一个成员参数值;接下来从地址6+x+2+2+y1开始的2个字节存放第二个服务输入参数的第二个成员参数值的缓冲区字节长度y2,从地址6+x+2+2+y1+2开始的y2个字节存放第二个服务输入参数的第二个成员参数值;以此类推,如果最后一个服务输入参数值的缓冲区字节长度等于n,则缓冲区最后n个字节存放的是最后一个服务输入参数值。
以上所述的服务请求消息正文和服务响应消息正文的编码与解码处理都是由服务消息编解码子系统执行,图4a和图4b显示了服务请求消息正文编码接口和服务请求消息正文解码接口的实现流程。
如图4a所示,服务请求消息正文编码接口的具体实施步骤为:
1)通过接口参数传递方式,获取服务标识、服务接口标识以及服务参数;
2)根据服务标识,获取对应的服务接口描述文件;具体的服务接口描述文件内容示例如下:
<SERVICE>
<SERVICENAME>SampleService<SERVICENAME>
<METHOD>
<METHODNAME>SampleInf</METHODNAME>
<PARAMETER PARANAME=″a″PARATYPE=″int32″PARANO=″0″
isPOINTER=″1″NUMS=″1″INOUT=″IN″/>
<PARAMETER PARANAME=″b″PARATYPE=″uint64″PARANO=″1″
isPOINTER=″0″NUMS=″3″INOUT=″IN″/>
<PARAMETER PARANAME=″c″PARATYPE=″string″PARANO=″2″
isPOINTER=″1″NUMS=″1″INOUT=″InOut″/>
<PARAMETER PARANAME=″d″PARATYPE=″S_DAReqst″
PARANO=″3″isPOINTER=″0″NUMS=″1″INOUT=″IN″/>
<PARAMETER PARANAME=″e″PARATYPE=″bool″PARANO=″4″
isPOINTER=″0″NUM=″1″INOUT=″OUT″/>
</METHOD>
<TYPE TYPENAME=″int32″KIND=″BASIC″TYPELENGTH=″32″/>
<TYPE TYPENAME=uint64″KIND=″BASIC″TYPELENGTH=″64″/>
<TYPE TYPENAME=″string″KIND=″ARRAY″/>
<TYPE TYPENAME=″bool″KIND=″BASIC″TYPELENGTH=″32″/>
<TYPE TYPENAME=″char″KIND=″BASIC″TYPELENGTH=″8″/>
<TYPE TYPENAME=″S_DAReqst″KIND=″STRUCT″>
<PARAMETER PARANAME=″x″PARATYPE=″int64″PARANO=″0″
isPOINTER=″0″NUMS=″1″/>
<PARAMETER PARANAME=″y″PARATYPE=″char″PARANO=″1″
isPOINTER=″0″NUMS=″1″/>
</TYPE>
</SERVICE>
上述示例中,SampleService服务有一个SampleInf接口,SampleInf接口有5个参数,分别为a、b、c、d、e,其中,a、b、d是接口的输入参数,c是接口的输入输出参数,e是接口的返回值。作为服务输入参数的有接口的输入参数和输入输出参数,共4个,分别为a、b、c、d;作为服务输出参数的有接口的输出参数、输入输出参数和返回值,共2个,分别为c、e。其中,参数b是数组类型参数,参数d是结构类型参数,参数d有2个成员参数x、y。
3)解析服务接口描述文件,形成一个服务接口内存树,该内存树结构中存储从服务接口描述文件中解析出来的元素名、元素值、属性值列表以及不同元素之间的父子或兄弟关系;
4)根据服务接口标识,从服务接口内存树中将属于该服务接口的参数信息解析生成为一个参数属性表。
5)参数属性表的记录字段包括参数序号(或成员参数序号)、参数名(或成员参数名)、成员标识、类型名称、指针标志、模式标识、数组标识、值长度、第一个成员参数标识号、下一个参数序号(或下一个成员参数序号)。每个参数在参数属性表中都有一条记录相对应,如果参数的类型是结构类型,参数的每个成员在参数属性表中也有一条记录相对应,参数与成员参数之间或成员参数与子成员参数之间的所属关系通过第一个成员参数序号和下一个成员参数序号关联。成员参数具有和参数一样的类型定义,即成员参数可以有子成员参数。成员参数序号从参数序号之后开始编号。成员标识=0,表示属性表中的该条记录对应的是参数;成员标识=1,表示属性表中的该条记录对应的是成员参数。参数序号的值与参数在服务接口中的排列序号相同。属性表中的第一个成员参数序号=0时,表示该参数(或成员参数)不是结构类型的参数;第一个成员参数序号>0时,表示该参数(或成员参数)是结构类型的参数,并且是第一个成员参数在属性表中的序号值。指针标志=0表示该参数(或成员参数)不是指针类型的参数,指针标志=1表示该参数(或成员参数)是指针类型的参数。模式标识=0表示该参数是接口的输入参数;模式标识=1表示该参数是接口的输出参数;模式标识=2表示该参数是接口的输入输出参数。数组标识用正整数表示,数组标识>1表示该参数(或成员参数)是数组,数组标识的值表示数组元素的个数。值长度是该参数(或成员参数)值的字节长度。
6)读取参数属性表,计算成员标识=0并且模式标识=0或=2的参数个数,结果得出服务输入参数的实际个数;
7)根据参数属性表,读取服务请求者传入的服务输入参数,分别解析计算出服务输入参数的值长度,并写入参数属性表的值长度字段中;
8)计算值长度的过程是:如果参数的类型是基本类型,且指针标志=0或=1,值长度为定义的基本类型长度;如果参数的类型是复杂类型中的结构类型,且指针标志=0或=1,值长度的计算方法是以递归的方式逐一计算出结构类型中每个成员参数及成员参数中的子成员参数的值长度,并将它们的值长度进行累计相加,得出该结构类型的参数的值长度;如果参数的数组标识>1,值长度为每个数组元素的值长度的累加值;
9)将所有服务输入参数的值长度进行累计,并加上参数属性表中服务输入参数及所有成员参数的个数的2倍值,得出服务输入参数编码缓冲区的长度,动态申请该长度的服务输入参数编码缓冲区;
10)根据参数属性表,按照服务请求正文缓冲区结构将服务请求者调用的服务接口的服务输入参数值依次放入服务输入参数编码缓冲区中;
11)最后,生成服务请求消息正文。动态申请服务请求消息正文缓冲区,缓冲区的起始4个字节存放服务输入参数编码缓冲区的长度,从第5个字节开始放入服务输入参数编码缓冲区的内容。
如图4b所示,服务请求消息正文解码接口的具体实施步骤为:
1)通过接口传递服务请求消息;
2)解析服务请求消息的消息头,得到服务标识,获取对应的服务接口描述文件;
3)该步骤同服务请求消息正文编码步骤3);
4)解析服务请求消息的消息头,得到服务接口标识,从服务接口内存树中将属于该服务接口的参数信息解析生成为一个参数属性表。
5)该步骤同服务请求消息正文编码步骤5);
6)该步骤同服务请求消息正文编码步骤6);
7)解析服务请求消息正文,获取服务请求消息正文中的起始4个字节的值,得出服务输入参数编码缓冲区的长度;
8)最后,读取参数属性表,根据参数属性表中服务输入参数的描述,顺序读取服务输入参数编码缓冲区,依次解码得出服务输入参数的值。方法是:首先定义一个偏移标记,用于指示当前读取服务输入参数缓冲区的起始位置,该偏移标记初始化为0;在偏移标记的位置开始从服务输入参数编码缓冲区中读出2个字节,得到第一个服务输入参数的值长度,偏移标记加2;此时判断参数属性表中该参数的类型名称,如果是基本类型,则按得到的值长度从当前偏移标记的位置开始读出相应长度的数据,并赋值到服务输入参数变量中;如果是结构类型,则按得到的值长度从当前偏移标记的位置开始读出相应长度的数据,读出的数据是该服务输入参数的成员参数缓冲区,然后进行递归处理,将成员参数缓冲区以上述解析服务输入参数缓冲区的方法继续解析,读出该服务输入参数的成员参数值,从而解码得到结构类型的服务输入参数的值。
本发明中所述的服务响应消息正文编码接口的具体实施步骤为:
1)通过接口传递服务标识、服务接口标识以及服务参数;
2)根据服务标识,获取对应的服务接口描述文件;
3)该步骤同服务请求消息正文编码步骤3);
4)根据服务接口标识,从服务接口内存树中将属于该服务接口的参数信息解析出来,生成一个参数属性表。
5)该步骤同服务请求消息正文编码步骤5);
6)读取参数属性表,计算成员标识=0并且模式标识=1或=2的参数个数,结果得出服务输出参数的实际个数;
7)根据参数属性表,读取服务传入的服务输出参数,分别解析计算出服务输出参数的值长度,并写入参数属性表的值长度字段中;
8)计算值长度的过程同服务请求消息正文编码步骤8);
9)将所有服务输出参数的值长度进行累计,并加上参数属性表中服务输出参数及所有成员参数的个数的2倍值,得出服务输出参数编码缓冲区的长度,动态申请该长度的服务输出参数编码缓冲区;
10)根据参数属性表,将服务输出参数值依次放入服务输出参数编码缓冲区中;
11)最后,生成服务响应消息正文。动态申请服务响应消息正文缓冲区,缓冲区的起始4个字节存放服务输出参数编码缓冲区的长度,从第5个字节开始放入服务输出参数编码缓冲区的内容。
本发明中所述的服务响应消息正文解码接口的具体实施步骤为:
1)通过接口传递服务响应消息;
2)解析服务响应消息的消息头,得到服务标识,获取对应的服务接口描述文件;
3)该步骤同服务请求消息正文编码步骤3);
4)解析服务响应消息的消息头,得到服务接口标识,从服务接口内存树中将属于该服务接口的参数信息解析生成为一个参数属性表。
5)该步骤同服务请求消息正文编码步骤5);
6)该步骤同服务响应消息正文编码步骤6);
7)解析服务响应消息正文,获取服务响应消息正文中的起始4个字节的值,得出服务输出参数编码缓冲区的长度;
8)最后,读取参数属性表,根据参数属性表中服务输出参数的描述,顺序读取服务输出参数编码缓冲区,依次解码得出服务输出参数的值。方法是:首先定义一个偏移标记,用于指示当前读取服务输出参数缓冲区的起始位置,该偏移标记初始化为0;在偏移标记的位置开始从服务输出参数编码缓冲区中读出2个字节,得到第一个服务输出参数的值长度,偏移标记加2;此时判断参数属性表中该参数的类型名称,如果是基本类型,则按得到的值长度从当前偏移标记的位置开始读出相应长度的数据,并赋值到服务输出参数变量中;如果是结构类型,则按得到的值长度从当前偏移标记的位置开始读出相应长度的数据,读出的数据是该服务输出参数的成员参数缓冲区,然后进行递归处理,将成员参数缓冲区以上述解析服务输出参数缓冲区的方法继续解析,读出该服务输出参数的成员参数值,从而解码得到结构类型的服务输出参数的值。
图5是一个服务调用的示例图,是本发明包含但不仅限于的一个实施案例,现有一个系统,存在模块A和模块B,模块A需要调用模块B来完成系统的某项功能,因此,模块A是服务请求者,模块B是服务,它们分别被标识为服务请求者Requester和服务Service。假设系统在第一个阶段运行时,Requester和Service被部署在两台不同的主机上,其IP地址分别为IP1和IP2,实体标识分别为Entity1和Entity2。此时Requester调用Service的具体实施步骤如下:
1)Requester调用本地的消息传输通道绑定模块的实体注册接口,将本实体标识注册在该模块中;
2)Requester调用服务消息编解码子系统提供的服务请求消息正文编码接口对服务输入参数进行编码,同时将Service服务标识和服务接口标识传递给该接口;
3)服务消息编解码子系统在Requester第一次调用Service时解析存储在本地的服务接口描述文件,并将解析信息缓存在内存区中;
4)服务消息编解码子系统按照上述的服务请求消息正文编码方法对服务输入参数进行编码,并遵循服务消息交换协议生成服务消息头,形成完整的服务请求消息;
5)Requester调用消息通用传输接口,将服务请求消息传递给服务消息传输子系统进行消息传输处理;
6)消息传输通道绑定模块此时对注册的实体标识信息、Requester与Service的IP地址进行判断,发现IP1不等于IP2;
7)消息传输通道绑定模块在Requester第一次调用Service时调用网络传输初始化接口创建一个基于socket的消息传输通道,缓存Requester、Service与新建通道的信息;
8)消息传输通道绑定模块调用网络发送接口,由基于socket的消息传输通道将服务请求消息传送给Service;
9)Service所在主机的基于socket的消息传输通道接收到服务请求消息后,通知Service;
10)Service调用消息通用传输接口获取服务请求消息;
11)Service调用服务消息编解码子系统提供的服务请求消息正文解码接口对服务请求消息进行解码;
12)服务消息编解码子系统解析服务请求消息头与消息正文,在第一次接收到请求时解析本地的服务接口描述文件,并将解析信息缓存在内存中;
13)服务消息编解码子系统按照上述的服务请求消息解码方法解析出服务输入参数值,并返回给Service;
14)Service根据Requester指定调用的服务接口标识,执行相应的接口功能,返回服务输出参数;
15)Service调用服务消息编解码子系统提供的服务响应消息正文编码接口;
16)服务消息编解码子系统对服务输出参数进行编码,生成服务响应消息,返回给Service;
17)Service调用消息通用传输接口向Requester发送服务响应消息;
18)Requester所在主机的基于socket的消息传输通道接收到服务响应消息后,通知Requester;
19)Requester调用消息通用传输接口获取服务响应消息;
20)Requester调用服务消息编解码子系统提供的服务响应消息正文解码接口对服务响应消息进行解码;
21)服务消息编解码子系统对服务响应消息进行解码,将解码出来的服务输出参数值返回给Requester;
22)Requester根据返回的服务输出参数值执行相应的处理。
假设当系统进入到第二个阶段时,需要将Requester和Service都部署在IP1上,实体标识不变,此时Requester调用Service时,消息传输通道绑定模块会发现两者的IP地址都为IP1,在上述服务调用的实施步骤7)中,消息传输通道绑定模块会动态实时的改为调用共享区初始化接口创建一个基于共享区的消息传输通道,为Requester和Service传递服务请求/响应消息。假设最后,系统将Requester和Service都配置到一个进程中加载运行,此时Requester调用Service时,消息传输通道绑定模块会发现两者的IP地址都为IP1,同时在本地的实体注册信息中能够找到Entity1和Eniity2,在上述服务调用的实施步骤7)中,消息传输通道绑定模块会将服务消息作为函数参数,通过调用Service的接口和调用Requester的接口在两者之间直接传递。在以上几个不同阶段的执行过程中,对Requester和Service程序都不做任何编码修改。
本发明提供了一种高时效性的分布式服务集成调用系统的思路及方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。