一种基于树形结构的服务发现处理方法及装置与流程

文档序号:15930424发布日期:2018-11-14 01:34阅读:268来源:国知局

本发明实施例涉及通信技术领域,具体涉及一种基于树形结构的服务发现处理方法及装置。

背景技术

对于一个成熟的互联网技术公司,服务多地域部署、多机房冗余容灾是必备技术。当服务实例按照地域、机房或逻辑划分后,流量划分与控制就变的尤为重要。因为往往跨地域、跨机房的远程资源访问,网络耗时是非常长的,所以通常情况下,用户希望服务与服务之间的rpc调用默认是遵循同地域同机房内访问的。而当某些异常情况发生时,用户又希望可以通过简单的操作,将默认的规则(同机房同地域)进行短暂的调整。

现有技术中,存在各种各样的方式来达成目的。比如在服务发现、配置中心中配置所有的远程资源地址,并打好标签。rpc调用远程资源前,根据当前机器所在地域机房优先读取出同地域同机房标签的资源地址。当某些异常情况出现,不希望流量流向某些地域或某些机房,运维人员需手动屏蔽掉服务发现、配置中心内的所有该地域该机房的远程资源信息。有很多开源rpc框架封装了以上逻辑来达成目的,比如:dubbo。但是这种重量级框架仅限于java使用,整个公司的服务跨多语言时,就难保证策略一致。

另外,还存在一些场景需要进行线上abtest或引入部分线上流量进入灰度环境,这种流量划分即对远程资源进行了“逻辑”上的划分。大部分的实现方法是通过代码逻辑来进行控制,比如当上游在交互协议中带有某些特定的标识时,进行后面的rpc调用时,将进入灰度环境或aorb环境。

在实现本发明实施例的过程中,发明人发现现有的方法出现异常情况时需要手动屏蔽掉远程资源信息,且当服务跨多语言时难以保证策略一致;或者对远程资源采用简单的逻辑划分,容易进入灰度环境或aorb环境,造成流量划分结果的不准确。



技术实现要素:

由于现有方法存在上述问题,本发明实施例提出一种基于树形结构的服务发现处理方法及装置。

第一方面,本发明实施例提出一种基于树形结构的服务发现处理方法,包括:

若监听到目标键值key发生读写操作,则判断所述目标key对应的对象;

若所述目标key对应的对象为实例,则获取树形结构中所述目标key对应的目标实例,并根据所述读写操作对所述树形结构中所述目标实例进行更新;

若所述目标key对应的对象不是实例,则获取树形结构中所述目标key对应的第一目标节点,并将所述目标key对应的流量划分规则存储到所述第一目标节点中。

可选地,所述方法还包括:

若判断获知第二目标节点中无流量划分规则,则获取所述第二目标节点的父节点,并将所述父节点的流量划分规则作为所述第二目标节点的流量划分规则。

可选地,所述方法还包括:

获取第三目标节点的目标流量划分规则,根据当前机房的标识和所述目标流量划分规则获取所有的流量划分单元;

根据预设的平均值算法获取目标流量划分单元,并根据所述目标流量划分单元确定所述树形结构中的目标实例。

可选地,所述方法还包括:

通过软件开发工具包sdk提供的函数读取树形结构中所有的实例和流量划分规则。

第二方面,本发明实施例还提出一种基于树形结构的服务发现处理装置,包括:

对象判断装置,用于若监听到目标键值key发生读写操作,则判断所述目标key对应的对象;

实例更新模块,用于若所述目标key对应的对象为实例,则获取树形结构中所述目标key对应的目标实例,并根据所述读写操作对所述树形结构中所述目标实例进行更新;

规则存储模块,用于若所述目标key对应的对象不是实例,则获取树形结构中所述目标key对应的第一目标节点,并将所述目标key对应的流量划分规则存储到所述第一目标节点中。

可选地,所述装置还包括:

规则获取模块,用于若判断获知第二目标节点中无流量划分规则,则获取所述第二目标节点的父节点,并将所述父节点的流量划分规则作为所述第二目标节点的流量划分规则。

可选地,所述装置还包括:

单元获取模块,用于获取第三目标节点的目标流量划分规则,根据当前机房的标识和所述目标流量划分规则获取所有的流量划分单元;

实例确定模块,用于根据预设的平均值算法获取目标流量划分单元,并根据所述目标流量划分单元确定所述树形结构中的目标实例。

可选地,所述装置还包括:

函数读取模块,用于通过软件开发工具包sdk提供的函数读取树形结构中所有的实例和流量划分规则。

第三方面,本发明实施例还提出一种电子设备,包括:

至少一个处理器;以及

与所述处理器通信连接的至少一个存储器,其中:

所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上述方法。

