具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
图1示意了一个根据SOA模型开发的应用程序在执行时,其中的各个服务(即该应用程序中的各不同的功能单元)之间的调用链路。如图1所示,假设该应用程序包括三个服务,服务A(Service A)、服务B(Service B)和服务C(Service C),在执行该应用程序时,该三个服务之间的调用顺序可以是服务A调用服务B,服务B调用服务C,并且,服务之间的调用可以是RPC调用过程。
每个服务都可以是由一个服务集群提供,例如,以服务B为例,提供该服务B的设备可以有多个,包括图1中所示的服务器11、服务器12和服务器13等设备,在本例子中,这些设备可以称为“服务提供设备”。提供某个服务的所有服务提供设备的IP地址的列表,可以称为该服务的“服务地址列表”,比如,如果服务器11的IP地址是IP1,服务器12的IP地址是IP2,服务器13的IP地址是IP3,那么服务B的服务地址列表为:[IP1、IP2、IP3……]。同样的道理,服务A和服务C也分别有一个对应的服务地址列表,用于表示能够提供对应服务的各个服务提供设备的IP地址。
对于应用程序中的各个服务之间的RPC调用,为了使得调用更加快捷或其他因素,通常可以进行路由分组。参见图2的示例,仍以图1中的三个服务为例,服务A、服务B和服务C都对应一个提供该服务的集群,集群中有很多服务提供设备。示例性的,可以由服务A的集群中选择出一个服务提供设备21,由服务B的集群中选择出两个服务提供设备,分别为服务提供设备22和23,由服务C的集群中选择出一个服务提供设备24。可以将选择出的服务提供设备21至24,作为一个路由分组,即在执行应用程序时,服务A只能由服务提供设备21提供,在服务A调用服务B时,只能由服务提供设备22和23中选择一个调用,尽管服务B的集群中还有其他的服务提供设备,但是只能由在本路由分组中的设备提供服务。当然,对于单个服务来说,被选择入分组中的设备可以不只一个设备,可以有多个。
如果记录下图2所示的路由分组中各个服务提供设备的IP地址,形成一个对应该路由分组的IP地址的列表,可以称为“分组信息”。例如,以图2为例,该路由分组的分组信息中可以包括[服务提供设备21的IP地址、服务提供设备22的IP地址、服务提供设备23的IP地址、服务提供设备24的IP地址]。在该分组信息中,只是罗列了位于同一分组中的各设备的地址,但是并没有指明各个设备之间的调用顺序。
本申请提供的远程调用方法,目的是在各个服务执行RPC调用的过程中实现路由分组,保证该RPC调用是在位于同一个路由分组中的各个服务提供设备之间执行的调用,并且,本申请实施例的方法将不会采用传统方式中的主控服务器控制的方式,而是由调用链路中的各个设备之间传输分组信息,再由各个设备自己根据分组信息确定下一个调用的服务在哪个设备。如下将详细描述本申请的远程调用方法的方案。
请结合参见图3,以一次RPC调用为例,来说明如何通过本申请的调用方法实现路由分组。如图3所示,分组中的各个设备,在开始执行调用之前,会接收到如下两方面的信息,这些信息可以是由配置中心31获取:
一种信息是:服务地址列表。
每个服务都可以知道自己下一步要调用的服务是哪个,例如,对于服务A来说,服务A可以根据自己的业务逻辑获知下一步要调用服务B,服务B同样可以知道自己下一步要调用服务C。本例子中,可以将下一个调用的服务称为目标服务,而将调用该目标服务的服务称为调用者。比如,以服务A来看,服务A是调用者,服务A下一步要调用的目标服务是服务B。
本例子中,配置中心31可以将对于每个服务来说,其目标服务的服务地址列表传输至该服务的设备。例如,结合图3来看,服务提供设备21用于提供服务A,那么该设备可以通知配置中心31,获取下一步调用的目标服务即服务B对应的服务地址列表。同样,服务提供设备22和23都可以向配置中心31获取下一步调用的目标服务即服务C的服务地址列表。
另一种信息是:分组信息。
本例子中,对于一个服务提供设备来说,该设备所在的路由分组可以有多个,比如,图3中所示的服务提供设备22,既可以在图3中所示的路由分组中,还可以同时位于其他的路由分组中。但是,如果一个服务提供设备是一次RPC调用的调用链路中的入节点,比如,图3中所示的服务A对应的服务提供设备21,本次调用是由该服务A开始的,那么作为入节点的服务提供设备21只能在一个路由分组中,目的是保证在入节点发生调用时能够明确知道自己所在的是哪个分组,以将分组信息向该调用链路的下游设备传递。不过,一个分组中可以有多个入节点。
分组信息对应的IP列表的格式可以为[rootIpList],[groupNodeIpList],其中,rootIpList是本次分组中作为调用入节点的设备的IP地址,例如,图3所示的服务提供设备21的IP地址;groupNodeIpList是本次分组中作为调用中间节点的设备的IP地址,例如,服务提供设备22和23的IP地址。
上述的服务地址列表和分组信息,可以是由使用人员在图3中所示的信息配置系统32进行配置,并传输至配置中心31,再由配置中心发送至服务提供设备。比如,信息配置系统32可以是一个具有web界面的配置系统,可以配置各个服务的服务地址列表,还可以配置各个路由分组的分组信息。配置中心31在接收到信息配置系统32传输的服务地址列表和分组信息后,可以将每个服务提供设备需要的服务地址列表传输至设备,并且将服务提供设备所在的各个路由分组的分组信息也传输至该设备。因此,对于图3所示的每个服务提供设备来说,可以存储有下一步调用的目标服务的服务地址列表、以及该设备所在的至少一个路由分组的分组信息。
如下说明在服务提供设备获得上述的服务地址列表和分组信息的基础上,执行RPC调用的过程,参见图4所示的流程,该流程可以是RPC调用的调用链路中的其中一个调用者执行,包括:
在步骤401中,求取服务地址列表和分组信息的交集,由所述交集中确定一个IP地址作为调用目标服务的目标地址。
本例子的调用者以图3中所示的服务提供设备21为例,该服务提供设备21发起调用,且下一步要调用的目标服务是服务B。在本步骤中,服务提供设备21可以求取服务地址列表和分组信息的交集。
例如,对于服务提供设备21来说,其下一步要调用的是服务B,服务B的服务地址列表中包括很多服务提供设备的IP地址,比如,图2中所示的服务B对应的集群中的诸多服务器的地址。而服务提供设备21作为图3所示的路由分组中的调用入节点(即RPC调用由该节点开始),其所在的分组信息只有一个。服务提供设备21可以根据自身的IP地址,查找从配置中心31获取到的分组信息,如果其自身的IP地址是某个分组信息中的rootIpList,那么可以确定该分组信息即为本次调用链路对应的分组信息。如图3所示,该分组信息中包括:[服务提供设备21的IP地址]、[服务提供设备22的IP地址]、[服务提供设备23的IP地址]、[服务提供设备24的IP地址]。
本步骤中,将服务地址列表和分组信息求取交集时,可以得到,[服务提供设备22的IP地址]、[服务提供设备23的IP地址],这两个IP地址对应的服务提供设备是用于提供服务B。即,路由分组的分组信息中,限定了位于同一个路由分组中的多个服务提供设备的IP地址,这些设备提供的服务包括了应用程序执行所需的各个服务,只是分组信息并为明确指明服务提供设备与服务的对应关系,不明了某个服务提供设备提供的是哪个服务,即服务提供设备21知道自己下一步要调用的目标服务是服务B,但是不知道服务提供设备22至24中,哪些设备提供了服务B。因此,通过本步骤求取交集,确定了在分组信息中是由服务提供设备22和服务提供设备23提供服务B。
通过上述说明可以看到,将取服务地址列表和分组信息求取交集得到的IP地址中,这些地址对应的设备既提供了目标服务又在与调用者同一个路由分组中。服务提供设备21可以由交集中确定一个IP地址作为调用目标服务的目标地址。例如,服务提供设备21可以选择服务提供设备22和服务提供设备23的任一个作为目标服务的提供者。
在步骤402中,根据目标地址调用目标服务,并将路由分组的分组信息传输至目标地址对应的服务提供设备,以使得服务提供设备根据分组信息调用下一个服务。
例如,假设在步骤401中选择了服务提供设备22的IP地址作为目标地址,则服务提供设备21可以根据该地址调用服务B。并且,在本例子中,服务提供设备21还可以将本次调用所在的路由分组的分组信息传输至服务提供设备22。比如,往下传的分组信息为:[服务提供设备21的IP地址]、[服务提供设备22的IP地址]、[服务提供设备23的IP地址]、[服务提供设备24的IP地址]。这样,当服务提供设备22要调用下一步服务C时,可以按照图4所示的流程,根据分组信息和服务C对应的服务地址列表求取交集,确定要调用的服务C的服务提供设备的地址。
本例子的远程调用方法,通过由RPC调用的调用链路中的各个设备之间传输分组信息,并由设备自身根据分组信息确定下一步调用的服务地址,相对于传统方式中每个设备都要与主控服务器交互来获取下一步调用的服务地址的方式,降低了网络开销。
在另一个例子中,有些情况下,调用链路中的上游设备未传输分组信息至调用者。例如,参见图5的示例,浏览器51是本次调用的起点,由浏览器51调用服务A,服务A是WEB服务端,服务A再调用服务B。由于某种传输协议的限制,可能会出现服务A能够将分组信息传输至服务B,而浏览器51不能传输分组信息至服务A,那么此时作为WEB服务端的服务A无法接收到分组信息。但是,在该调用链路中,浏览器51和服务A中的至少一个可以作为本次调用的入节点。
基于此,本例子中,服务A在确定自己并未接收到分组信息时,可以执行图6所示的流程,可以是作为WEB服务端的服务提供设备21来确定本次调用的分组信息。如图6所示,包括:
在步骤601中,若未接收到本次调用的上游设备传输的分组信息,则根据本地存储的至少一个分组信息,判断上游设备的IP地址是否位于其中一个分组信息且为入节点。
例如,本地存储的至少一个分组信息,可以是由配置中心接收到的各个分组信息,每个分组信息均包括本设备的IP地址。并且,每个分组信息均包括入节点和中间节点,根据本例子的规则设定,在分组信息中,作为入节点的IP地址只位于一个分组信息中。
本步骤中,若判断结果为是,即上游设备的IP地址(在该WEB服务的例子中,可以是浏览器的IP地址)是一个分组信息中的入节点,则执行步骤602,将该分组信息确定为本次RPC调用的分组信息。这是利用入节点属于分组信息的唯一性,即入节点只能存在于一个分组信息中,如果某个IP地址位于某个分组信息中的rootIpList,则该分组信息确定为该IP地址的设备所在的路由分组。
若判断结果为否,即上游设备的IP地址不是本地存储的任何一个分组信息中的入节点,则执行步骤603。
在步骤603中,判断本设备的IP地址是否位于其中一个分组信息且为入节点。若判断结果为是,即本设备的IP地址是一个分组信息中的入节点,则执行步骤602;否则,若判断结果为否,表明上游设备和本设备均不是调用的入节点,可以执行步骤604,在目标服务的服务地址列表中随机调用。
本例子的远程调用方法中,当调用的上游设备未传输分组信息时,调用者也可以利用由配置中心获取到的各个分组信息,自己确定本次调用对应的分组信息。当然,该方法可以用于调用者是分组调用的入节点的情况,当调用者是一次调用链路中的中间节点时,比如服务B的服务提供设备,将不能应用该方法确定分组信息。此外,在上述的WEB服务的例子之外的应用场景中,如果调用者是本次RPC调用的发起端,则判断其自身的IP地址是否位于一个分组信息且为入节点,若判断结果为是,则将所述分组信息确定为本次RPC调用对应的分组信息。
根据以上描述还可以看到,一次RPC调用的分组信息的确定,是在本次调用链路的入口处确定的,如果入口的调用者是本次RPC调用的发起端,则根据其自身IP地址确定是否是某个分组信息的rootIpList以获取分组信息;而如果入口的调用者是WEB服务端,则可以根据上游的浏览器IP地址或者该WEB服务端自身的IP地址,是否是某个分组信息的rootIpList以获取分组信息。如果调用者没有获取到分组信息,那么调用过程中将不透传分组信息;而中间的被调用者,若未接收到本次调用的上游设备传输的分组信息,则调用中也不会向下游设备透传任何的分组信息。
在又一个例子中,还可能出现的情况是,未获取到本次RPC调用的路由分组的分组信息,或者对服务地址列表和分组信息求取交集为空。这种情况下,为了提高RPC调用的可靠性,可以将服务地址列表与备用分组信息求取交集,该备用分组信息中也包括本次调用链路中各个服务的服务提供设备的IP地址,当然,对于某一个服务来说,该备用分组信息包括的对应该服务的服务提供设备也可以是部分设备。
备用分组信息可以是由配置中心发送至服务提供设备,例如,配置中心在向服务提供设备发送服务地址列表和分组信息时,还可以将备用分组信息发送至服务提供设备。备用分组信息是调用链路中的各个服务的最小集合,每一个服务只有一个提供该服务的设备的IP地址在备用分组信息中,并且,在备用分组信息中的IP地址是相对稳定的提供服务的设备的地址,使得该备用分组信息是稳定分组的信息,是一个稳定的集合,该稳定的集合主要是为了维持一个相对稳定的服务,起到“兜底”的保险机制,保证每一个服务在这个分组中都能找到,也即服务地址列表和备用分组信息的交集一般不为空,避免找不到调用地址。通过将备用分组信息与服务地址列表求取交集,可以由交集中确定一个IP地址作为调用目标服务的目标地址。
在又一个例子中,即使使用备用分组信息与服务地址列表求取交集,但是仍有可能这两者的交集为空,这种情况可能是一个新的服务还没有部署到备用分组的稳定环境中。此时,可以将服务地址列表中剔除掉已经被分组的地址,防止对其他分组的影响,并由剩余的地址中随机确定一个服务提供设备的IP地址作为调用目标服务的目标地址,进一步保证RPC调用的可靠性。
图7示例的流程,可以用于描述包括服务A、服务B和服务C的一次RPC调用的流程,如图7所示,可以包括:
在步骤701中,服务提供设备获取自己的IP地址,根据从配置中心获取的各个分组信息,查找得到自己的IP地址所在的分组信息,且该IP地址属于该分组信息中的rootIpList。
本步骤中,该服务提供设备是本次调用的入口,并可以通过入节点唯一存在于一个分组信息中的特点,确定自己所在的本次调用的分组信息。
在步骤702中,服务提供设备根据下一步要调用的服务B,将服务B的服务地址列表和在步骤701中确定的分组信息取交集,得到位于同一个路由分组的服务B的各个服务提供设备。
例如,本步骤得到的交集,至少包括一个IP地址。
在步骤703中,服务提供设备由交集中随机确定一个地址作为目标地址。
在步骤704中,服务提供设备根据目标地址调用服务B,并且,在调用时将步骤701中确定的分组信息也传输至提供服务B的服务提供设备。
在步骤705中,提供服务B的服务提供设备,根据由提供服务A的服务提供设备传输的分组信息,将该分组信息与服务C的服务地址列表取交集,得到提供服务C的服务提供设备的地址。
在步骤706中,提供服务B的服务提供设备,由在步骤705的交集中获取到的地址,随机确定一个目标地址调用服务C;也可以将分组信息传输至提供服务C的设备。本次调用结束。
由图7所示的例子可以看到,作为调用入节点的设备,可以负责确定本次调用的分组信息,并将分组信息向下游设备传输;在RPC调用的过程中,各个设备之间都可以传输分组信息,并且各个设备都可以根据该分组信息确定下一步要调用的服务所在的设备,从而实现路由分组。
本例子的远程调用方法,不仅节省了网络开销,而且实施起来也较为简便,用户只要在信息配置系统中配置分组信息、服务地址列表这些信息即可,由配置中心将这些信息发送至各个服务提供设备,各个设备就可以根据这些信息自己确定在某一个RPC调用中的调用目标地址。
此外,本例子中的一个调用链路中的中间节点,可以属于多个分组中,有利于充分利用已有的机器最大限度的构造和定制各种路由分组,因为即使一个中间节点属于多个分组,在确定下一步调用服务的地址时,根据上游传输的分组信息和服务地址列表求交集即可,即调用者可以明确哪个分组信息与服务地址列表求交集;而传统的主控服务器方式中,调用者并不将当前所在的分组信息通知主控服务器,如果调用者属于多个分组,主控服务器将无法得知利用哪个分组确定下一步调用的服务地址。因此,本例子的方式提高设备的利用率。此外,配置中心将分组信息发送的设备,可以是dev环境或者其他环境的机器,也可以是用户的PC机。
本申请还提供了一种远程调用装置,该装置可以应用于一次远程调用过程协议RPC调用中的一个调用者,调用者用于调用本次调用链路中的下一个服务,所述下一个服务为被调用的目标服务。如图8所示,该装置可以包括:
地址确定模块81,用于求取服务地址列表和分组信息的交集,所述服务地址列表包括提供所述目标服务的各服务提供设备的IP地址,所述分组信息包括本次RPC调用的路由分组中包括的各个服务的服务提供设备的IP地址,由所述交集中确定一个IP地址作为调用所述目标服务的目标地址;
服务调用模块82,用于根据所述目标地址调用所述目标服务,并将所述路由分组的分组信息传输至所述目标地址对应的服务提供设备,以使得所述服务提供设备根据所述分组信息调用下一个服务。
在一个例子中,地址确定模块81,还用于:若当前的所述调用者为WEB服务端,则判断上游设备的IP地址或者本设备的IP地址是否位于一个分组信息且为入节点,每个分组信息均包括入节点和中间节点,作为入节点的IP地址只位于一个分组信息中,若判断结果为是,则将所述分组信息确定为本次RPC调用对应的分组信息;或者,若当前的所述调用者为所述RPC调用的发起端,则判断本设备的IP地址是否位于一个分组信息且为入节点,若判断结果为是,则将所述分组信息确定为本次RPC调用对应的分组信息。
如图9所示,该装置还可以包括:信息接收模块83,用于由配置中心接收本设备的IP地址所在的各个路由分组的分组信息,所述分组信息的数量为至少一个。
在一个例子中,地址确定模块81,还用于:若不存在所述本次RPC调用的路由分组的分组信息,或者所述服务地址列表和分组信息的交集为空,则将所述服务地址列表与备用分组信息求取交集,所述备用分组信息包括本次调用链路中各个服务的服务提供设备的IP地址,并由所述交集中确定一个IP地址作为调用所述目标服务的目标地址。
在一个例子中,地址确定模块81,还用于:若所述服务地址列表与备用分组信息的交集为空,则将所述服务地址列表中剔除掉已经被分组的地址,由剩余的地址中确定一个服务提供设备的IP地址作为调用所述目标服务的目标地址。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由下面的权利要求指出。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。