服务调用方法及数据存储方法、装置、设备和存储介质与流程

文档序号:26403071发布日期:2021-08-24 16:16阅读:112来源:国知局
服务调用方法及数据存储方法、装置、设备和存储介质与流程

本发明涉及互联网技术领域,尤其涉及一种服务调用方法及数据存储方法、装置、设备和存储介质。



背景技术:

微服务架构是近期软件应用领域非常热门的概念。微服务是一种架构风格,一个软件应用可以由一个或多个微服务(可以简称为服务)组成,每个服务仅关注于完成一件任务,从而,应用可以视为是服务的集合。一个应用对应的各个服务可以被独立地部署,每个服务可以被部署在多个服务器上。

与“微服务”架构相对的,是传统的整体式架构。对比来说,整体式架构中,一个应用提供的所有服务都放在一个进程中,通过复制整个应用到多台服务器以实现扩展。微服务架构中,一个应用提供的多个服务被放在分离的多个进程中,通过将不同的服务分布于不同服务器,并且通过复制服务的方式实现扩展。

一个应用a可以将其提供的多个服务注册到名字服务器中,比如将多个服务各自对应的服务名、服务版本号和服务地址等信息注册到名字服务器中。另一个订阅了其中某些服务的应用b,可以通过名字服务器获得订阅的某个服务所对应的服务地址列表,并基于该服务地址列表通过远程过程调用(remoteprocedurecall,简称为rpc)的方式调用订阅的该服务。其中,服务地址通常以统一资源定位符(uniformresourcelocator,简称url)来表示。在名字服务器中,服务地址是以字符串的形式存储的。

应用b在获得其订阅的某个服务对应的服务地址列表时,需要将该服务地址列表中包含的全部服务地址存储在本地内存中。目前,应用b在接收到上述服务地址列表后,直接以字符串的形式将该列表中包含的全部服务地址存储在内存中,将会占用过多的存储空间。



技术实现要素:

本发明实施例提供一种服务调用方法及数据存储方法、装置、设备和存储介质,能够降低服务地址对存储空间的占用。

第一方面,本发明实施例提供一种数据存储方法,该方法包括:

获取与订阅的服务对应的第一服务地址列表;

对服务地址i中包括的至少一个字段进行编码,以得到所述至少一个字段各自对应的编码结果,所述至少一个字段各自对应的编码结果占用的存储空间小于所述至少一个字段各自占用的存储空间,所述服务地址i是所述第一服务地址列表中的任一个;

存储经所述编码后的服务地址i。

第二方面,本发明实施例提供一种数据存储装置,该装置包括:

获取模块,用于获取与订阅的服务对应的第一服务地址列表;

编码模块,用于对服务地址i中包括的至少一个字段进行编码,以得到所述至少一个字段各自对应的编码结果,所述至少一个字段各自对应的编码结果占用的存储空间小于所述至少一个字段各自占用的存储空间,所述服务地址i是所述第一服务地址列表中的任一个;

存储模块,用于存储经所述编码后的服务地址i。

第三方面,本发明实施例提供一种电子设备,包括:存储器、处理器、通信接口;其中,存储器上存储有可执行代码,当所述可执行代码被处理器执行时,使处理器至少可以实现如第一方面所述的数据存储方法。

第四方面,本发明实施例提供了一种非暂时性机器可读存储介质,非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使处理器至少可以实现如第一方面所述的数据存储方法。

第五方面,本发明实施例提供一种服务调用方法,应用于微服务架构中,所述微服务架构中包括多个应用发布的多个服务以及名字服务器,其中,所述多个服务被部署在分离的多个进程,所述名字服务器中存储有所述多个服务各自对应的服务地址列表;

所述服务调用方法包括:

第一应用从所述名字服务器中获取与订阅的目标服务对应的服务地址列表,其中,所述目标服务由第二应用发布,所述第一应用和所述第二应用包含于所述多个应用中;

所述第一应用对所述服务地址列表中的各服务地址进行编码,以降低所述服务地址列表所占用的存储空间;

所述第一应用存储经所述编码后的各服务地址,以用于远程调用所述目标服务。

在本发明实施例中,当某应用获取其订阅的某个服务对应的服务地址列表后,为了将该服务地址列表中包含的各个服务地址存储在本地,对每个服务地址中包含的至少一个字段进行编码处理,使得各个字段的编码结果相较于未编码前的字段占用更少的存储空间,从而实现服务地址的压缩。压缩后的服务地址所占用的存储空间相比未压缩的服务地址,会有明显的降低。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种微服务场景的示意图;

