【微服务架构】Spring Cloud之Hystrix(三)

一、雪崩效应

  在微服务架构中,由于服务和服务之间可以互相调用,一项工作的完成可能会依赖调用多个微服务模块,但由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪;再加上服务和服务之间的依赖性,瘫痪会迅速传播,给整个微服务系统造成严重的后果,这就是服务故障的“血崩”效应。

服务雪崩效应形成的阶段

1、服务提供者不可用

  • 硬件故障。硬件损坏导致服务器主机宕机,或网络硬件故障造成服务提供者的不可访问。
  • 程序Bug
  • 缓存击穿。一般发生在缓存应用重启,所有缓存被清空时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端,造成服务提供者超负荷运行,引起服务不可用。
  • 用户大量请求

2、重试加大流量

  • 用户重试
  • 代码逻辑重试

3、服务调用者不可用

  • 同步等待造成资源耗尽。同步调用时,产生大量的等待线程占用系统资源。

二、服务雪崩的应对措施

针对造成服务雪崩的不同原因,可以采用不同的应对措施。

1、流量控制

  • 网关限流
  • 用户交互限流,例如:1.采用加载动画,提高用户的忍耐等待时间。2.提交按钮添加强制等待机制等。
  • 关闭重试

2、改进缓存模式

  • 缓存预加载
  • 同步改为异步刷新

3、服务自动扩容

  • AWS的auto scaling

4、服务调用者降级服务

  • 资源隔离。主要是对调用服务的线程池进行隔离。
  • 对依赖服务进行分类。根据具体业务,将依赖服务分为强依赖和弱依赖,强依赖服务不可用会导致当前业务中止,弱依赖服务不可用则不会。
  • 不可用服务的调用快速失败。一般通过 超时机制熔断器 和熔断后的 降级方法 来实现。

三、使用Hystrix预防服务雪崩

3.1、Hystrix的设计原则包括:

  • 资源隔离(不把鸡蛋放在一个篮子里)
  • 熔断器(及时止损)
  • 命令模式

资源隔离

  在一个高度服务化的系统中,一个业务逻辑经常需要依赖多个服务模块,例如下图左,查看商品详情业务需要依赖商品介绍、价格查询、商品评价三个服务模块,调用三个依赖服务会共享商品详情服务的线程池,如果其中某个模块不可用,线程池所有的线程都会因为等待响应而被阻塞,从而造成服务雪崩;

  Hystrix通过为每个依赖服务分配独立的线程池进行资源隔离,从而避免整个服务雪崩。如下图右,即便某个服务模块出错,只会导致分配给它的线程处于等待状态,而不影响其他依赖服务的调用。

  这样做带来的代价就是维护多个线程池需要额外的性能开销。

熔断器

  熔断器模式定义了熔断器打开关闭的转换。

  定义一个服务模块的健康状况=请求失败数/请求总数。

  熔断器工作原理,需要设定一个对于服务健康状况的阈值:

  1. 熔断器开关关闭,此时请求可以直接通过熔断器到达后台;
  2. 如果当前服务健康状况高于设定阈值,开关保持关闭,否则,开关转变为打开状态;
  3. 当熔断器开关打开时,请求被禁止通过熔断器,直接返回失败;
  4. 当熔断器开关打开一段时间(熔断器时间窗)后,自动进入半开状态,此时允许一个请求通过,当该请求调用成功,熔断器恢复关闭状态,若该请求失败,继续保持打开状态。

  熔断器的开关能保证服务调用者在调用服务异常的时候,快速返回结果,避免了造成客户端大量的同步等待以及大量无效请求影响系统吞吐量,并且熔断器能在一段时间后自动探测请求执行结果,从而有了恢复服务调用的可能。

命令模式

  Hystrix使用命令模式(继承自HystrixCommand类)来包裹具体的服务调用逻辑(run方法),并在命令模式中添加了服务调用失败后的降级逻辑(getFallback),同时也可以在Command的构造方法中定义当前服务线程池和熔断器的相关参数。

3.2、Hystrix的应对措施

  • 把每个依赖进行隔离,对依赖的调用全部包装成HystrixCommand或者HystrixObservableCommand
  • 对依赖的调用耗时设置阈值,超过阈值直接判定超时
  • 对每个依赖维护一个连接池,如果连接池满直接拒绝访问
  • 评估服务模块的健康状态,超过指定的阈值的话直接熔断处理,对依赖的请求访问直接fallback处理(由开发者自己实现)
  • 熔断生效后,时间窗后放出一个请求探测,决定是否要恢复服务
  • 近乎实时生效

3.3、Hystrix的内部处理逻辑

  1. 构建Hystrix的Command对象, 调用执行方法.
  2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
  3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
  4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.
  5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
  7. 若服务执行成功, 返回正常结果.
  8. 若服务降级方法getFallback执行成功, 则返回降级结果.
  9. 若服务降级方法getFallback执行失败, 则抛出异常

原文地址:https://www.cnblogs.com/iUtopia/p/11510371.html

时间: 2024-10-09 10:52:46

【微服务架构】Spring Cloud之Hystrix(三)的相关文章

构建微服务架构Spring Cloud:服务注册与发现(Eureka、Consul)

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.

构建微服务架构Spring Cloud:分布式配置中心

Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息.加密/解密信息等访问接口:而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息.Spring Cloud Conf

构建微服务架构Spring Cloud:服务消费(Feign)

Spring Cloud Feign Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定.它具备可插拔的注解支持,包括Feign注解.JAX-RS注解.它也支持可插拔的编码器和解码器.Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现. 下面

构建微服务架构Spring Cloud:服务消费(基础)

使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient.这里我们即将介绍的LoadBalancerClient等.对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过,Spring Cloud做这一层抽象,很好的解耦了服务治理体系,使得我们可以轻易的替换不同的服务治理设施. 从LoadBalancerClient接口的命名中,我们就知道这是一个负载均衡客户端的抽象定义,下面我们就看看如何

详解微服务:Spring Cloud原理及核心

研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效.分布式.容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用. Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基

[转帖]微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务 http://skaka.me/blog/2016/08/03/springcloud2/ AUG 3RD, 2016 10:09 PM | COMMENTS 之前介绍过微服务的概念与Finagle框架, 这个系列介绍Spring Cloud. Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Du

2.微服务开发框架——Spring Cloud

                 微服务开发框架-Spring Cloud 2.1. Spring Cloud简介及其特点 简介: Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具 (例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统 的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服 务和应用程序.他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电 脑,裸机数据中心,以及Cloud Found

微服务选择Spring Cloud还是Dubbo?

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书. --异步小编 在阿里巴巴的生态中,微服务逐渐成为主要的服务形态,伴随着容器化的日臻成熟,大量的分布式.领域驱动设计的微服务被快速开发和部署,服务间呈现出搭积木的能力,使不同的业务通过重新组合数个微服务,就能实现新的业务场景.借助成熟的底层集团中间件,天然地支持微服务所需的动态扩缩.服务发现.全链路日志分析等能力.以阿里巴巴达摩院语音对话平台为例,对话服务.理解服务.问答服务,以及对话

微服务框架-Spring Cloud简介(一)

Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案. Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring Boot开发框架的集成. Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全居琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Clo

(一)整合spring cloud云服务架构 - Spring Cloud简介

Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署.Spring Cloud将目前比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂.易部署和易维护的分布式系统架构平台. Spring Clou