开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 :2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/60/detail/1090
2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级
内容简介
一、Java Spring Cloud 熔断限流
二、Java Spring Cloud 熔断限流实战
三、总结
本节课继续讲解 Spring Cloud 微服务 Java,设计与实战系列课程,主要是学习如何熔断降级和限流。
上节课讲过 Hystrix 做启动监控面板并进行数据的采集,也讲到了一些在实战中所遇到的“坑”,在2·3版本后在默认的安全性方面做了加强,比如:不能私自请求监控隧源,是需要经过特殊的商务设置,需要允许监控面板链接某个隧源才行,此参数在当时已经进行过演示。
一、Java Spring Cloud 熔断限流
1、熔断是对于高频发系统,为了保证高可用时采用的重要措施。
(1)详解:
拿淘宝的双十一举例,xxx如果做了一个高频发系统,在服务器集群理论上,是支持每秒一万的变化,在双十一时,如果流量超过一万将近两万时,xxx并不希望系统直接瘫痪或服务器全部崩溃,此时应该做保护措施,这种保护措施指的是,带保险丝在照明系统里安装了很重要的安全开关;起到的作用是,在电路超负荷运行时,会自动跳匝的安全措施,这个概念可以直接引用到 Spring Cloud 里。
(2)如果xxx关注过其他分布式框架,阿里巴巴在早期已经实现了熔断和限流机制,这种现象在淘宝双十一时体现的比较明显,xxx对之前参加的双十一活动还有印象的话,在当时淘宝的服务器比较卡顿,京东也是如此。为什么会出现这种现象?因为这些电商公司在早期没有经历过如此高规模的变化流量,在12306火车网站也是一样的,现在的限流不会让服务器瘫痪,相比瘫痪时xxx可以去处理其中一半的请求,这种场景在生活中经常看到,比如在上海实行的高峰时间限行,这些都是限流措施,限流措施是施剥离一些请求,并保护服务器,使服务器能够熟悉并以较低的并发,来进行正常的处理。
2、Netflix Hystrix
(1).Netflix 发布了 Hystrix 熔断器框架,保护系统
(2).通过控制那些访问远程系统、服务和第三方库的节点
(3).从而对延迟和故障提供更强大的容错能力
(4).Fallback 灾备操作,出错以后返回的值
(5). Hystrix 中,主要通过线程池来实现资源隔离
(6). Hystrix 的信号模式(Semaphores)来隔离资源
(7).Hystrix 支持 dashboard 控制面板和监控信息
(8). Feign 可以和 Hystrix 结合使用,也可以独立使用
(9). Hystrix 使用了命令模式,对命令对象抽象了两个抽象
类似: Hystrix Command 和 Hystrix Observable Command 。
①详解:
有一技术叫 Hystrix,Hystrix 有控制面板、监控面板和采集数据,数据的采集和熔断、降级限流有关,熔断之后,便可降级,比如之前的并发有一千,现在可以降到五百,起到了限流保护的作用。这是最重要的工作之一,前提是xxx需要监控到请求数据。前期也需要衡量标准,要知道并发能达到多少,比如在并发达到一万,可以自动中断,这种措施在 Hystrix 里已经提供。
②在底层 Hystrix 本身喜欢各个工作做到自动隔离工作,因为每个服务器后台的压力不一样,在订单服务里有一百台服务器,但在登录服务器时,或许只有五台,自动服务有五十台,这个差距较大,这是微服务很重要的特点,每个服务器都有差异,xxx才会搞拆分性质。
3、断路器模式
详解:
一般流动性放在代理层当中做,如果没有代理,也可以在电路中,都可以实现类似机制。
二、Java Spring Cloud 熔断限流实战
1、实战直接给xxx看几个 Hystrix 核心参数
(1)请求最大次数
circuit Breaker. request Volume Threshold
(默认值:20个请求)
(2)滚动窗口
metrics .rolling Stats. time ln Milliseconds
(默认值:10秒)
(3)失败百分比
circuit Breaker. error Threshold Percentage
(默认值:>50%)
详解:
xxx可以基于什么策略,来进行限流,比如基于最高并发,最大并发量是五万,此时可以进行削峰;如果出错较多,可以断掉请求,再发请求便会产生更多错误,如当出错率达到百分之九十时,启动自动熔断;当调动时间超过十秒,就不再进行请求调动,因为调动链太长,对客户端没有太大意义,调动链太长,某一环节是存在一定错误的,例如数据库、检索或者是缓存检索出现问题,或者是代码出现大面积的阻止请求,都有可以出现问题,这些参数很重要。
2、接下来在昨天的项目基础上进行改变
(1)希望某个服务接口如果调用超时,能出现熔断;可以在以下代码中直接加入多个助解
代码如下:
// timeout In Milliseconds:设置熔断超时的时间
@HystrixCommand(fallbackMethod = "fallback Method", command Properties ={
@HystrixProperty(name = "execution .isolation. thread. timeout In Mi1liseconds", value = "2000"
})
详解:
改变熔断限流的代码,主要是模拟熔断,xxx以后可以在代理层做,熔断主要是在调用端进行操作的,xxx的调用端是没有任何熔断机制和降低措施。昨天只做了监控,现在需要添加助解的代码。
(2)模拟 fallback 降低方法
代码如下:
//微服务 Fallback 熔断降级
public String fallback Method(){
return "Spring Cloud 微服务 Fallback 熔断降级";
}
详解:
在熔断之后给客户端返回错误信息,或者是日志,有可能是返回另一个结果,告诉用户在几分钟之后再尝试,这样可以把压力往后推,体现的是统计规则,比如统计错误发生数量或接收服务器调动的时间,作为触发条件,可以给出补救措施,给出备胎 fallback 降低方法。可以是独立方法,用于给客户端返回提出信息,还可以打日志和调用一次信息。
3、模拟服务器超过两秒就被驱除
(1)服务1里加 thread sleep(3000)
代码如下:
@RequestMapping( " / hello")
public string get order() throws Interrupted Exception {
Thread. sleep( 3000) ;
return "Hello Spring Cloud 1";
}
详解:
指的是休眠三秒,这样设置可以达到触发条件的要求,这样一定能触发熔断降级。一会实战中,把服务1到服务3,三台机器都启动;先启动数据中心、然后启动微服务,再启动调用端,启动一个服务是可以演示的,但是要避免只启动一个服务不能保证真理,有时调用正常。有时候调用不正常;不正常时会熔断,正常时还会返回。比如xxx有订单服务集群,其他服务返回正常,但是返回的服务1却出错。
4、模拟一个集群
(1)集群也可以在指定端口多启动,为了演示方便,此处直接复制的三个项目。在模拟监控时,需要区分是哪家服务器,启动结果是哪个,可以在三个服务器的字符串后面加上1、2、3来区别。现在打开 lo call host:8761里面查看服务是否上限,如图:
已经有两台服务器了,正常是三个服务器,三个服务器全部显示在页面,其中一号服务器是超时三秒。
(2)接下来启动调用服务,此时不再需要监控,在 lo call host:8761页面刷新等待结果,如图:
Status 已经出结果,需要经过 lo call host:9002来调用,通过 lo call host:9002/hi 调用不会触发请求,通过 lo call host:9002/test 调用才会触发,因为没有对 hi 进行熔断超时时间的设置。
①通过 lo call host:9002/hi 调用结果
Spring Cloud3
②通过 lo call host:9002/test 调用结果
Spring Cloud2
Spring Cloud3
Spring Cloud 微服务 Fallback 熔断降级
详解:
在调到 Spring Cloud1 时,触发到了微服务的熔断降级,触发了熔断并降级了备胎方案,这是触发了超时的熔断策略。
三、总结
这个过程只放了一个条件,还有几个其他条件,比如最大并发,设置的数字太大;错误比例,能达到百分之九十;控制休眠窗口,过几秒之后在恢复正常,这些都是触发条件,可以放在代码里,或者助解里面。一般使用默认条件会出问题,在正常生产条件下,每个公司的服务变化和发展是不一样的,服务器的配置也是不一样的,所以限流设置要根据业务和架构设置的目标进行灵活调整。主要的目的是为了增加可用性,xxx都希望高频发,但不是什么时候都有高频发,机器的服务器也有自己的天花板或者瓶颈,因此根据实际可以配置保护值,来保护xxx的系统。
下节课会继续讲微服务、代理、安全和机制,xxx有空时可以了解下有哪几个衡量指标和监控指标,所采用的隔离方式是什么,有空可以去看看源码,看如何实现。