图2为本发明实施例提供的一种数据存储方法的流程图;

图3a为本发明实施例提供的一种参数名的编码方法的流程图;

图3b为本发明实施例提供的一种参数名的编码原理的示意图;

图4a为本发明实施例提供的一种参数值的编码方法的流程图;

图4b为本发明实施例提供的一种参数值的编码原理的示意图;

图5为本发明实施例提供的另一种数据存储方法的流程图;

图6为本发明实施例提供的一种服务调用方法的流程图;

图7为本发明实施例提供的一种数据存储装置的结构示意图;

图8为与图7所示实施例提供的数据存储装置对应的电子设备的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。

取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。

另外,下述各方法实施例中的步骤时序仅为一种举例,而非严格限定。

图1为本发明实施例提供的一种微服务场景的示意图,在图1中,假设应用1发布了服务a、服务b和服务c,应用2发布了服务a和服务c。另外,为便于描述,假设应用1部署在服务器1至服务器10这十个服务器中,应用2部署在服务器11至服务器20这十个服务器中。其中,应用1部署在服务器1至服务器10这十个服务器中,可以认为应用1发布的各服务都部署在这十个服务器中,同理,应用2发布的各服务也部署在应用2所对应的服务器11至服务器20这十个服务器中。

在微服务场景中,上述各个服务也可以称为微服务。

基于上述服务的部署结果,应用1和应用2可以向名字服务器注册各自发布的服务。

以应用1为例,该注册过程即为应用1将其发布的各个服务的相关信息上传至名字服务器,该相关信息中包括服务名、服务版本号、服务地址以及其他服务元数据。其中,其他服务元数据比如可以包括服务支持的通信方式、超时配置等配置信息。

其中,服务地址代表部署了某服务的服务器节点信息,可以包括网络链接信息和其他元数据,一般以url来表示。其中,网络链接信息比如为服务器的ip地址和端口号。其中,该其他元数据比如包括服务器位于的机房位置等信息。

综上,简单来说,最终应用1会将其发布的服务a、服务b和服务c各自对应的服务名、服务版本号以及服务地址等信息注册到名字服务器中。同理,应用2也会将其发布的服务a和服务c各自对应的服务名、服务版本号以及服务地址等信息注册到名字服务器中。

基于此,在名字服务器中,可以形成上述每个服务对应的服务地址列表。

具体地,由于服务a最终被部署在了服务器1至服务器20这二十个服务器中,因此,服务a对应的服务地址列表中包含的服务地址即为对应于这二十个服务器的服务地址,在图1中,将这二十个服务地址表示为url1至url20。

由于服务b最终被部署在了服务器1至服务器10这十个服务器中,因此,服务b对应的服务地址列表中包含的服务地址即为对应于这十个服务器的服务地址,在图1中,将这十个服务地址表示为url21至url30。

由于服务c与服务a一样,最终被部署在了服务器1至服务器20这二十个服务器中,因此,服务c对应的服务地址列表中包含的服务地址即为对应于这二十个服务器的服务地址,在图1中,将这二十个服务地址表示为url31至url50。

另外,假设应用3订阅了上述服务a和服务b。那么,在满足特定的触发条件时,应用3可以从名字服务器中获取服务a对应的服务地址列表以及服务b对应的服务地址列表,进而通过本发明实施例提供的数据存储方法将获得的服务地址列表存储在本地,一般是存储在内存中。

值得说明的是,应用3会分别通过不同的进程并行地针对其订阅的每个服务进行服务地址列表的存储处理,比如通过进程1对服务a对应的服务地址列表进行存储处理,通过进程2对服务b对应的服务地址列表进行存储处理。

实际应用中,可选地,上述触发条件可以是:应用3被启动。具体地,应用3被启动时,根据其订阅的服务个数n,通过启动n个进程以分别向名字服务器请求订阅的n个服务各自对应的服务地址列表,n为大于或等于1的整数。也就是说,一个进程用于请求一个服务的服务地址列表。

可选地,上述触发条件可以是:提供服务的应用上线或下线。具体地,当提供服务的应用上线或下线时,名字服务器会更新该服务对应的服务地址列表,并将更新后的服务地址列表通知至订阅该服务的应用。以上述应用3来说,由于其订阅了服务a和服务b,以服务a为例,当提供服务a的应用1或应用2上线或下线时,名字服务器会更新服务a对应的服务地址列表,将更新后的服务地址列表通知至应用3,从而,应用3对接收到的服务a的服务地址列表进行存储处理。

