一、Hystrix

什么是Hystrix?

在分布式环境中,不可避免地会有许多服务依赖项失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止跨服务的级联故障并提供回退选项来实现这一点,所有这些都可以提高系统的总体弹性。

Hystrix的历史

Hystrix是从Netflix API团队2011年开始的弹性工程工作中发展而来的。2012年,Hystrix继续发展和成熟,Netflix的许多团队都采用了它。如今,Netflix每天通过Hystrix执行数百亿个线程隔离调用和数千亿个信号量隔离调用。这在正常运行时间和恢复力方面带来了显著的改善。


Hystrix是干什么用的?

Hystrix被设计用来做如下事宜:

  1. 保护和控制通过第三方客户端库访问的依赖(通常是通过网络)的延迟和失败。
  2. 停止复杂分布式系统中的级联故障。
  3. 快速熔断和迅速恢复
  4. 回退并尽可能优雅地降级。
  5. 启用近实时监视、警报和操作控制。    

Hystrix解决了什么问题?

复杂分布式体系结构中的应用程序有许多依赖项,每个依赖项都不可避免地会在某个时候失败。如果主机应用程序不能与这些外部故障隔离,则有可能随这些故障一起停机。
例如,对于一个依赖于30个服务的应用程序,其中每个服务有99.99%的正常运行时间,以下是您可以预期的情况:

99.9930 = 99.7%正常运行时间
10亿请求中的0.3% = 300万次失败
2+小时停机/月,即使所有依赖有优秀的正常运行时间。

现实通常更糟。

即使在所有依赖项都表现良好的情况下,如果您不为弹性设计整个系统,那么即使0.01%的停机时间对几十个服务中的每一个服务的总体影响也相当于每月潜在的停机时间数小时。

当一切正常时,请求流可以是这样的:

当许多后端系统之一成为潜在的,它可以阻止整个用户的请求:



在高流量的情况下,单个后端依赖项的潜在影响可能会导致所有服务器上的所有资源在几秒钟内饱和。

应用程序中通过网络或进入客户端库可能导致网络请求的每一点都是潜在故障的根源。比故障更糟糕的是,这些应用程序还会导致服务之间的延迟增加,从而备份队列、线程和其他系统资源,从而在整个系统中导致更多的级联故障。

当通过第三方客户端执行网络访问时,这些问题会更加严重——这是一个“黑盒”,其中隐藏了实现细节,可以在任何时候更改,并且每个客户端库的网络或资源配置不同,通常很难监控和更改。

更糟糕的是,传递依赖项在不被应用程序显式调用的情况下执行潜在的昂贵或容易出错的网络调用。

网络连接失败或降级。服务和服务器失败或变慢。新的库或服务部署会改变行为或性能特征。客户端库有bug。

所有这些都表示需要隔离和管理的失败和延迟,这样单个失败依赖项就不能破坏整个应用程序或系统。

Hystrix的设计原则是什么?

  1. 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
  2. 减少负载和快速失败,而不是排队。
  3. 在可行的情况下提供回退,以保护用户避免失败。
  4. 使用隔离技术(如舱壁、泳道和断路器模式)来限制任何依赖项的影响。
  5. 通过接近实时的度量、监视和警报优化发现时间
  6. 通过配置更改的低延迟传播和对Hystrix大多数方面的动态属性更改的支持来优化恢复时间,这允许您使用低延迟反馈循环进行实时操作修改。
  7. 保护整个依赖客户端执行中的失败,而不仅仅是在网络流量中。
     

 Hystrix是如何实现其目标的?

  1. 将对外部系统(或“依赖项”)的所有调用包装在HystrixCommand或HystrixObservableCommand对象中,该对象通常在单独的线程中执行(这是命令模式的一个示例)。
  2. 超时调用的时间长于您定义的阈值。有一个默认值,但是对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以便它们比每个依赖项的99.5%的性能略高。
  3. 为每个依赖项维护一个小的线程池(或信号量);如果它已经满了,针对该依赖项的请求将立即被拒绝,而不是排队。
  4. 度量成功、失败(客户端抛出的异常)、超时和线程拒绝。
  5. 断开断路器,以在一段时间内停止对特定服务的所有请求,如果服务的错误百分比超过阈值,则手动或自动停止。
  6. 在请求失败、被拒绝、超时或短路时执行回退逻辑。
  7. 几乎实时地监视度量和配置更改。

 当您使用Hystrix包装每个底层依赖项时,上面图表中所示的体系结构将发生变化,类似于下面的图表。每个依赖项都是相互隔离的,当延迟发生时,依赖项所占用的资源受到限制,并且在决定当依赖项中发生任何类型的故障时应作出何种响应的回退逻辑中进行了介绍:

 