第四方面,本发明实施例还提出一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行上述方法。

由上述技术方案可知,本发明实施例通过判断监听到的发生读写操作的目标key对应的对象,从树形结构中获取目标key对应的目标实例或第一目标节点,对树形结构中目标实例进行更新,或将目标key对应的流量划分规则存储到第一目标节点中,当出现异常情况时无需手动执行,可以保证公司内部整体流量控制策略一致,也可以通过平台化管理,主动修改某个服务或产品线的流量策略,同时能解决灰度环境或aorb环境的问题。

附图说明

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

图1为本发明一实施例提供的一种基于树形结构的服务发现处理方法的流程示意图;

图2为本发明一实施例提供的树形结构示意图;

图3为本发明一实施例提供的一种基于树形结构的服务发现处理系统的交互示意图;

图4为本发明一实施例提供的一种基于树形结构的服务发现处理方法的交互示意图;

图5为本发明另一实施例提供的一种基于树形结构的服务发现处理方法的交互示意图;

图6为本发明再一实施例提供的一种基于树形结构的服务发现处理方法的交互示意图;

图7为本发明又一实施例提供的一种基于树形结构的服务发现处理方法的交互示意图;

图8为本发明一实施例提供的一种结构树示意图;

图9为本发明一实施例提供的一种基于树形结构的服务发现处理装置的结构示意图;

图10为本发明一实施例提供的电子设备的逻辑框图。

具体实施方式

下面结合附图,对本发明的具体实施方式作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。

图1示出了本实施例提供的一种基于树形结构的服务发现处理方法的流程示意图,包括:

s101、若监听到目标键值key发生读写操作,则判断所述目标key对应的对象。

其中,服务发现的实例信息是按照树形结构存储到etcd的存储系统中,其树形结构体现在key中,举例来说:

key:/prefix/a(子公司名)/b(产品线名)/c(服务名)/gz(机房名)/1(实例编号)。

上述key表示一个实例节点,其存储的值是图2中的实例信息如图2所示,在子公司、产品线、服务名节点上来存储流量控制的信息。

再例如:

服务节点key:/prefix/a(子公司名)/b(产品线名)/c(服务名)/。

产品线节点key:/prefix/a(子公司名)/b(产品线名)/。

子公司节点key:/prefix/a(子公司名)/b(产品线名)/。

其中,子公司、产品线和服务节点的key是用来存储流量划分规则的结构化数据,此结构化数据主要结合后续的sdk使用,结合规则挑选该使用的远程资源信息,所以此结构化数据没有标准。

s102、若所述目标key对应的对象为实例,则获取树形结构中所述目标key对应的目标实例,并根据所述读写操作对所述树形结构中所述目标实例进行更新。

具体地,参见图2,若目标key对应的对象为实例,即树形结构中的叶子节点,则说明树形结构中的对应节点的目标实例需要进行更新。

s103、若所述目标key对应的对象不是实例,则获取树形结构中所述目标key对应的第一目标节点,并将所述目标key对应的流量划分规则存储到所述第一目标节点中。

具体地,参见图2,若目标key对应的对象不是实例,而是子公司、产品线、或服务,即树形结构中的中间节点,则说明树形结构中对应的中间节点需要存储对应的流量划分规则。

本实施例提供的树形结构的服务发现处理方法对应的系统如图3所示。在具体的实现过程中,如图3所示,sfnsnamingcluster是一套分布式集群服务,采用分布式的方式部署在服务器端,通过给外部管理平台及有服务注册的应用提供api,对实例信息按照既定结构进行存储和查询;sfnsnamingagent是一个基础组件部署到每一台物理机上,它主要与sfnsnamingcluster进行连接,监听服务的变化并实时更新本地数据,并对本地实例进行监控。每一个部署在物理机器的实例(图3中的后端服务a),都与n是sdk进行交互,返回符合当前流量划分策略的资源地址。

其中,naming-agent会监听根key,除了实例信息要更新到内存中,还要监听已经订阅的实例所属服务、所属产品线、所属公司的信息并实时同步结构化信息到内存中。服务实例在使用服务标识解析服务时,将此服务标识所属的、存在流量划分配置的、且是路径最短的上级节点的流量划分配置返回给服务。

具体地,naming-agent监听key的读写操作,监测到key发生读写后,判断是实例的key,则更新内存中数型结构的实例数据。当发现子公司、产品线、或服务的key的value发生变化,则将流量划分的规则信息存储到对应的节点上。naming-agent在提供解析服务标识的协议中,除了返回服务实例列表以外,也读取当前服务的流量划分规则、若不存在则读取其服务所属产品线的流量划分规则、若不存在则读取子公司的流量划分规则并返回。

举例来说,本实施例采用json结构化数据定义一个规则,json结构化数据如下:

其中,mirror为上游请求来源机房标签名;rate和backend_idc对应的代码表示一个流量划分单元,rate的值为<=1且>0的浮点数值,该示例代表上游来自于mirror机房的流量,100%走到此划分单元;backend_idc是一个2维数组,代表进入此流量划分单元的流量,要划分到哪个机房。此处设置的mirror整体配置的含义代表来自mirror机房访问当前服务时,100%的流量能且只能访问mirror机房的机器。

“gz”配置的流量划分策略代表来自gz机房的远程访问,优先访问gz机房,如果gz机房没有可用实例,则访问gz1和gz2中的一个,如果gz1和gz2中没有可用实例,则访问bj和sh机房。100%的流量遵循上述策略。

“bj”配置的流量划分策略代表来自bj机房的远程访问,30%的流量优先选取bj机房并以shgzgz1gz2几个机房实例做backup。70%的流量访问到mirror机房,此结构数据可以存储到图2中的位置,也即key对应的值中。

本实施例通过判断监听到的发生读写操作的目标key对应的对象,从树形结构中获取目标key对应的目标实例或第一目标节点,对树形结构中目标实例进行更新,或将目标key对应的流量划分规则存储到第一目标节点中,当出现异常情况时无需手动执行,可以保证公司内部整体流量控制策略一致,也可以通过平台化管理,主动修改某个服务或产品线的流量策略,同时能解决灰度环境或aorb环境的问题。

进一步地,在上述方法实施例的基础上,所述方法还包括:

s104、若判断获知第二目标节点中无流量划分规则,则获取所述第二目标节点的父节点,并将所述父节点的流量划分规则作为所述第二目标节点的流量划分规则。

具体地,基于树形结构服务发现实现的流量控制,不需要给每一个服务标识设置流量划分规则,当子节点的服务不存在规则时,可以默认遵循父节点的流量划分规则。所以对于公司整体流量的划分可以通过在子公司根节点来进行配置,有特殊需求或abtest需求,再在某些子节点进行针对性的配置,使得当遇到某些特殊情况时,公司可以调整整体流量划分策略。在运维管理过程中,也可以一眼看出哪些产品线或服务是有个性化流量划分,不受公司整体策略控制的,解决了整体流量控制难管理、不清晰的问题。

进一步地,在上述方法实施例的基础上,所述方法还包括:

s105、获取第三目标节点的目标流量划分规则,根据当前机房的标识和所述目标流量划分规则获取所有的流量划分单元。

s106、根据预设的平均值算法获取目标流量划分单元,并根据所述目标流量划分单元确定所述树形结构中的目标实例。

具体地,从当前所在机器的环境中判断当前所在机器属于哪个地域机房或逻辑机房,从读取到的流量划分策略划分规则中,按照当前所在机房的标识,读取出所有的流量划分单元;并根据统一的平均值算法计算比例,选取当前解析需要使用的某一个流量划分单元;最后从backend_idc数组中,按元素位置逐一读取优先级高的backend_idc的标识,并过滤所有的实例列表中符合backend_idc要求的实例,将集合返回给上层应用代码。

其中,从当前所在机器的环境中判断可以根据当前机器判断,也可以使用多种办法,比如在机器的某个目录放置配置文件,或给机器的环境变量中增加一个变量来实现。

进一步地,在上述方法实施例的基础上,所述方法还包括:

s107、通过软件开发工具包sdk提供的函数读取树形结构中所有的实例和流量划分规则。

具体地,本实施例针对不同的语言实现sdk或扩展,sdk逻辑非常简单,只是封装与naming-agent的交互解析服务标识,并解析对应的配置文件,根据当前所在机器的情况,返回应该选取的实例集合给服务,如图4所示。用不同的语言实现一整套策略相同的rpc框架很复杂,但是用不同语言实现一个数据格式解析的逻辑的sdk非常容易。

sdk主要封装了与naming-agent交互的协议,给上层的应用逻辑提供简单的函数封装。当上层应用想要解析某个服务标识时,调用sdk提供的函数。sdk此时与naming-agent进行交互,读取到当前的服务解析出的所有实例信息以及当前服务标识需要遵守的流量划分规则。

无论使用什么办法,只要保证初始化每一个机器的时候,可以将其一同完成设置即可;无论上层应用使用的是何种rpc框架、何种语言、或是何种负载均衡算法,基于sdk获取到实例集合继续其原有逻辑并选取出一个后端实例,来进行远程rpc访问。

由于所有公司的在线服务部署,一定都是在公司拥有的idc范围内的。所以为尽量保证远程资源访问在同机房内,通过在服务发现的子公司节点上进行同机房调用的统一策略即可,其他节点无需进行配置,默认将继承根节点的策略,整个公司的所有服务即会全部遵循此规则,如图5所示。相较于业界的每个服务都要配置一次,节省非常多的运维成本。