以上对本发明实施例提供的数据存储方法可以适用于的应用场景进行了说明,在上述应用场景的示例中,该数据存储方法可以由上述应用3来执行。

由于该数据存储方法主要是用于对应用所订阅服务的服务地址进行存储,因此,下面先介绍下服务地址的组成和格式。

如前文所述,服务地址通常是以url来表示的,因此,本文中,服务地址可以等同于url。一个标准的url的组成和格式为:

[协议类型]://[服务器的网络地址]:[端口号]/[资源的文件路径][文件名]?[查询参数]#[片段id]

其中,协议类型,常用的是http。

服务器的网络地址和端口号,构成服务所在服务器的网络链接信息。网络地址一般是ip地址。

资源的文件路径,表示网络资源在服务器中的指定路径。资源的文件路径和文件名,组合在一起可以表示服务名。

查询参数,对应于可以从服务器中查询的内容,一般反映了服务对应的一些元数据。

片段id,网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置。

下面示例一个基于http的服务的url:

http://10.10.10.11:10220/com.sample.demoservice?application=demo&timeout=1000&machine-group=idc1

在上述示例中,查询参数部分包括以符号“&”分割的三对键值对,每对键值对由参数名和参数值构成,“=”号左右两侧分别表示参数名和参数值。

可以理解的是,实际上,url中包含的上述多个字段中有些字段是可以省略的。

下面结合以下一些实施例,介绍本文提供的数据存储方法的执行过程,该数据存储方法的执行主体可以是图1中示意的应用3。

图2为本发明实施例提供的一种数据存储方法的流程图,如图2所示,该数据存储方法可以包括如下步骤:

201、获取与订阅的服务对应的第一服务地址列表。

202、对服务地址i中包括的至少一个字段进行编码,以得到至少一个字段各自对应的编码结果,所述至少一个字段各自对应的编码结果占用的存储空间小于所述至少一个字段各自占用的存储空间,服务地址i是第一服务地址列表中的任一个。

203、存储经编码后的服务地址i。

为便于描述,以图1中示意的应用3为例,其订阅的服务为前文中的服务a和服务b,由于对服务a对应的服务地址列表的处理过程与对服务b对应的服务地址列表的处理过程一样,因此,下面仅以服务a为例来说明。

基于此,步骤201中获取的第一服务地址列表是应用3从名字服务器获得的服务a对应的服务地址列表,在前文的举例中,该第一服务地址列表中包含二十个服务地址,即对应于服务器1至服务器20这二十个服务器的服务地址:url1至url20。

实际应用中,在满足设定触发条件时,应用3从名字服务器获取上述第一服务地址列表,该触发条件可以参考前文中的描述。

在获得第一服务地址列表后,针对该第一服务地址列表中包含的每个服务地址,都可以进行压缩处理,以降低服务地址对存储空间的占用。具体地,可以通过对每个服务地址中包含的至少一个字段进行编码的方式实现压缩服务地址的目的。

其中,上述至少一个字段可以包括前文中介绍的如下字段中的至少一种:参数名、参数值、服务器的网络地址。其中,参数名和参数值是包含在查询参数部分的一对对键值对。

概括来说,对某个字段进行编码的目的是:使得该字段的编码结果相比该字段来说,占用更少的存储空间。实际应用中,一个url是由一串字符串组成的,一个字符需要占用一个字节的存储空间来存储,比如某个参数名为application,由11个字符组成,将需要占用11个字节来存储该参数名。通过对该参数名进行编码,假设编码结果仅占用1个字节来存储即可,那么将节省10个字节,比如该编码可以是将参数名映射为一个数字(十进制数),通过8个比特位(即1个字节)来表示该数字。

本发明实施例中,任何可以实现降低一个字段所占用的存储空间的编码方式都可以采用,不做限定。

在对某个字段进行编码后,可选地,可以以编码结果替换该字段,之后存储经替换后的url。

下面分别介绍针对参数名、参数值以及服务器的网络地址(ip地址)的一种可选的编码方式。

图3a为本发明实施例提供的一种参数名的编码方法的流程图,如图3a所示,该方法可以包括如下步骤:

