实际业务场景下服务快速失败实战
1. 前言
我们知道,服务快速失败分为普通版本和断路器版本。在本节中,我将继续为大家介绍,在真实业务场景下的,服务快速失败的应用方法及代码实现。
本节主要内容:
-
服务快速失败真实业务场景描述;
-
业务场景实现思路分析与实操。
2. 服务快速失败真实业务场景描述
业务场景描述
我们继续以某大厂的用户注册服务为例,只不过所在的业务场景发生了变化。
有这样一个真实的业务场景,在用户请求用户注册服务时,该服务要求用户上传自己的注册头像,在单体项目架构下,我们上传多次头像都没有任何问题,服务可以正常的进行。但是,将我们把项目架构进行演进,项目由单体架构演变为了微服务的分布式架构之后,时不时地会出现因为用户注册头像上传失败而导致整个用户注册服务无法继续进行的情况。
问题原因分析
在解决问题之前,我们首先来分析一下这种问题产生的原因。
当项目架构由传统的单体架构演变为基于微服务的分布式架构之后,我们需要处理很多由于微服务架构所带来的已知问题,在将这些已知问题处理好后,我们的项目才能正常运行,而上述业务场景中的问题就包括在这些已知问题中,下面我们来介绍一下问题产生的原因(至于其他已知问题,这里不做介绍)。
无论是传统的用户注册服务,还是分布式的用户注册服务,其用户注册处理逻辑都大同小异。在处理用户注册逻辑时,一般会将用户注册头像上传的业务逻辑与用户注册的处理逻辑相分离,即将用户注册头像上传作为一个单独的服务存在,同时用户注册的处理逻辑也作为一个单独的服务接口。
当正式调用用户注册服务时,会对用户注册头像上传服务做一个校验,如果用户成功上传了所注册的头像,那么用户注册头像上传服务会返回一个头像地址,并且在最后的用户注册逻辑中,将该地址与当前注册的用户相关联,这就完成了整个用户注册的流程。
上述业务场景的问题就出现在用户注册头像上传服务中,当外界因素或者由于我们处理用户注册头像格式时的处理逻辑不严谨时,就会出现用户注册头像上传失败的情况, 其中,由处理逻辑不严谨所引起的错误可以直接通过修改源码逻辑来规避这种错误,但是由外界因素所引起的错误就不好规避了。
由外界因素引起的错误,可能是项目所在服务器网络波动的影响,也可能是各微服务所在节点间数据通信丢失或堵塞的影响,也可能是没有对分布式事务做处理的影响。
我们不需要知道这种错误具体是由于什么外界因素所引起的,我们只需要关心,在外界因素对服务造成影响时,我们有兜底的解决方案即可。那么接下来就让我们来看一下如何设计这个兜底的方案。
3. 业务场景实现思路分析与实操
实现思路分析
鉴于上述业务场景中所描述的问题,我们可以在用户注册头像上传服务中,添加对服务快速失败的支持,接下来让我们来看一下如何操作。
在为用户注册头像上传服务配置了快速失败之后,当服务再次受到外界因素影响时,用户注册头像服务会返回一个兜底的地址,并将该地址与当前注册的用户相关联,之后,用户可以在个人中心修改自己的注册头像,直到注册头像上传成功为止。
实操
我们需要先在项目的启动类上,配置 Hystrix 的断路器:
@EnableHystrix
@EnableHystrixDashboard
@EnableCircuitBreaker
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
代码解释
第 3 行,我们通过在项目启动类上添加 EnableCircuitBreaker 注解,来启动 Hystrix 的断路器,这是在真实项目中使用快速失败的前提,如果没有在项目中打开断路器,则项目中就不会存在服务快速失败的概念。
接着,我们来配置用户注册头像上传服务:
@RequestMapping("upload_user_icon.do")
@ResponseBody
@HystrixCommand(fallbackMethod = "uploadUserIcon_failed")
public CommonResponse<String> uploadUserIcon(@Param("userIcon") MultipartFile file){
return userService.uploadUserIcon(file);
}
public CommonResponse<String> uploadUserIcon_failed(){
// 在用户注册头像上传失败后,返回项目临时头像地址,并提示用户
}
代码解释
此段代码和我们上节中的服务容错与降级的配置相似,唯一不同的是,当用户注册头像上传服务无法正常处理时,会访问 uploadUserIcon_failed 方法,且返回一个临时的头像地址,并提示用户注意。
在经过上述配置之后,当用户注册头像上传服务无法正常处理时,通过返回这个兜底的临时头像地址来满足整体的用户注册服务的业务需要,保证了用户注册服务的继续进行。
Tips: 我们在介绍服务快速失败时,是将普通版本的和断路器分开进行的介绍,因为是两个不同的版本,但是在实际项目中,往往会结合这两个版本共同使用,这样才能充分发挥服务快速失败的作用。
4. 小结
本小节以一个真实业务场景下的服务,为大家介绍了如何在真实业务场景下配置 Hystrix 的服务快速失败,并且做了代码实操,针对容易出现问题的地方,也做了注意事项的补充,希望同学们可以对真实业务场景下,服务快速失败的应用方法有所了解。