举例来说,服务发现的健康状态检查机制,比如当上海机房全部实例出现异常,流量就会按照当前服务或产品线或公司预定义好的backup方案进行流量划分;当用户想手动将图5中的来自上海的流量切到广州,针对该后端服务a指定流量划分策略也可达到目的,如图6所示。

具体的预定义的backup方案,即为在服务发现子公司节点设置的流量划分策略如下:

针对a指定流量划分,即为在后端服务a的服务发现节点上,配置定制化流量划分策略如下:

当有特殊需求,想要进行abtest或引入流量到特定的灰度环境时,通过修改该服务的流量划分单元,可以调整流量划分比例。业务逻辑中基本无需进行任何辅助流量切换的工作,只需要保证各自环境在按需执行不同的aorb逻辑,如图7所示。

其中,调整流量划分比例可参考如下:

在上述几个流量划分实施例中,后端服务a、后端服务b或接入层服务等,可以是基于任何语言来实现,也可以基于任何rpc框架,只要简单接入nssdk就可以进入公司整体的流量控制。而业界任何一个通过rpc框架来实现流量划分都无法达到该目的,因为一种rpc框架必定是基于一种语言的,无法跨语言。

基于树形结构设计的流量划分控制,可以便于运维管理。通过服务树,很容易知道哪些节点设置了自定义的流量划分,哪些服务没有,如图8所示为基于服务发现树形结构存储读取出来,在运维管理平台中的“服务树”,深色圆形为没有设置流量划分策略,浅色圆形是设置流量划分策略的,运维人员一眼就可以看出流量划分目前的大体情况,当进行公司整体流量调整时,也很容易感知哪些节点需要特殊关注。

图9示出了本实施例提供的一种基于树形结构的服务发现处理装置的结构示意图,所述装置包括:对象判断装置901、实例更新模块902和规则存储模块903,其中:

所述对象判断装置901用于若监听到目标键值key发生读写操作,则判断所述目标key对应的对象;

所述实例更新模块902用于若所述目标key对应的对象为实例,则获取树形结构中所述目标key对应的目标实例,并根据所述读写操作对所述树形结构中所述目标实例进行更新;

所述规则存储模块903用于若所述目标key对应的对象不是实例,则获取树形结构中所述目标key对应的第一目标节点,并将所述目标key对应的流量划分规则存储到所述第一目标节点中。

具体地,所述对象判断装置901若监听到目标键值key发生读写操作,则判断所述目标key对应的对象;所述实例更新模块902若所述目标key对应的对象为实例,则获取树形结构中所述目标key对应的目标实例,并根据所述读写操作对所述树形结构中所述目标实例进行更新;所述规则存储模块903若所述目标key对应的对象不是实例,则获取树形结构中所述目标key对应的第一目标节点,并将所述目标key对应的流量划分规则存储到所述第一目标节点中。

本实施例通过判断监听到的发生读写操作的目标key对应的对象,从树形结构中获取目标key对应的目标实例或第一目标节点,对树形结构中目标实例进行更新,或将目标key对应的流量划分规则存储到第一目标节点中,当出现异常情况时无需手动执行,可以保证公司内部整体流量控制策略一致,也可以通过平台化管理,主动修改某个服务或产品线的流量策略,同时能解决灰度环境或aorb环境的问题。

进一步地,在上述装置实施例的基础上,所述装置还包括:

规则获取模块,用于若判断获知第二目标节点中无流量划分规则,则获取所述第二目标节点的父节点,并将所述父节点的流量划分规则作为所述第二目标节点的流量划分规则。

进一步地,在上述装置实施例的基础上,所述装置还包括:

单元获取模块,用于获取第三目标节点的目标流量划分规则,根据当前机房的标识和所述目标流量划分规则获取所有的流量划分单元;

实例确定模块,用于根据预设的平均值算法获取目标流量划分单元,并根据所述目标流量划分单元确定所述树形结构中的目标实例。

进一步地,在上述装置实施例的基础上,所述装置还包括:

函数读取模块,用于通过软件开发工具包sdk提供的函数读取树形结构中所有的实例和流量划分规则。

本实施例所述的基于树形结构的服务发现处理装置可以用于执行上述方法实施例,其原理和技术效果类似,此处不再赘述。

参照图10,所述电子设备,包括:处理器(processor)1001、存储器(memory)1002和总线1003;

其中,

所述处理器1001和存储器1002通过所述总线1003完成相互间的通信;

所述处理器1001用于调用所述存储器1002中的程序指令,以执行上述各方法实施例所提供的方法。

本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法。

本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法。

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

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

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

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