301、确定第一服务地址列表中包含的全部参数名。

302、生成与全部参数名对应的参数名映射表,参数名映射表中记录了全部参数名与全部参数名各自对应的编号之间的映射关系。

303、根据参数名映射表,确定服务地址i中包含的参数名各自对应的编号。

304、生成与服务地址i对应的第一数组,确定第一数组中目标位置的取值为1,其他位置的取值为0,其中,第一数组的长度与全部参数名的个数相等,第一数组中的各个位置与全部参数名对应的编号一一对应,目标位置对应于服务地址i中包含的参数名各自对应的编号。

本实施例中假设第一服务地址列表中包括前文中所述的服务a对应的url1至url20这二十个服务地址,由于每个url的查询参数部分会包含至少一对由参数名和参数值组成的键值对,因此,通过统计这20个url的查询参数部分包含的参数名,可以得到第一服务地址列表中包含的全部参数名。

实际上,一个服务对应的服务地址列表中包含的全部参数名的个数是一个已知的固定值,本实施例中,假设服务a包含的全部参数名为m个参数名,m大于1。

之后,可以对这m个参数名进行编号(该编号即为一种编码方式),每个参数名被顺序分配一个编号,比如从0开始,一直到m-1。

结合图3b举例来说,在图3b中,假设为application这个参数名分配的编号为0,为timeout这个参数名分配的编号为1,以此类推,直到为foobar这个参数名分配的编号为m-1。基于该编号的分配结果,可以生成与全部m个参数名对应的参数名映射表,该参数名映射表中包括两列:一列是编号的顺序排列结果,另一列是每个编号对应的参数名,从而,该参数名映射表中记录了第一服务地址列表中包含的全部m个参数名及其各自对应的编号之间的映射关系。

可以理解的是,在生成出上述参数名映射表后,本地存储该参数名映射表,以便后续根据该参数名映射表,对第一服务地址列表中的每个服务地址中所包含的参数名进行编码。另外,该参数名映射表是在第一服务地址列表中包含的全部服务地址间共享的,即全局共享的,这就是说,对第一服务地址列表中的每个服务地址所包含的参数名进行编码的过程中,都会使用到这个参数名映射表。

假设第一服务地址列表中的任一服务地址i为如下的一个url:

http://10.10.10.11:10220/com.sample.demoservice?application=demo&foobar=true.

为便于描述,将该url称为urli。

这个urli中包括两个参数名:application和foobar,根据图3b中示意的参数名映射表,对该urli中包含的参数名进行编码的过程可以实现为:

首先,根据参数名映射表,确定该urli中包含的参数名application和foobar各自对应的编号。其中,application在参数名映射表中对应的编号为0,foobar在参数名映射表中对应的编号为m-1。

其次,生成与该urli对应的第一数组。具体地,如图3b所示,先根据参数名映射表中包含的全部参数名的个数m生成一个长度为m的数组,即由m个比特(bit)位构成的数组(bitarray)。这个数组中的各个位置与m个参数名对应的编号一一对应,如图3b中示意的,第一个bit位置对应于编号0,第二个bit位对应于编号1,以此类推。之后,根据urli中包含的参数名各自对应的编号,在上述数组中确定出与该编号对应的bit位置,将这些bit位置的取值置为1,其他bit位置的取值置为0。将设置好各个bit位置取值的数组,称为与urli对应的第一数组。第一数组作为与urli中包含的参数名对应的编码结果。

其中,某个bit位置的取值置为1,用以表明urli中是否包含与该bit位置所对应的编号相对应的参数名。在图3b的示意中,由于urli中包含的参数名application对应的编号为0,foobar对应的编号为m-1,因此,与这两个编号对应的bit位置的取值被置为1,其他位置的取值置为0。

综上,通过上述参数名编码方式,针对包含m个参数名的第一服务地址列表来说,对应其中包含的任一url,仅需要m/8个字节即可存储这个url中所包含的所有参数名,相比于直接以字符形式来存储参数名而需要使用一个字节来存储一个字符的方式,所占用的存储空间大大降低。

图4a为本发明实施例提供的一种参数值的编码方法的流程图,如图4a所示,该方法可以包括如下步骤:

401、确定第一服务地址列表中包含的全部参数名。

402、针对所述全部参数名中的任一参数名j,在第一服务地址列表中确定参数名j对应的全部参数值。

