Feign组件的实现方法、微服务调用方法及装置与流程

文档序号:23717745发布日期:2021-01-24 06:19阅读:122来源:国知局
Feign组件的实现方法、微服务调用方法及装置与流程
feign组件的实现方法、微服务调用方法及装置
技术领域
[0001]
本申请涉及微服务技术领域,具体而言,涉及一种feign组件的实现方法、微服务调用方法及装置。


背景技术:

[0002]
在传统的服务架构中,服务的规模处于运维人员的可控范围内。当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定。在微服务应用中,服务实例的数量和网络地址都是动态变化的,这对系统运维提出了巨大的挑战。因此,动态的服务注册与发现就显得尤为重要。
[0003]
在当下主流的springcloud框架下,微服务之间相互的调用采用feign组件实现。feign组件会根据微服务的名称获取注册在服务注册与发现组件里的微服务。
[0004]
但是,在实际应用中,考虑到微服务治理等其他的因素,微服务向服务注册与发现组件注册时,往往还会放入额外的信息,并将这个信息放置于服务注册与发现组件的元信息区。然而,元信息区中的信息(后文称元信息区中的信息为元信息)实际上也可以用于实现微服务调用的,从而实现一些特殊功能(比如无感升级等)。但是在目前的springcloud框架下,feign组件并不能从服务注册与发现组件中获取元信息,这就使得feign组件仅能根据微服务的名称调用相应的微服务,从而影响了对于微服务集群的治理。


技术实现要素:

