简介
为了更好地支撑日益增长的庞大业务量,我们常常需要把服务进行整合、拆分,使我们的服务不仅能通过集群部署抵挡流量的冲击,又能根据业务在其上进行灵活的扩展。随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构也因其特有的优势而备受关注。微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题。对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互。
本系列讲述了在阿里云Kubernetes容器服务基础之上,如何快速搭建基于Spring Cloud的微服务架构中的基础设施:
- 第一篇:分布式服务注册与发现系统
- 第二篇:分布式配置管理系统
- 第三篇:API网关服务Zuul 系统
- 第四篇:分布式追踪系统
- 第五篇:分布式弹性服务与容错处理框架Hystrix及其监控仪表板
- 第六篇:熔断器聚合监控Hystrix Turbine
本文是系列中的第五篇,着重介绍分布式弹性服务与容错处理框架Hystrix及其监控仪表板Hystrix Dashboard。
在复杂的分布式 架构的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。
Hystrix 是Netflix开源的一个针对分布式系统的延迟和容错库,由Java写成。
据一个实际系统的故障预测统计,一个依赖30个子服务的系统,由于各种可能的故障因素(如网络抖动等),每个服务基本可以保证99.99%可用。99.99%的30次方约等于99.7%。 这就意味着一亿次请求会有0.3% * 100,000,000 = 300000次失败。换算成时间大约每月有2个小时服务不稳定。
如上所述,随着服务依赖数量的变多,服务不稳定的概率会成指数性提高。
弹性服务与故障处理
弹性服务与容错处理的本质就是指使用命令模式(如HystrixCommand)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。
Hystrix主要从以下几个方面进行架构设计:
弹性服务
- Hystrix可以为分布式服务提供弹性保护,通过命令模式封装调用,来实现弹性保护,继承 HystrixCommand并且实现run方法,就完成了最简单的封装。
- 实现getFallBack方法可以为熔断或者异常提供后备处理方法。
服务降级
- 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认 错误 率阈值为50%,超过将自动运行。
线程池/信号隔离
- 为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
快速解决依赖隔离
- 可配置依赖调用 超时 时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑。
下面讲述一下在阿里云Kubernetes容器服务基础之上,如何快速搭建一套分布式弹性服务与容错处理框架Hystrix及其监控仪表板。
准备Kubernetes环境
阿里云容器服务Kubernetes 1.9.3目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考创建Kubernetes集群。
体验通过应用目录简便部署
点击左侧的应用目录
,在右侧选中ack-springcloud-hystrix
,如下:
点击参数
, 可以通过修改参数配置进行定制化。修改之后,在右侧选择对应的集群、命名空间,指定发布名称,然后点击部署。
几分钟之后,一个挂载了监控仪表板的弹性服务与容错处理框架Hystrix实例就可以创建出来。
体验Hystrix Dashboard
点击左侧的服务
,在右侧点击刚创建的Hystrix服务提供的访问地址,如下所示:
Hystrix的主要作用是会采集每一个HystrixCommand的信息指标,把每一个断路器的信息指标显示的Hystrix仪表盘上。
运行Hystrix仪表板需要在spring boot主类上标注@EnableHystrixDashboard。然后访问/hystrix查看仪表盘,在hystrix客户端应用使用/hystrix.stream监控。
点击服务地址,可以访问到如下的Hystrix Dashboard:
开发微服务并集成Hystrix
本文只介绍单个应用的熔断监控,多应用的聚合将会在下一篇文章中重点介绍。
在使用Spring Boot添加依赖时,需要注意spring-boot-starter-actuator,否则就不能访问hystrix的一些endpoint,如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
发布示例服务,代码具体参阅: https://github.com/AliyunContainerService/spring-cloud-k8s-sample/tree/master/sample-service-hystrix-dashboard
对应的Helm Chart代码具体参阅: https://github.com/AliyunContainerService/spring-cloud-k8s-sample/tree/master/helm-sampleservice-hystrixdashboard
确保服务项目正常启动之后,在命令行中使用ab多次并发访问: ab -n 10000 -c 10 .....
, 如下所示:
打开Hystrix Dashboad仪表板界面,输入调用服务的地址,如 http://{ip-address}:{port}/hystrix.stream
,输入Title名称,就可以看到如下所示的调用情况:
随着API服务被调用,仪表板页面会随时刷新熔断情况相关数据,如下所示:
总结
我们可以利用阿里云Kubernetes容器服务,快速搭建一套分布式弹性服务与容错处理框架Hystrix实例系统,为应用引入和配置Hystrix服务。欢迎大家使用阿里云上的容器服务,快速搭建一套分布式弹性服务与容错处理框架Hystrix,比较简单地集成到自己项目的微服务开发中。