403、生成参数名j对应的参数值映射表,参数值映射表中记录了参数名j对应的全部参数值与该全部参数值各自对应的编号之间的映射关系。

404、确定服务地址i中包含的参数值在相应参数名对应的参数值映射表中对应的编号,生成与服务地址i对应的第二数组,根据服务地址i中包含的参数值在相应参数名对应的参数值映射表中对应的编号,确定第二数组中各位置的取值,其中,第二数组的长度与服务地址i中包含的参数名的个数相等,第二数组中的各个位置与服务地址i中包含的参数名一一对应。

本实施例中假设第一服务地址列表中包括前文中所述的服务a对应的url1至url20这二十个服务地址,由于每个url的查询参数部分会包含至少一对由参数名和参数值组成的键值对,因此,通过统计这20个url的查询参数部分包含的参数名,可以得到第一服务地址列表中包含的全部参数名,假设一共得到前述m个参数名。

之后,针对每个参数名,遍历第一服务地址列表中的各个url,以确定每个参数名对应的可取的参数值。实际上,一个参数名对应的参数值的个数是一个已知的固定值。

结合图4b来进行示例性说明,在图4b中,假设针对任一参数名application来说,在第一服务地址列表中确定出与该参数名对应的参数值一共有10个,则可以针对参数名application,生成与之对应的参数值映射表。该参数值映射表中包括两列:一列是偏移量或者说是参数值对应的编号,另一列是参数值,从而,该参数值映射表中记录了参数名application对应的全部参数值与该全部参数值各自对应的编号之间的映射关系。针对参数名foobar来说,如图4b中所示,假设生成的与之对应的参数值映射表中包括faulse和true两个参数值。

针对前述m个参数名,通过上述方式,可以一一对应地生成m个参数值映射表。可以理解的是,在生成出m个参数值映射表后,本地存储该m个参数值映射表,以便后续根据m个参数值映射表,对第一服务地址列表中的每个服务地址中所包含的参数值进行编码。另外,m个参数值映射表是在第一服务地址列表中包含的全部服务地址间共享的,即全局共享的,这就是说,对第一服务地址列表中的每个服务地址所包含的参数值进行编码的过程中,都会使用到这m个参数值映射表中的部分。

本实施例中介绍的是为每个参数名,生成与之对应的一个参数值映射表的方式。但是,实际上,也可以针对m个参数名,仅生成一个参数值映射表,此时,在该参数值映射表中会包含m个参数名各自对应的全部参数值。

为每个参数名独立地生成与之对应的一个参数值映射表的方式,有如下的优势:

第一,一个参数名对应的参数值的数量远远小于m个参数名对应的全部参数值的数量,因此,一个参数名对应的参数值映射表中编号的最大值max1会远远小于m个参数名对应的参数值映射表中编号的最大值max2。max1和max2都是十进制数字,而如果max2过大的时候,比如达到上万级别,存储如此大的一个数字所需要的字节数将变得很大,而max1会相对小很多,存储时可能仅需要一个字节即可。因此,从第一服务地址列表整体上来看,一个参数名对应一个参数值映射表的方式会更优。

第二,实际应用中,一个参数名对应的参数值可能会有更新需求,当新增一个参数值时,如果采用生成与m个参数名对应的一个参数值映射表的方式,会对该参数值映射表进行比较大的改动——排在该参数名之后的其他参数名所各自对应的参数值的编号都会变化,这会引入额外的计算量。

在得到每个参数名各自对应的参数值映射表后,针对urli来说,可以根据得到的参数值映射表,对urli中包含的参数值进行编码。

具体地,首先,根据已经得到的各参数值映射表,确定urli中包含的参数值在相应参数名对应的参数值映射表中对应的编号。urli中包含与application这个参数名对应的参数值:demo,在application对应的参数值映射表中,demo对应的编号为10。urli中包含与foobar这个参数名对应的参数值:true,在foobar对应的参数值映射表中,true对应的编号为1。

之后,生成与urli对应的第二数组。具体地,如图4b所示,先根据urli中包含的参数名的个数n,生成一个长度为n的数组。由于urli中包括两个参数名,因此,n=2。该数组中的各个位置与urli中包含的参数名一一对应,按照urli中包含的上述两个参数名的先后顺序,该数组的第一个位置与application对应,第二个位置与foobar对应。之后,基于这两个参数名各自对应的参数值的编号确定结果,确定上述数组中第一个位置和第二个位置的取值。概括来说,确定该数组中第k个位置的取值为urli中包含的第k个参数值在第k个参数名对应的参数值映射表中对应的编号。基于此,如图4b中所示,上述数组中的第一个位置的取值为demo对应的编号10,第二个位置的取值为ture对应的编号1。将设置好各个位置取值的上述数组,称为与urli对应的第二数组。第二数组作为与urli中包含的参数值对应的编码结果。