天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。本课程是一门专业的Java微服架构开发实战课程,主要讲解了当下流行的SpringBoot框架、SpringCloud架构以及与第三方技术整合开发实战内容。通过本课程的学习,能够理解并掌握SpringBoot的基础知识,同时能够掌握SpringBoot与常用的第三方技术整合实现实际开发中的业务需求,包括实现Web开发、数据访问、缓存管理、安全管理、消息服务、任务管理等;了解并掌握SpringCloud微服务架构的基础知识及相关组件的应用,掌握微服务架构在企业级开发的实践,建立起微服架构思想。项目技术栈:采用SpringBoot简化商城系统的初始搭建以及开发过程采用SpringMVC+Spring+IBatis完成项目的整合采用Mysql作为数据库存储,Druid配置数据库连接池采用SpringCloud+Netflix 微服务技术栈的实战开发使用Redis完成缓存的数据存储,搭建Redis搭建主从、哨兵、集群应用,保证Redis的高可用使用ElasticSearch全文检索系统进行商品数据搜索,使用ElasticSearch搭建搜索服务的高可用使用Ngnix实现页面动静分离与负载均衡的配置采用FastDFS文件储存系统文件存储,完成广告图片、商品图片的上传和存储系统使用采用CAS+shiro单点登录系统实现用户认证使用ECharts根据后台查询数据生成图表使用POI实现了商城盈利状况的Excel表格导出。商品的详情页使用Thymeleaf完成页面静态化,减少页面数据展示延迟项目中使用SpringBoot下的Aop + 自定义注解完成用户行为记录,日志采集后台管理系统使用Shiro实现登录验证和权限管理(超级管理员、管理员、产品编辑员)项目整合微信完成订单的支付使用Redission完成分布式锁,生成订单的编号使用SpringCloud Alibaba Seat完成下订单模块的分布式事务(新增订单表,库存减少,库存超卖设计)使用RabbitMQ 做消息队列,完成订单未支付自动取消和模块直接的解耦合使用Quartz任务调度,完成缓存的定时刷新,保证缓存的一致性使用本地消息表机制完成消息然队列RabbitMQ消息可靠性传输订单支付模块使用微信扫码支付,并设置订单超时自动取消通过Jquery实现前端校验,通过基于Hibernate的Valida注解实现后端的校验功能使用Base64编码对Json数据传输进行编码和解码项目使用RESTful设计风格实现资源的访问,实现前后端分离项目使用聚合数据第三方短信平台完成用户的登陆功能项目使用SpringBoot整合JavaMail完成邮件的发送项目使用SpringBoot整合Swagger2生成接口文档使用PostMan完成接口的测试项目的测试:SpringTest、dbunit、EasyMock使用Docker 进行应用的自动化打包和发布、自动化测试和持续集成、部署和调整其他应用使用 PowerDesigner,完成数据库的建模项目使用禅道进行BUG管理环境采用Maven实施多模块项目构建,采用Git进行项目版本管理 架构解读:  项目部分截图:              讲义部分截图:          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值