Spring cloud 之熔断机制
前面讲过 Spring cloud 之多种方式限流(实战)来处理请求频繁的压力。大家都知道,多个微服务之间调用的时候,假设微服务 A 调用微服务 B 和微服务 C,微服务 B 和微服务 C 有调用其他的微服务,这就是所谓的 扇出,若扇出的链路上某个微服务的请求时间过长或者不可用,对微服务 A 的调用就会占用越来越多的时间以及更多资源,进而引起系统雪崩,即”雪崩效应”。
这个时候,需要一个机制来保证当某个微服务出现异常时(请求反应慢或宕机),其整个流程还是阔以友好滴进行下去。即向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就可以保证调用方的线程不会被长时间、无厘头滴占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。我们把这个机制,或者这种处理方式叫作“熔断器”。
熔断机制是应对雪崩效应的一种微服务链路保护机制,当整个链路的某个微服务异常时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“合理”的响应信息。当检测到该节点微服务正常后恢复调用链路,在Spring cloud 框架机制通过 Hystrix 实现,Hystrix 会监控微服务见调用的状况,当失败的调用到一个阈值,默认是5秒内20次调用失败就会启动熔断机制,熔断机制的注解是 @HystrixCommand。
最近研究了一下 Spring cloud 的熔断机制,特分享一些代码,以及实战中的坑。
在Spring cloud 中,假设有几个微服务:用户管理服务、订单服务、鉴权中心、物流服务等。这时,订单服务中,某个接口请求用户管理服务,这个时候如果需要熔断机制,该怎么处理呢?
首先,订单服务引入依赖:
这个时候,订单服务启动类中需要引用熔断注解 @EnableCircuitBreaker,使其生效:
这里,不要忘记注解 @EnableDiscoveryClient 来相互暴露服务。
最后需要在调用用户管理服务的函数中,加入注解 @HystrixCommand:
其中上面代码需要注意的是:注解中 fallbackMethod 的值指定了熔断后的处理函数,这个函数的参数与
当前的调用方法的参数需要保持一致,否则报错:
最后,配置 Hystrix 相关的参数配置yaml:
其中第一个配置在调用函数中其实也可以配置:
这里配置的3000毫秒生效后,如果配置文件中也配置了,则会被覆盖。
如果不加@HystrixCommand中的commandProperties=@HystrixProperty注解配置,下面的FallBack函数admin_service_fallBack()是一个线程;@HystrixCommand()是一个隔离线程。若加上commandProperties=@HystrixProperty注解配置后,将2个线程合并到一个线程里。
这样到此为止,调用方就结束配置了,至于被调用方,相关配置与源码在Spring Cloud Kubernetes之实战二服务注册与发现 一文中,讲过被调用服务的相关,这里的http://admin-web-service 为被调用服务,则在其服务启动类中需要注解 @EnableDiscoveryClient:
另外,配置 RestTemplate 的 Bean 中加上注解 @LoadBalanced 需要作 LB,这样利用服务名来根据 LB 规则找到对应的其中一个服务,这样比较明显看出 LB 的效果:
最后如果没问题了,可以先暂停用户管理服务,然后运行订单服务时,返回熔断结果:
OK,Spring cloud 熔断实战就结束了!
结束福利
开源实战利用 k8s 作微服务的架构设计代码:https://gitee.com/damon_one/spring-cloud-k8s,欢迎大家 star,多多指教。
关于作者
笔名:Damon,技术爱好者,长期从事 Java 开发、Spring Cloud 的微服务架构设计,以及结合 docker、k8s 做微服务容器化,自动化部署等一站式项目部署、落地。Go 语言学习,k8s 研究,边缘计算框架 KubeEdge 等。公众号 程序猿Damon
发起人。个人微信 MrNull008
,欢迎來撩。
欢迎关注 InfoQ: https://www.infoq.cn/profile/1905020/following/user
关注公众号
版权声明: 本文为 InfoQ 作者【Damon】的原创文章。
原文链接:【http://xie.infoq.cn/article/64334beee8e5b1edb9a5df8f2】。文章转载请联系作者。
评论