另外,如图4b中所示,基于图3b中生成的第一数组,实际上,第二数组的长度可以由第一数组中取值为1的bit位置的个数确定,该个数亦即urli中包含的参数名的个数,而且,第二数组的第一列中的第n行即对应于第一数组中第n个取值为1的bit位置。

综上,通过上述参数值编码方式,针对第一服务地址列表中一个包括n个参数值的url来说,仅需要n个字节即可存储这个url中所包含的所有参数值,相比于按照字符方式存储参数值来说,大大降低了对存储空间的占用。

除了针对url中的参数名和参数值进行上述介绍的编码处理外,该可以针对url中包含的服务器的网络地址(ip地址)进行编码,以压缩网络地址对存储空间的占用。概括来说,可以将网络地址中包含的十进制数字转换为设定长度(如一个字节)的二进制数,以实现对网络地址的编码。

ip地址采用点分十进制的方式来表示,比如255.255.255.255,一个ip地址包括四部分,每一部分所代表的数字都在0-255的范围内,可以使用一个字节的无符号整数来转换,因此只需要4个字节即可完整地保存ip地址。

举例来说,假设某url中包含的ip地址为:255.255.255.255。如果不对该ip地址进行编码处理,该ip地址将占用15个字节的存储空间,其中,每个数字占用一个字节的存储空间(255这三个数字将占用3个字节的存储空间),三个点“.”又将占用3个字节的存储空间。将每个部分的255转换为一个一字节长度的二进制数:11111111。针对该ip地址的转换结果将为:

11111111111111111111111111111111

使用四个字节便可以存储上述四组11111111。

为了更加直观地理解通过上述编码处理后的url所占用的存储空间会明显降低,下面以一个示例来对比地说明未经编码的url的存储结果以及经编码的url的存储结果。

假设某url为:

http://172.10.10.11:8080/abcd.com?application=demo&timeout=1000

未经编码处理时,对上述url的存储结果可以体现为由如下的键值对组成的第一结构体:

{protocol=http;

ip=172.10.10.11;

port=8080;

path=abcd.com;

params=[application=demo;timeout=1000]}。

假设通过前文介绍的编码处理过程,将上述ip地址编码为12345,对参数名application和timeout的编码结果为:[1000001000],对参数值demo的编码结果为10,对参数值1000的编码结果为2,基于上述假设,经编码处理后的url的存储结果可以体现为由如下的键值对组成的第二结构体:

{protocol=http;

ip=12345;

port=8080;

params=[1000001000],[10,2]}。

通过上述两个结构体的对比可以发现,经过编码后的url将会占用更少的存储空间。

由上述示例可知,存储经编码后的url,具体是指以上述键值对的形式存储经编码后的url,此时,一个键值对是指url中一个字段的含义及其取值的编码结果。

综上,基于对url中一个或多个字段的编码处理,可以实现压缩这一个或多个字段的目的,以降低这些字段的存储对存储空间的占用。

另外,实际应用中,以前文所述的应用3为例,名字服务器可能会多次向应用3发送其订阅的服务的服务地址列表,比如其订阅的服务上线时发送一次,下线时又发送一次,再比如应用3每次启动的时候都会发送一次。而名字服务器多次向在应用3发送的服务地址列表可能不尽相同。导致该不同的因素多种多样,比如应用3订阅了新的服务,应用3之前订阅的某个服务的部署情况发生了变化(如部署了该服务的某个服务器宕机了,新增了部署该服务的服务器),等等。

可选地,应用3针对每次从名字服务器接收到的服务地址列表,都可以采用上文介绍的处理过程进行存储处理。但是,虽然名字服务器先后多次向应用3发送的服务地址列表不尽相同,但是,不同的服务地址列表中还是可能会有部分数量的url是相同的。因此,为了避免重复计算,降低计算量,应用3可以缓存此前接收的服务地址列表的编码处理结果,在本次接收到名字服务器发送的服务地址列表后,仅针对有差异的url进行上文所述的存储处理即可,在该存储处理过程中,如果订阅的服务并未发生变化,则可以复用此前生成的参数名映射表和参数值映射表。