[0005]
本申请实施例的目的在于提供一种feign组件的实现方法、微服务调用方法及装置,用以解决目前feign组件无法获取元信息实现微服务处理的问题。
[0006]
本申请实施例提供了一种feign组件的实现方法,包括:创建feign组件的主类;所述主类下实现有创建负载均衡的方法;所述创建负载均衡的方法用于根据元信息检索与所述元信息对应的微服务实例;在所述主类下实现第一javabean;所述第一javabean为用于创建feign客户端的javabean;所述第一javabean中实现有元信息的获取方法,且所述元信息的获取方法允许所述创建负载均衡的方法调用;所述元信息的获取方法用于获取元信息,以及在不存在与当前的服务注册与发现组件对应的连接驱动时,构建该服务注册与发现组件的连接驱动。
[0007]
在上述实现过程中,通过在feign组件的主类下实现可根据元信息检索与该元信息对应的微服务实例的创建负载均衡的方法,并在主类下实现元信息的获取方法,并使得元信息的获取方法可被创建负载均衡的方法调用。从而,通过元信息的获取方法实现feign组件到服务注册与发现组件的连接驱动,从而获取到服务注册与发现组件的元信息去中的元信息,进而由创建负载均衡的方法进行调用。这样,即使得feign组件具有了元信息的获取能力,从而可以依据元信息确定对应的微服务实例,从而可以使得feign组件能够实现更为灵活的微服务集群的治理。
[0008]
进一步地,在所述主类下实现第一javabean包括:在所述主类下创建第一子类,所
述第一子类继承所述feign客户端;在所述第一子类中,实现所述feign客户端的接口定义方法;在所述第一子类中,实现所述元信息的获取方法。
[0009]
在上述实现方式中,通过继承feign客户端,使得第一子类能和框架相融合,符合框架所需的标准。而通过实现feign客户端的接口定义方法,从而可以使得元信息的获取方法可以被创建负载均衡的方法所调用,且由于实现了feign客户端的接口定义方法,在新加入其他的元信息的获取方法时,也可以通过feign客户端的接口定义方法实现到整个feign组件的接入。这样,通过上述实现方法得到的第一子类,可实现满足框架要求,且便于元信息的获取方法与服务注册与发现组件连接,从而获取元信息,同时也便于创建负载均衡的方法调用。
[0010]
进一步地,所述方法还包括:在所述主类下实现第二javabean;所述第二javabean为用于创建负载均衡的客户端工厂模式的javabean;所述第二javabean中实现有所述创建负载均衡的方法。
[0011]
进一步地,在所述主类下实现第二javabean包括:在所述主类下创建第二子类;在所述第二子类中提供第一构造函数;所述第一构造函数的参数包括框架提供的客户端工厂类,以及支持热加载的路由配置类;在所述第一构造函数内实现创建负载均衡的方法;所述创建负载均衡的方法的入参包括所述元信息。
[0012]
进一步地,所述方法还包括:在所述主类下还实现第三javabean;所述第三javabean为用于创建支持重试功能的负载均衡的客户端工厂模式的javabean;所述第三javabean中实现有所述创建负载均衡的方法。
[0013]
进一步地,在所述主类下实现第三javabean包括:在所述主类下创建第三子类;在所述第三子类中提供第二构造函数;所述第二构造函数的参数包括框架提供的客户端工厂类、支持热加载的路由配置类、以及提供重试策略的负载均衡重试工厂类;在所述第二构造函数内实现创建负载均衡的方法;所述创建负载均衡的方法的入参包括所述元信息。
[0014]
进一步地,所述创建负载均衡的方法内具有寻找服务平衡的实现;所述寻找服务平衡的实现的入参为所述元信息,返回为包含根据所述元信息检索到的符合要求的微服务实例的对象。
[0015]
通过上述实现过程,即可实现通过元信息对于微服务实例的查找,从而可以实现更为灵活的微服务调用。
[0016]
进一步地,所述方法还包括:在feign组件的启动程序中添加切入配置,以在项目启动时,引导进程进入所述主类。
[0017]
在本申请实施例中,通过在feign组件的启动程序中添加切入配置,从而可以在项目启动时,引导进程进入主类,从而执行对于元信息的获取以及根据元信息实现对于微服务实例的查找,从而扩展feign组件的能力。
[0018]
本申请实施例中还提供了一种微服务调用方法,包括:将根据前述任一种的实现方法所实现的feign组件添加到项目的依赖中;在调用微服务时,启动所述feign组件确定所需的微服务实例。
[0019]
通过上述实现过程,本申请可以在调用微服务时,实现基于元信息的微服务调用,从而可以实现比现有仅基于微服务名称的调用方式更为灵活和丰富的功能。
[0020]
进一步地,在将所述feign组件添加到项目的依赖中之后,所述方法还包括:在所
述项目的配置文件里添加所述feign组件的使能项,并且设置所述使能项使能。
[0021]
在上述实现过程中,通过配置使能项,从而可以实现对于feign组件的配置,实现对于feign组件基于元信息进行微服务查询的能力的启停控制,从而给予操作者更为丰富的操作选择。
[0022]
本申请实施例中还提供了一种微服务调用方法,应用于根据前述的实现方法所实现的feign组件中,包括:在接收到微服务调用请求时,所述feign组件的创建负载均衡的方法调用所述元信息的获取方法从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息;所述创建负载均衡的方法根据所述元信息检索与所述元信息对应的微服务实例;返回所述微服务实例的对象。
[0023]
通过上述实现方式,feign组件具有从服务注册与发现组件的元信息区获取元信息的能力,可以从服务注册与发现组件中获取与所述微服务调用请求对应的元信息,进而根据元信息检索与所述元信息对应的微服务实例,从而可以使得feign组件能够实现更为灵活的微服务集群的治理。
[0024]
进一步地,所述调用所述元信息的获取方法从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息,包括:调用所述元信息的获取方法;所述元信息的获取方法判断是否存在与当前的服务注册与发现组件对应的连接驱动;若存在,从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息;若不存在,构建该服务注册与发现组件的连接驱动,从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息。
[0025]
在上述实现过程中,通过获取构建该服务注册与发现组件的连接驱动,使得feign组件与服务注册与发现组件能够直接相连,从而使得feign组件能够有效获取到服务注册与发现组件中的元信息。
[0026]
本申请实施例中还提供了一种feign组件的实现装置,包括:创建模块和实现模块;所述创建模块,用于创建feign组件的主类;所述主类下实现有创建负载均衡的方法;所述实现模块,用于在所述主类下实现第一javabean;所述第一javabean为用于创建feign客户端的javabean;所述第一javabean中实现有元信息的获取方法,且所述元信息的获取方法允许所述创建负载均衡的方法调用;所述元信息的获取方法用于获取元信息,以及在不存在与当前的服务注册与发现组件对应的连接驱动时,构建该服务注册与发现组件的连接驱动。
[0027]
本申请实施例中还提供了一种微服务调用装置,包括:添加模块和确定模块;所述添加模块,用于将根据上述任一种的实现方法所实现的feign组件添加到项目的依赖中;所述确定模块,用于在调用微服务时,启动所述feign组件确定所需的微服务实例。
[0028]
本申请实施例中还提供了一种根据前述的实现方法所实现的feign组件,包括:处理模块,用于在接收到微服务调用请求时,调用所述元信息的获取方法从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息;所述处理模块,还用于根据所述元信息检索与所述元信息对应的微服务实例;返回模块,用于返回所述微服务实例的对象。
[0029]
本申请实施例中还提供了一种电子设备,包括:处理器、存储器及通信总线;所述通信总线用于实现所述处理器和存储器之间的连接通信;所述处理器用于执行存储器中存储的一个或者多个程序,以实现上述任一种的方法。
[0030]
本申请实施例中还提供了一种可读存储介质,所述可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述任一种的方法。
附图说明
[0031]
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
[0032]
图1为本申请实施例提供的一种feign组件的实现方法的流程示意图;
[0033]
图2为本申请实施例提供的一种微服务调用方法的流程示意图;
[0034]
图3为本申请实施例提供的又一种微服务调用方法的流程示意图;
[0035]
图4为本申请实施例提供的一种feign组件的实现装置的结构示意图;
[0036]
图5为本申请实施例提供的一种微服务调用装置的结构示意图;
[0037]
图6为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
[0038]
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
[0039]
实施例一:
[0040]
为了使得feign组件能够具有获取元信息的能力,且能够基于元信息实现对应的微服务治理,在本申请实施例中提供了一种feign组件的实现方法。
[0041]
参见图1所示,本申请实施例中所提供的feign组件的实现方法包括:
[0042]
s101:创建feign组件的主类。
[0043]
在本申请实施例中,可以创建一个feign组件的主类,通过主类向框架系统注册自己的实现,从而让框架进入相关功能流程,并且向框架系统提供相关功能的实现。
[0044]
在本申请实施例中,创建主类时,可以配置其自动加载,从而使得主类可被框架识别并加载。
[0045]
在本申请实施例中,创建主类时,还可以配置开关,从而使得主类可以被控制是否启用。
[0046]
在本申请实施例中,在创建主类时,可以在主类下实现创建负载均衡的方法(后文称createfeignloadbalancer方法)。在本申请实施例中,createfeignloadbalancer方法可以根据元信息,检索与元信息对应的微服务实例,从而实现基于元信息的微服务调用。
[0047]
而为了实现上述能力,在本申请实施例中,createfeignloadbalancer方法可以通过create()函数来实现。在createfeignloadbalancer方法中,入参可以包括需要调用的微服务的注册名称、元信息等,而返回的可以是微服务实例等feign组件中的对象。
[0048]
在本申请实施例中,可以通过创建javabean的方式,在javabean中实现createfeignloadbalancer方法,以供系统全局使用。
[0049]
应理解,在实际应用过程中,不同的项目中,服务注册与发现组件的不同配置往往会导致对于所需的javabean存在不同的需求。有些配置需要适配不需要支持重试功能的
javabean,而有些配置则需要适配需要支持重试功能的javabean。
[0050]
为了满足实际需要,在本申请实施例中,可以同时在主类下实现两个javabean(后文称为第二javabean和第三javabean)。其中,第二javabean为用于创建负载均衡的客户端工厂模式的javabean,而第三javabean为用于创建支持重试功能的负载均衡的客户端工厂模式的javabean。
[0051]
在本申请实施例中,为了实现第二javabean,可以通过在主类下创建第二子类,并在第二子类中提供第一构造函数,从而在第一构造函数中创建负载均衡的方法,从而实现第二javabean。其中,第一构造函数的参数包括框架提供的客户端工厂类,以及支持热加载的路由配置类等。而在创建负载均衡的方法中,入参则包括元信息。
[0052]
类似的,为了实现第三javabean,可以通过在主类下创建第三子类,并在第三子类中提供第二构造函数,从而在第二构造函数中创建负载均衡的方法,从而实现第三javabean。其中,第二构造函数的参数相比于第一构造函数而言,除了包括框架提供的客户端工厂类,以及支持热加载的路由配置类外,还包括有提供重试策略的负载均衡重试工厂类,从而可以支持重试。而在创建负载均衡的方法中,入参同样包括元信息。
[0053]
在本申请实施例中,为了确保第二子类和第三子类能够符合框架标准,能够与框架相容,可以在创建第二子类和第三子类时,继承框架已有的负载均衡工厂。
[0054]
在本申请实施例中,在createfeignloadbalancer方法中应具有寻找服务平衡的实现(也可以称为函数或方法)。在本申请实施例中,寻找服务平衡的实现可以通过现有的通过某种入参实现对该入参对应的微服务实例的检索的实现方式在createfeignloadbalancer方法中实现,其与传统的寻找服务平衡的实现相比,区别在于入参为元信息。
[0055]
需要理解的是,在实际应用过程中,根据实际调用请求的不同,会适配所需采用的是第二javabean还是第三javabean。示例性的:比如,对于业务类调用,可以适配需要支持重试功能的第三javabean;而对于心跳检测类,则可以适配不需要支持重试功能的第二javabean。
[0056]
应理解的是,在本申请实施例中,也可以仅设置第二javabean或仅设置第三javabean。此时本申请实施例的方案在部分场景下仍旧可以实施。
[0057]
s102:在主类下实现第一javabean。
[0058]
在本申请实施例中,第一javabean为用于创建feign客户端的javabean,可以供框架系统全局使用。
[0059]
在本申请实施例中,第一javabean中实现有元信息的获取方法,且元信息的获取方法允许createfeignloadbalancer方法调用。
[0060]
在本申请实施例中,元信息的获取方法用于从服务注册与发现组件中获取元信息。此外,还用于在不存在与当前的服务注册与发现组件对应的连接驱动时,构建该服务注册与发现组件的连接驱动。
[0061]
在本申请实施例中,元信息的获取方法可以包括:判断是否存在服务注册与发现组件对应的连接驱动;若没有连接驱动,则构造连接驱动。构造成功后,获取服务注册与发现组件的元信息区中的元信息。若有连接驱动,则直接获取服务注册与发现组件的元信息区中的元信息。
[0062]
需要注意的是,若元信息的获取方法可以实现的多种服务注册与发现组件的元信息获取,那么在判断是否存在服务注册与发现组件对应的连接驱动之前,还存在确定服务注册与发现组件的类型的过程。此时,判断是否存在服务注册与发现组件对应的连接驱动即是,判断是否存在该类型的服务注册与发现组件对应的连接驱动。
[0063]
示例性的,在本申请实施例中,设元信息的获取方法用于实现从consul、nacos和eureka这三种服务注册与发现组件中获取元信息,则可以设置元信息的获取方法如下:
[0064]
1、判断服务注册与发现组件是否为consul;
[0065]
若是,判断是否存在consul连接驱动;
[0066]
若没有consul连接驱动,构造consul连接驱动。成功后,获取consul元信息区中的元信息。
[0067]
2、判断服务注册与发现组件是否为nacos;
[0068]
若是,判断是否存在nacos连接驱动;
[0069]
若没有nacos连接驱动,构造nacos连接驱动。成功后,获取nacos元信息区中的元信息。
[0070]
3、判断服务注册与发现组件是否为eureka;
[0071]
若是,判断是否存在eureka连接驱动;
[0072]
若没有eureka连接驱动,构造eureka连接驱动。成功后,获取eureka元信息区中的元信息。
[0073]
在本申请实施例中,可以通过在主类下创建子类的方式实现第一javabean。
[0074]
示例性的,可以在主类下创建第一子类,并使第一子类继承框架提供的feign客户端,从而使得第一子类能够和框架相融合,符合框架所需的标准。
[0075]
然后可以在第一子类中,实现feign客户端的接口定义方法和前述元信息的获取方法。
[0076]
在本申请实施例中,实现feign客户端的接口定义方法可以通过execute()函数实现,其入参包括http request(http请求)和options(选项)等,options包括超时时间等可选配置。
[0077]
在本申请实施例中,通过feign客户端的接口定义方法实现了从createfeignloadbalancer方法到元信息的获取方法的调用,此外,在后期需要新增对于元信息的获取方法时,也可以通过该feign客户端的接口定义方法实现接入。
[0078]
在本申请实施例中,在创建主类时或之前,可以在feign组件的启动程序中添加切入配置,以在项目启动时,引导进程进入主类。
[0079]
示例性的,可以在feign组件的resources\meta-inf目录下添加spring.factories文件,并添加相关配置,从而实现切入配置的添加。
[0080]
所添加的相关配置可以为:org.springframework.boot.autoconfigure.enableautoconfiguration=com.winnin g.base.akso.cloud.client.autoconfigure.winfeignconfiguration(通知spring框架,在项目启动时加载winfeignconfiguration这个类)。
[0081]
需要说明的是,上述代码中,winfeignconfiguration表征本申请实施例中的主类。
[0082]
需要说明的是,上述方法实现的是在feign组件中新增的功能,feign组件原本的
处理流程仍旧可以保留。
[0083]
需要理解的是,上述feign组件的实现方法可以由工程师手动配置实现,但是也可以通过预先设定好配置脚本,从而通过计算机等电子设备实现自动执行。
[0084]
本申请实施例所提供的feign组件的实现方法,通过在feign组件的主类下实现可根据元信息检索与该元信息对应的微服务实例的创建负载均衡的方法,并在主类下实现元信息的获取方法,并使得元信息的获取方法可被创建负载均衡的方法调用。从而,通过元信息的获取方法实现feign组件到服务注册与发现组件的连接驱动,从而获取到服务注册与发现组件的元信息去中的元信息,进而由创建负载均衡的方法进行调用。这样,即使得feign组件具有了元信息的获取能力,从而可以依据元信息确定对应的微服务实例,从而可以使得feign组件能够实现更为灵活的微服务集群的治理。
[0085]
相应的,本申请实施例中还提供了一种微服务调用方法,应用于根据前述的实现方法所实现的feign组件中。
[0086]
可以参见图2所示,该微服务调用方法包括:
[0087]
s201:在接收到微服务调用请求时,feign组件的createfeignloadbalancer方法调用元信息的获取方法,从服务注册与发现组件中获取与微服务调用请求对应的元信息。
[0088]
应当理解的是,在本申请实施例中,元信息的获取方法在从服务注册与发现组件中获取与微服务调用请求对应的元信息时,会先判断是否存在与当前的服务注册与发现组件对应的连接驱动。若存在,则可以直接从服务注册与发现组件中获取与微服务调用请求对应的元信息;而若不存在,则可以构建该服务注册与发现组件的连接驱动,再从服务注册与发现组件中获取与微服务调用请求对应的元信息。
[0089]
需要理解的是,在本申请实施例中,微服务调用请求通常会具有请求调用的微服务的注册名称等信息。根据诸如注册名称等信息,可以在元信息区中找到与请求调用的微服务相关的元信息。
[0090]
s202:创建负载均衡的方法根据元信息检索与元信息对应的微服务实例。
[0091]
在本申请实施例中,createfeignloadbalancer方法在调用元信息的获取方法,从而检索得到相应的微服务实例。
[0092]
s203:返回微服务实例的对象。
[0093]
还需要说明的是,通常在进行某个项目时会需要进行微服务调用,因此需要将feign组件应用到项目中,从而实现对于feign组件的使用。为此,在本申请实施例中还提供了一种微服务调用方法,可以参见图3所示,包括:
[0094]
s301:将根据前述实现方法所实现的feign组件添加到项目的依赖中。
[0095]
需要理解的是,在本申请实施例中,可以在将feign组件添加到项目的依赖中之后,在项目的配置文件里添加feign组件的使能项,并且设置使能项使能。
[0096]
所谓设置使能项使能,即表征开启所添加的添加feign组件的功能,其在程序中的代码值通常为“true”。使能项除了可以设置为使能外,还可以设置为关闭,从而关闭所添加的添加feign组件的功能,其在程序中的代码值通常为“false”。
[0097]
s302:在调用微服务时,启动该feign组件确定所需的微服务实例。
[0098]
在项目中需要调用微服务时,该feign组件即可根据前述图2所示的微服务调用方法实现对于微服务实例的确定。
[0099]
需要理解的是,上述图3的方法可以由工程师手动配置实现,但是也可以通过预先设定好配置脚本,从而通过计算机等电子设备实现自动执行。
[0100]
通过,本申请实施例的方案,可以使得feign组件具有从服务注册与发现组件的元信息区获取元信息的能力,并能实现基于元信息的微服务实例的选择,从而可以使得feign组件能够实现更为灵活的微服务集群的治理。
[0101]
实施例二:
[0102]
本实施例结合实施例一的介绍,通过一种具体的feign组件的实现方法来对本申请实施例的方案进行进一步示例说明。
[0103]
在本实施例中,feign组件的实现包括以下过程:
[0104]
1、在resources\meta-inf目录下添加spring.factories文件,并添加相关配置:
[0105]
org.springframework.boot.autoconfigure.enableautoconfiguration=com.w inning.base.akso.cloud.client.autoconfigure.winfeignconfiguration。
[0106]
2、创建主类winfeignconfiguration:
[0107]
2.1实现可自动加载,从而使得主类可以被框架识别,并加载;
[0108]
2.2实现配置开关,从而使得主类可以通过配置文件来控制是否启用;
[0109]
2.3实现bean:cachinglbclientfactory(第二javabean):
[0110]
实现cachinglbclientfactory的作用是创建一个单例模式的可缓存的负载均衡的客户端工厂模式javabean,提供给框架系统全局使用(其实现参照过程3)。
[0111]
2.4实现bean:retryabecachinglbclientfactory(第三javabean):
[0112]
实现retryabecachinglbclientfactory的作用是创建一个单例模式的支持重试功能的可缓存的负载均衡的客户端工厂模式javabean,提供给框架系统全局使用(其实现参照过程3)。
[0113]
2.5实现bean:feignclient(第一javabean):
[0114]
实现feignclient的作用是创建一个单例模式的feign客户端javabean,提供给框架系统全局使用(他的实现是winloadbalancerfeignclient(负载均衡feign客户端,第一子类),实现参照过程4)。
[0115]
3、创建子类wincachingspringloadbalancerfactory(第二子类和第三子类):
[0116]
这个类提供winfeignconfiguration里cachinglbclientfactory与retryabecachinglbclientfactory这两个bean的具体实现。
[0117]
3.1继承cachingspringloadbalancerfactory(可缓存的负载均衡工厂),从而使得创建的子类wincachingspringloadbalancerfactory符合标准,能够与框架相融合。
[0118]
3.2实现wincachingspringloadbalancerfactory(springclientfactory factory,winroutesconfig winroutesconfig)方法。
[0119]
需要说明的是,wincachingspringloadbalancerfactory方法为构造函数,(springclientfactory factory,winroutesconfig winroutesconfig)表征构造函数的参数包含框架提供的客户端工厂类springclientfactory,以及支持热加载的路由配置类winroutesconfig。
[0120]
3.3实现wincachingspringloadbalancerfactory(springclientfactory factory,loadbalancedretryfactory loadbalancedretrypolicyfactory,
winroutesconfig winroutesconfig)方法。
[0121]
需要说明的是,wincachingspringloadbalancerfactory方法为构造函数,(springclientfactory factory,loadbalancedretryfactory loadbalancedretrypolicyfactory,winroutesconfig winroutesconfig)表征构造函数的参数包含框架提供的客户端工厂类springclientfactory,支持热加载的路由配置类winroutesconfig,以及提供重试策略的loadbalancedretryfactory工厂类。
[0122]
需要理解的是,3.2中和3.3中的wincachingspringloadbalancerfactory方法均为构造函数,但是3.3中比3.2中多一个参数loadbalancedretryfactory,因此3.3的构造函数相比3.2的构造函数而言,会多出一个支持重试的能力。在实施例中,3.2的构造函数为第一构造函数,3.3的构造函数为第二构造函数。
[0123]
3.4实现createfeignloadbalancer(string clientname,map<string,collection>headertags)方法。
[0124]
createfeignloadbalancer方法是前述构造函数中的重要实现,入参是需要调用的微服务的注册名称,以及元信息,返回的是winfeignloadbalancer(feign组件的负载均衡)对象。
[0125]
3.5实现findserverbalancer(boolean ifdefault,string clientname,string serial,string version,boolean endmode)方法。
[0126]
findserverbalancer方法(即本申请实施例中寻找服务平衡的实现)是createfeignloadbalancer方法里面的重要实现。findserverbalancer方法的入参是元信息,返回的是包含根据元信息检索到的微服务实例的winfeignloadbalancer对象。
[0127]
需要说明的是,本实施例中,通过3.1、3.2、3.4和3.5实现bean:cachinglbclientfactory;通过3.1、3.3、3.4和3.5实现bean:retryabecachinglbclientfactory。
[0128]
4、创建子类winloadbalancerfeignclient(第一子类):
[0129]
需要说明的是,这个类提供winfeignconfiguration里bean:feignclient的具体实现。
[0130]
4.1继承client,使得winloadbalancerfeignclient符合标准,能够与框架相融合。
[0131]
4.2实现execute(request request,request.options options)throws ioexception方法
[0132]
execute()throws ioexception方法是客户端接口定义的方法,是winloadbalancerfeignclient的主要方法。入参是http request,以及options。options包含超时时间等可选配置。
[0133]
4.3实现getmetainfo方法(元信息的获取方):
[0134]
判断服务注册与发现组件是否为consul;若是,判断是否存在consul连接驱动。若存在,获取consul元信息区的元信息;若不存在,构造consul连接驱动,获取consul元信息区的元信息。
[0135]
若服务注册与发现组件不为consul,判断服务注册与发现组件是否为nacos;若是,判断是否存在nacos连接驱动。若存在,获取nacos元信息区的元信息;若不存在,构造
nacos连接驱动,获取nacos元信息区的元信息。
[0136]
若服务注册与发现组件不为nacos,判断服务注册与发现组件是否为eureka;若是,判断是否存在eureka连接驱动。若存在,获取eureka元信息区的元信息;若不存在,构造eureka连接驱动,获取eureka元信息区的元信息。
[0137]
5、createwinfeignloadbalancer方法调用winloadbalancerfeignclient的getmetainfo方法,获取所需要的元信息。
[0138]
在通过上述过程实现了feign组件后,将上述实现的feign组件(由于前述实现的是feign组件中基于元信息实现微服务选择的功能,而非整个feign组件,故本实施例中后文称其为feign组件的winning-akso-cloud-feign-starter组件)添加到项目的依赖中:
[0139]
<dependencies>
[0140]
<dependency>
[0141]
<groupid>com.winning</groupid>
[0142]
<artifactid>winning-akso-cloud-feign-starter</artifactid>
[0143]
</dependency>
[0144]
<dependencies>
[0145]
代码含义:目标项目要使用winning-akso-cloud-feign-starter组件。
[0146]
需要理解的是,本实施例中除了通过上述方式将winning-akso-cloud-feign-starter组件添加到项目的依赖中外,还可以通过直接把jar文件添加到目标项目的classpath中(放到lib目录里)等方式实现将winning-akso-cloud-feign-starter组件添加到项目的依赖中,在本申请实施例中不做限定。
[0147]
在项目的配置文件里添加winning.feign.enabled项(使能项),并且设置它的值为true(表征启用)。若要关闭winning-akso-cloud-feign-starter组件,则设置winning.feign.enabled项的值为false(表征关闭)。
[0148]
进入feign组件处理流程。每次微服务之间的互相调用,feign组件都会去获取储存在服务注册与发现组件的元信息区的元信息,进而依据元信息查找微服务实例。
[0149]
目前,springcloud项目中,微服务之间互相调用,只能通过注册时的微服务的注册名称来选择微服务实例。而通过本实施例的方案,则除了注册名称外,还可以通过元信息来做微服务实例选择。这就为更好的完成复杂而又特殊的微服务治理打下了实现的基础。
[0150]
实施例三:
[0151]
基于同一发明构思,本申请实施例中还提供一种feign组件的实现装置100和微服务调用装置200。请参阅图4和图5所示,图4示出了采用图1所示的feign组件的实现方法的feign组件的实现装置,图5示出了采用实施例一图3所示的微服务调用方法的微服务调用装置。应理解,装置100和装置200具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。装置100和装置200包括至少一个能以软件或固件的形式存储于存储器中或固化在装置100、装置200的操作系统中的软件功能模块。具体地:
[0152]
参见图4所示,feign组件的实现装置100包括:创建模块101和实现模块102。其中:
[0153]
所述创建模块101,用于创建feign组件的主类;所述主类下实现有创建负载均衡的方法;
[0154]
所述实现模块102,用于在所述主类下实现第一javabean;所述第一javabean为用
于创建feign客户端的javabean;
[0155]
所述第一javabean中实现有元信息的获取方法,且所述元信息的获取方法允许所述创建负载均衡的方法调用;所述元信息的获取方法用于获取元信息,以及在不存在与当前的服务注册与发现组件对应的连接驱动时,构建该服务注册与发现组件的连接驱动。
[0156]
在本申请实施例中,所述实现模块102具体用于,在所述主类下创建第一子类,所述第一子类继承所述feign客户端;在所述第一子类中,实现所述feign客户端的接口定义方法;在所述第一子类中,实现所述元信息的获取方法。
[0157]
在本申请实施例中,所述实现模块102还用于,在所述主类下实现第二javabean;所述第二javabean为用于创建负载均衡的客户端工厂模式的javabean;所述第二javabean中实现有所述创建负载均衡的方法。
[0158]
在本申请实施例中,所述实现模块102具体用于在所述主类下创建第二子类;在所述第二子类中提供第一构造函数;所述第一构造函数的参数包括框架提供的客户端工厂类,以及支持热加载的路由配置类;在所述第一构造函数内实现创建负载均衡的方法;所述创建负载均衡的方法的入参包括所述元信息。
[0159]
在本申请实施例中,所述实现模块102还用于,在所述主类下还实现第三javabean;所述第三javabean为用于创建支持重试功能的负载均衡的客户端工厂模式的javabean;所述第三javabean中实现有所述创建负载均衡的方法。
[0160]
在本申请实施例中,所述实现模块102具体用于在所述主类下创建第三子类;在所述第三子类中提供第二构造函数;所述第二构造函数的参数包括框架提供的客户端工厂类、支持热加载的路由配置类、以及提供重试策略的负载均衡重试工厂类;在所述第二构造函数内实现创建负载均衡的方法;所述创建负载均衡的方法的入参包括所述元信息。
[0161]
在本申请实施例中,所述创建负载均衡的方法内具有寻找服务平衡的实现;所述寻找服务平衡的实现的入参为所述元信息,返回为包含根据所述元信息检索到的符合要求的微服务实例的对象。
[0162]
在本申请实施例中,所述创建模块101还用于在feign组件的启动程序中添加切入配置,以在项目启动时,引导进程进入所述主类。
[0163]
参见图5所示,微服务调用装置200包括:添加模块201和确定模块202。其中:
[0164]
所述添加模块201,用于将根据实施例一所述的实现方法所实现的feign组件添加到项目的依赖中;
[0165]
所述确定模块202,用于在调用微服务时,启动所述feign组件确定所需的微服务实例。
[0166]
在本申请实施例中,所述添加模块201还用于,在将所述feign组件添加到项目的依赖中之后,在所述项目的配置文件里添加所述feign组件的使能项,并且设置所述使能项使能。
[0167]
基于同一发明构思,本申请实施例中还提供一种根据实施例一所述的实现方法所实现的feign组件,可以实现与实施例一种附图2所述的方法对应的功能。因此,为避免重复,此处适当省略详细描述。feign组件中的模块能以软件或固件的形式存储于存储器中或固化在feign组件所在的电子设备中。具体地:
[0168]
feign组件包括:
[0169]
处理模块,用于在接收到微服务调用请求时,调用所述元信息的获取方法从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息;
[0170]
所述处理模块,还用于根据所述元信息检索与所述元信息对应的微服务实例;
[0171]
返回模块,用于返回所述微服务实例的对象。
[0172]
在本申请实施例中,所述元信息的获取方法从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息,包括:
[0173]
判断是否存在与当前的服务注册与发现组件对应的连接驱动;
[0174]
若存在,从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息;
[0175]
若不存在,构建该服务注册与发现组件的连接驱动,从所述服务注册与发现组件中获取与所述微服务调用请求对应的元信息。
[0176]
需要理解的是,出于描述简洁的考量,部分实施例一中描述过的内容在本实施例中不再赘述。
[0177]
实施例四:
[0178]
本实施例提供了一种电子设备,参见图6所示,其包括处理器601、存储器602以及通信总线603。其中:
[0179]
通信总线603用于实现处理器601和存储器602之间的连接通信。
[0180]
处理器601用于执行存储器602中存储的一个或多个第一程序,以实现上述实施例一和/或实施例二中的方法。
[0181]
可以理解,图6所示的结构仅为示意,电子设备还可包括比图6中所示更多或者更少的组件,或者具有与图6所示不同的配置。例如,电子设备可以为服务器或终端。
[0182]
本实施例还提供了一种可读存储介质,如软盘、光盘、硬盘、闪存、u盘、sd(secure digital memory card,安全数码卡)卡、mmc(multimedia card,多媒体卡)卡等,在该可读存储介质中存储有实现上述各个步骤的一个或者多个程序,这一个或者多个程序可被一个或者多个处理器执行,以实现上述实施例一和/或实施例二中的方法。在此不再赘述。
[0183]
在本申请所提供的实施例中,应该理解到,所揭露装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0184]
另外,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0185]
再者,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
[0186]
在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际
的关系或者顺序。
[0187]
在本文中,多个是指两个或两个以上。
[0188]
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1