所用到的项目,请参考这里
Hystrix
熔断器
2020-05-20 16:19:37
简介
1)、分布式系统面临的问题
复杂分布式体系结构中的应用程序 有数10个依赖关系,每个依赖关系在某些时候将不可避免地失败
2)、是什么?
Hystrix是一个用于处理分布式系统的延迟
和容错
的开源库 ,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,
Hystrix能够保证在一个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
。
“断路器”本身是一种开关装置, 当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常
,
这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
3)、能干嘛?
- 服务降级
- 服务熔断
- 接近实时的监控
- 。。。等等等限流,隔离
4)、官网
https://github.com/Netflix/hystrix/wiki
5)、Hystrix官网宣告,停止更新和维护
https://github.com/Netflix/hystrix
- 被动修复bugs
- 不再接受合并请求
- 不再发布新版本
重要概念
2020-05-21 09:53:50
关于Hystrix笔试会考,面试会问的理念。
1 | 》》》服务降级 |
问题演示
Hystrix问题演示
1)、Hystrix8001环境搭建
2)、浏览器请求测试
先启动7001,7002,再启动 Hystrix8001 。
访问正常的,立即响应。访问超时的,等待3s响应。
3)、JMeter测试
同样,先启动7001,7002,再启动 Hystrix8001 。
上述在非高并发情形下,还能勉强满足。下面我们JMeter测试访问8001的超时接口,200并发持续访问60s 。
问题
:会出现转圈圈,延迟的现象。因为SpringBoot内嵌Tomcat,线程池数量只有10,所以空不出来线程进行接口处理。
这还只是服务提供者8001自己测试,假如此时外部的消费者80也来访问,那消费者只能干等,最终导致消费端80不满意,服务端8001直接被拖死
4)、Hystrix80请求加入
5)、浏览器请求测试
先启动7001,7002,再启动8001,80
8001访问正常的,立即响应。访问超时的,等待3s响应。
80调用正常的,立即响应。调用超时的,会直接出错,因为Feign默认调用等待1s。会超时。
6)、JMeter测试
先启动7001、7002,再启动8001、80,再启动上面我们设置的60秒持续200并发调用8001的超时接口。
此时,8001访问正常接口、超时接口,80调用正常接口,都会有延迟的现象出现。浏览器转圈圈。
时不时,80调用正常接口的时候还会出现超时的现象。
7)、总结
1 | 》》》故障和导致现象 |
降级
服务降级超时或异常了,有一个兜底的。例如返回一个”服务器繁忙或异常,请稍后再试“
1)、提供者8001
通过fallback来兜底
2)、测试8001
注意:如果显示的是fallback方法,那么80调用的时候也是显示fallback方法。80只看你这个调用会不会超过1秒,不管你返回的那个方法。
3)、消费者80
4)、测试80
这里的超时是指,此Controller方法超时,但是,feign调用接口是默认1秒,所以会报错,从而返回fallback方法。
5)、全局服务降级
目前问题:每个业务方法对应一个兜底的方法,代码膨胀。统一和自定义的分开
》》》方法1:@DefaultProperties@HystrixCommand
会使用自己的属性,自己没有的,会使用@DefaultProperties
中的属性。
》》》方法2:@FeignClient指定fallback
调用服务超时,或服务不存在,就进行降级。
熔断
服务熔断
1)、断路器
一句话就是家里的保险丝
2)、熔断是什么?
功率大了就熔断,注意,功率恢复正常,它还能恢复。
3)、演示实例,修改8001
4)、原理,小总结
》》》什么情况下起作用
》》》断路器开启或者关闭的条件
- 当满足一定的阈值的时候(默认10秒钟超过20个请求次数),断路器将会开启
- 当失败率达到一定的时候(默认10秒内超过50%的请求次数),断路器将会开启
- 当开启的时候,所有请求都进入fallback方法
- 一段时间之后(默认5秒),这个时候断路器是半开状态,会让其他一个请求进行,如果成功,断路器会关闭,若失败,继续开启。
- 重复3和4
》》》断路器打开之后
》》》@HystrixProperty
所有配置
限流
服务限流
因为Hystrix不太好,所以后面高级篇讲解Alibaba的Sentinel说明
工作流程
Hystrix工作流程
https://github.com/Netflix/Hystrix/wiki/How-it-Works
1)、步骤说明
2)、官网流程图
服务监控
HystrixDashboard服务监控
1)、概述
2)、Hystrix Dashboard 9001 搭建
3)、HystrixDashboard案例演示
先启动7001,7002,再启动9001,8001,再输入对应地址
4)、怎么看图形化界面
》》》七色,一圈,一线
》》》具体含义解释
5)、一张复杂的HystrixDashboard图
Zuul
路由网关
2020-05-21 15:50:29
例如:每个医院都有一个分诊台作为网关。
不好,被淘汰了,没有Gateway好。就不讲解了。
1 | zuul路由网关 |
Gateway
新一代网关
2020-05-21 15:52:48
例如:每个医院都有一个分诊台作为网关。
简介
1)、是什么?
》》》一句话概述:SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
2)、能干嘛?
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
- …
3)、微服务架构中网关在哪里?
4)、有Zuul了怎么又出来Gateway?
》》》我们为什么选择Gateway?
- netflix不太靠谱,zuul2.0一直跳票,迟迟不发布
- SpringCloud Gateway具有如下特性
- SpringCloud Gateway与Zuul的区别
》》》Zuul 1.x模型
》》》Gateway模型
WebFlux是什么?
https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux
三大核心概念
Route(路由)
》路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由
Predicate(断言)
》参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤)
》指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.
总结:
Gateway工作流程
》》》官网总结
》》》核心逻辑路由转发 + 执行过滤器链
两种路由方式
》》》方式一
在配置文件yaml中配置
1)、新建Gateway 9527模块
2)、测试
先启动7001、7002,再启动8001,最后启动9527
总结:访问http://localhost:9527/payment/get/1
,符合URI规则/payment/get/**
,进而访问http://localhost:8001/payment/get/1
》只是套了一层壳子。这样就可以不让别人知道我们的8001端口。
》》》方式二
代码中注入RouteLocator的Bean
动态路由
默认情况下Gatway会根据注册中心注册的服务列表, 以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
关于yml配置:需要注意的是uri的协议lb,表示启用Gateway的负载均衡功能.
Predicate断言
1)、是什么?
启动我们的gateway9527会发现
2)、上面图中的RoutePredicateFactories这个是什么东东?
3)、常用的Route Predicate
- After Route Predicate
时间格式使用:ZonedDateTime.now() - Before Route Predicate
- Between Route Predicate
- Cookie Route Predicate
Cookie Route Predicate需要两个参数,一个是Cookie name ,一个是正则表达式。
路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行 - Header Route Predicate
两个参数: 一个是属性名称和一个正则表达式, 这个属性值和正则表达式匹配则执行。 - Host Route Predicate
- Method Route Predicate
- Path Route Predicate
上面已经提到 - Query Route Predicate
- RemoteAddr Route Predicate
- Weight Route Predicate
- 总结
说白了,Predicate就是为了实现一组匹配规则, 让请求过来找到对应的Route进行处理
》》》常用的匹配规则
Filter过滤
1)、是什么?
2)、Spring Cloud Gateway的filter
- 生命周期
》pre 类似前置通知
》post 类似后置通知 - 种类
》GatewayFilter 单一过滤 官方文档 gatewayfilter-factories
》GlobalFilter 全局过滤 官方文档 global-filters
3)、常用的Gateway Filter
…
4)、自定义全局过滤器
》》》能干嘛?
- 全局日志记录
- 统一网关鉴权
- …
》》》代码实现【实现两个接口 implements GlobalFilter, Ordered
】