具体的执行过程可以参见图5所示实施例。

图5为本发明实施例提供的另一种数据存储方法的流程图,如图5所示,该数据存储方法可以包括如下步骤:

501、获取与订阅的服务对应的第一服务地址列表。

502、对服务地址i中包括的至少一个字段进行编码,以得到所述至少一个字段各自对应的编码结果,存储经编码后的服务地址i,服务地址i是第一服务地址列表中的任一个。

503、缓存第一服务地址列表以及第一服务地址列表中经编码后的各服务地址。

504、获取与所述服务对应的第二服务地址列表,若第二服务地址列表中包含服务地址i,则复用所述缓存中包含的经编码后的服务地址i。

本实施例中,假设第一服务地址列表是应用3首次针对订阅的某个服务(如服务a)获取到的一个服务地址列表,针对该第一服务地址列表中的各个服务地址,通过上文介绍的编码方案进行编码,以获得各个经过编码的服务地址并存储在本地内存中。

另外,还缓存第一服务地址列表以及第一服务地址列表中经过编码后的各服务地址。其中,以第一服务地址列表中的服务地址i为例,编码后的服务地址i中上述至少一个字段各自对应的编码结果,如参数名的编码结果——第一数组,参数值的编码结果——第二数组,ip地址的编码结果——四字节的二进制数。具体地,在缓存时,可以以键值对的形式存储服务地址及其对应的编码结果,其中,键(key)为从名字服务器接收到的原始的服务地址,值(value)为编码后的服务地址,如前文示例性说明的第二结构体。

当应用3后续再一次接收到与服务a对应的第二服务地址列表时,对比缓存结果,以确定第二服务地址列表中哪些服务地址与第一服务地址列表中的服务地址相同。

假设服务地址i存在于第一服务地址列表中,而且,服务地址i也存在于第二服务地址列表中,那么,可以直接复用缓存中存储的编码后的服务地址i。

若第二服务地址列表中不包含服务地址i,则从缓存中删除服务地址i以及经编码后的服务地址i。

另外,可选地,可以设定缓存时长,当编码后的服务地址i的缓存时间达到该时长时,也可以删除该服务地址i及其经编码后的服务地址i。

图6为本发明实施例提供的一种服务调用方法的流程图,如图6中所示,该服务调用方法包括如下步骤:

601、第一应用从名字服务器中获取与订阅的目标服务对应的服务地址列表,其中,目标服务由第二应用发布。

602、第一应用对服务地址列表中的各服务地址进行编码,以降低服务地址列表所占用的存储空间;

603、第一应用存储经编码后的各服务地址,以用于远程调用目标服务。

本实施例提供的服务调用方法可以应用于前文介绍的微服务架构中。

简单来说,微服务架构中包括多个应用发布的多个服务以及名字服务器。

其中,这多个服务被部署在分离的多个进程(比如在多个服务器中分别启动一个进程,用于部署某一个服务)。

其中,名字服务器中存储有多个服务各自对应的服务地址列表。具体地,名字服务器中形成该服务地址列表的过程,可以是基于应用的服务注册行为而实现的,具体参加前文中的介绍。

本实施例中,上述第一应用和第二应用包含于微服务架构中的多个应用中,而且,假设第一应用订阅了第二应用发布的某个服务,将该服务称为目标服务。

本实施例中,第一应用对获得的服务地址列表的编码过程可以实现为:对服务地址i中包括的至少一个字段进行编码,以得到所述至少一个字段各自对应的编码结果,所述至少一个字段各自对应的编码结果占用的存储空间小于所述至少一个字段各自占用的存储空间,其中,服务地址i是第一应用获得的服务地址列表中的任一个服务地址。具体的编码过程可以参加前述其他实施例中的相关说明,不再赘述。

以下将详细描述本发明的一个或多个实施例的数据存储装置。本领域技术人员可以理解,这些数据存储装置均可使用市售的硬件组件通过本方案所教导的步骤进行配置来构成。

图7为本发明实施例提供的一种数据存储装置的结构示意图,如图7所示,该装置包括:获取模块11、编码模块12、存储模块13。

获取模块11,用于获取与订阅的服务对应的第一服务地址列表。

