本发明涉及java开发技术领域,特别涉及一种熔断器的实现方法。
背景技术:
目前,在微服务架构中,为了方便系统的前期的开发以及后期升级、维护,提交工作效率,一般会将系统划分为多个服务单元。各个服务单元通过服务注册以及订阅的方式互相依赖。同时,在各个服务单元中,会出现服务间互相调用的情况。这就有可能因为网络问题或所依赖的服务单元自身故障造成调用失败。如果此时系统出现大量调用已出现故障的服务单元,最后会因为等待该单元响应而造成请求积压,最终导致整个系统出现瘫痪。
为了解决这个问题,在微服务架构中采用了熔断器技术。当一个服务单元出现故障无法响应请求时,微服务架构的熔断器会认为该服务已出现故障,对该服务单元进行隔离。当有其它业务单元调用该服务单元的请求时,熔断器会将请求隔离,并快速返回失败;而不再进行具体的请求工作。这样可以防止已出故障的服务单元出现请求积压,避免其它服务单元出现请求等待,最终造成整个系统瘫痪的问题。
熔断器的出现,大大提高了系统的稳定性及可用性。目前熔断器的开发过程,基本上分为三步:
第一步,定义本服务单元的接口类interface,该接口类定义了本服务单元的所有的服务接口。
第二步,实现服务单元的接口类,一般为实现类,并实现服务接口ihterface的所有方法;在方法体中,一般会调用其它服务单元的服务方法。
第三步,为了防止第二步因调用的服务单元出现故障造成请求积压,需要定义本服务单元各个服务方法的熔断器方法;因此熔断器处需要实现服务单元接口ihterface的所有服务方法。
因为熔断器主要处理请求失效后的快速隔离方法,熔断器里的方法基础是一致的,基本是实现日志记录、通知等功能。由于熔断器的方法需与服务单元的方法一致,因此随着系统的功能越来越丰富,服务单元的接口方法也会随之增加,这样熔断器实现方法的也必须同步增多。这样系统会增加非常多的重复代码,增加开发工作量,降低效率。
技术实现要素:
本发明解决的技术问题在于提供一种熔断器的实现方法,降低熔断器的开发工作量,提高工作效率。
本发明解决上述技术问题的技术方案是:
所述的方法是将熔断器需要实现的快速隔离方法区分为父类和子类;通用的处理方法归入父类,动态的方法归入子类;父类方法不变,而子类的处理方法根据需要实现动态的创建。
所述的方法具体包括以下步骤:
步骤1:实现熔断器父类,将通用处理方法作为父类并实现,提供给其它熔断器使用;其它熔断器直接实现调用该类的通用处理方法;
步骤2:实现动态方法创建工具类,该类包括两个重要方法;包括实现动态创建方法和动态创建熔断器类的方法;
步骤3:在容器启动时,获取远程调用的列表,并循环调用动态方法创建工具类,实现熔断器动态创建工作。
所述的步骤2具体包括如下步骤:
步骤21:实现动态创建方法,实现根据传入的类与方法名参数为该类动态创建指定的方法,并在方法体中调用父类的通用处理方法;
步骤22:根据远程调用类的方法列表,动态创建熔断器类的方法;当远程调用类的方法不在熔断器方法列表中时,则通过动态创建方法创建该方法。
所述的动态创建方法包括新增、删除、修改、查询。
所述的通用的处理方法包括记录异常日志,邮件通知,短信队列。
本发明用户无需因为远程调用模块的调整而动态调整熔断器的相关方法;当熔断处理需要调整时,只需要通过调整处理方法即可,从而达到统一调整的效果。通过本发明的方法,可以大大提高熔断器的开发与调整工作,业务系统只需要关注业务模块的开发,大大提高工作效率,降低系统的复杂度,同时为后续的升级维护提供便利。
附图说明
下面结合附图对本发明进一步说明:
图1是本发明熔断器实现基本流程图;
图2是本发明hystrixutiil处理流程示意图。
具体实施方式
见图1所示,是本发明熔断器实现具体实施流程图;其实现方法基本包括以下步骤:
s10:定义熔断器基础实现类。
熔断器的基础实现类basehystrix,该类中实现系统通用熔断处理的方法commonmethod,例如记录异常日志,邮件通知,短信队列等。该类的主要作用是让系统中其它熔断器实现动态调用的方法;方法体中可以传入日常信息等参数。
s20:定义业务模块远程调用的接口userclient。
该接口的方法根据业务功能不同进行定义;例如用户模块中存在新增、删除、修改、查询功能,则该接口可以增加adduser、deluser、updateuser、listuser等方法。
本步骤中,具体可以分为以下两步:
s21:定义业务模块的熔断器处理实现类userhystrix。
熔断器的处理机制可根据userclient的复杂度进行调整;如果熔断器不进行单独的处理,本发明会自动通过basehystrix的commmethod方法进行处理。
例如:删除用户的熔断处理方法,除了邮件通知外,需要记录操作的详细信息,并把邮件抄送给关系人。在本发明的熔断器中,可以用deluser方法,该方法名需与userclient的deluser方法名一致。
s22:设置userclient的熔断器为userhystrix。
结合springcloud的框架,需要在userclient的feignclient标签设置fallback=userhystrix.class。
s30:实现动态方法关系实现类hystrixutil。
该实现类需要继承basehystrix方法,这样即可在动态方法里调用basehystrix的commonmethod方法。在springcloud容器启动时,会通过hystrixuitl的init方法进行熔断器的初始化。初始化方法主要实现根据userclient的业务方法,动态增加userhystrix的熔断方法。
图2是本发明hystrixutiil处理流程示意图;其基本流程是:
实现hystrixutil的createmethod方法,该方法需要传参几个重要参数,分别为待创建方法的类和待创建方法的名。在createmethod方法中,通过ctmethod动态创建该方法;而方法体内,直接调用commonmethod方法即可。
首先hystrixutil的init方法中,根据feign,获取userclient的所有方法列表clientmethodlist。
其次,根据userclient在feignclient标签中设置的fallback,获得该业务的熔断处理类userhystrix,并获得该类的方法列表hystrixmethodlist。
循环clientmethodlist列表,判断hystrixmethodlist中,是否存在同名的方法;如果存在,则直接跳过;如果不存在,则直接调用createmethod方法;并将userhystrix类、方法名传入方法中;在userhystrix类中,创建与clientmethodlist同步的方法。
本发明通过以上动态实现的方式可动态实现熔断器。