编码模块12,用于对服务地址i中包括的至少一个字段进行编码,以得到所述至少一个字段各自对应的编码结果,所述至少一个字段各自对应的编码结果占用的存储空间小于所述至少一个字段各自占用的存储空间,所述服务地址i是所述第一服务地址列表中的任一个。

存储模块13,用于存储经所述编码后的服务地址i。

可选地,所述至少一个字段包括如下字段中的至少一种:

参数名、参数值、服务器的网络地址。

可选地,所述至少一个字段包括所述参数名,此时,编码模块12具体可以用于:确定所述第一服务地址列表中包含的全部参数名;生成与所述全部参数名对应的参数名映射表,所述参数名映射表中记录了所述全部参数名与所述全部参数名各自对应的编号之间的映射关系;根据所述参数名映射表,对所述服务地址i中包含的参数名进行编码。

其中,可选地,在根据所述参数名映射表,对所述服务地址i中包含的参数名进行编码的过程中,编码模块12具体可以用于:根据所述参数名映射表,确定所述服务地址i中包含的参数名各自对应的编号;生成与所述服务地址i对应的第一数组,所述第一数组的长度与所述全部参数名的个数相等,所述第一数组中的各个位置与所述全部参数名对应的编号一一对应;确定所述第一数组中目标位置的取值为1,其他位置的取值为0,其中,所述目标位置对应于所述服务地址i中包含的参数名各自对应的编号;其中,所述第一数组作为与所述服务地址i中包含的参数名对应的编码结果。

可选地,所述至少一个字段包括所述参数值,此时,编码模块12具体可以用于:针对所述全部参数名中的任一参数名j,在所述第一服务地址列表中确定所述参数名j对应的全部参数值;生成所述参数名j对应的参数值映射表,所述参数值映射表中记录了所述参数名j对应的全部参数值与所述全部参数值各自对应的编号之间的映射关系;根据所述参数值映射表,对所述服务地址i中包含的参数值进行编码。

其中,可选地,在根据所述参数值映射表,对所述服务地址i中包含的参数值进行编码的过程中,编码模块12具体可以用于:确定所述服务地址i中包含的参数值在相应参数名对应的参数值映射表中对应的编号;生成与所述服务地址i对应的第二数组,所述第二数组的长度与所述服务地址i中包含的参数名的个数相等,所述第二数组中的各个位置与所述服务地址i中包含的参数名一一对应;根据所述服务地址i中包含的参数值在相应参数名对应的参数值映射表中对应的编号,确定所述第二数组中各位置的取值;其中,所述第二数组作为与所述服务地址i中包含的参数值对应的编码结果。

其中,可选地,在根据所述服务地址i中包含的参数值在相应参数名对应的参数值映射表中对应的编号,确定所述第二数组中各位置的取值的过程中,编码模块12具体可以用于:确定所述第二数组中第k个位置的取值为所述服务地址i中包含的第k个参数值在第k个参数名对应的参数值映射表中对应的编号。

可选地,所述至少一个字段包括所述服务器的网络地址,此时,编码模块12具体可以用于:将所述网络地址中包含的十进制数字转换为设定长度的二进制数。

可选地,所述存储模块13还可以用于:缓存所述第一服务地址列表以及所述第一服务地址列表中经编码后的各服务地址。

可选地,所述获取模块11还可以用于:获取与所述服务对应的第二服务地址列表;若所述第二服务地址列表中包含所述服务地址i,则复用所述缓存中包含的经编码后的服务地址i;若所述第二服务地址列表中不包含所述服务地址i或者经编码后的服务地址i已经达到设定的缓存时长,则从所述缓存中删除所述服务地址i以及经编码后的服务地址i。

图7所示装置可以执行前述图1至图5所示实施例中提供的数据存储方法,详细的执行过程和技术效果参见前述实施例中的描述,在此不再赘述。

在一个可能的设计中,上述图7所示数据存储装置的结构可实现为一电子设备,该电子设备比如为部署有某应用的服务器。如图8所示,该电子设备可以包括:处理器21、存储器22、通信接口23。其中,存储器22上存储有可执行代码,当所述可执行代码被处理器21执行时,使处理器21至少可以实现如前述图1至图5所示实施例中提供的数据存储方法。

另外,本发明实施例提供了一种非暂时性机器可读存储介质,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器至少可以实现如前述图1至图5所示实施例中提供的数据存储方法。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助加必需的通用硬件平台的方式来实现,当然也可以通过硬件和软件结合的方式来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以计算机产品的形式体现出来,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1