Hystrix,Gateway

所用到的项目,请参考这里

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
》》》服务降级
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
哪些情况会发出降级
程序运行异常
超时
服务熔断触发服务降级
线程池/信号量也会导致服务降级

》》》服务熔断
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
就是保险丝
服务的降级->进而熔断->恢复调用链路

》》》服务限流
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

问题演示

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
》》》故障和导致现象
8001同一层次的其他接口被困死,因为tomcat线程池里面的工作线程已经被挤占完毕
80此时调用8001,客户端访问响应缓慢,转圈圈


》》》上述结论:正因为有上述故障或不佳表现,才有我们的降级/容错/限流等技术诞生


》》》如何解决?解决的要求
1.超时(转圈导致服务器变慢):超时不再等待【返回服务器繁忙请稍后再试】
2.出错(宕机或程序运行出错):出错要有兜底【像是if else分支中的else分支】
3.解决
对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须有服务降级
对方服务(8001)down机了,调用者(80)不能一直卡死等待,必须有服务降级
对方服务(8001)ok,调用者(80)自己有故障或有自我要求(自己的等待时间小于服务提供者)

降级

服务降级
超时或异常了,有一个兜底的。例如返回一个”服务器繁忙或异常,请稍后再试“

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)、原理,小总结

》》》什么情况下起作用
在这里插入图片描述

》》》断路器开启或者关闭的条件

  1. 当满足一定的阈值的时候(默认10秒钟超过20个请求次数),断路器将会开启
  2. 当失败率达到一定的时候(默认10秒内超过50%的请求次数),断路器将会开启
  3. 当开启的时候,所有请求都进入fallback方法
  4. 一段时间之后(默认5秒),这个时候断路器是半开状态,会让其他一个请求进行,如果成功,断路器会关闭,若失败,继续开启。
  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
2
3
4
5
6
zuul路由网关
概述描述
路由基本配置
路由访问映射规则
查看路由信息
过滤器

Gateway

新一代网关
2020-05-21 15:52:48

例如:每个医院都有一个分诊台作为网关。

简介

1)、是什么?
在这里插入图片描述

》》》一句话概述:SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
在这里插入图片描述

2)、能干嘛?

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

3)、微服务架构中网关在哪里?
在这里插入图片描述

4)、有Zuul了怎么又出来Gateway?

》》》我们为什么选择Gateway?

  1. netflix不太靠谱,zuul2.0一直跳票,迟迟不发布
    在这里插入图片描述
  2. SpringCloud Gateway具有如下特性
    在这里插入图片描述
  3. 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

  1. After Route Predicate
    时间格式使用:ZonedDateTime.now()
    在这里插入图片描述
  2. Before Route Predicate
  3. Between Route Predicate
  4. Cookie Route Predicate
    Cookie Route Predicate需要两个参数,一个是Cookie name ,一个是正则表达式。
    路由规则会通过获取对应的Cookie name值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行
    在这里插入图片描述
  5. Header Route Predicate
    两个参数: 一个是属性名称和一个正则表达式, 这个属性值和正则表达式匹配则执行。
    在这里插入图片描述
  6. Host Route Predicate
    在这里插入图片描述
  7. Method Route Predicate
    在这里插入图片描述
  8. Path Route Predicate
    上面已经提到
  9. Query Route Predicate
    在这里插入图片描述
  10. RemoteAddr Route Predicate
  11. Weight Route Predicate
  12. 总结
    说白了,Predicate就是为了实现一组匹配规则, 让请求过来找到对应的Route进行处理
    》》》常用的匹配规则
    在这里插入图片描述

Filter过滤

1)、是什么?
在这里插入图片描述

2)、Spring Cloud Gateway的filter

  1. 生命周期
    》pre 类似前置通知
    》post 类似后置通知
  2. 种类
    》GatewayFilter 单一过滤 官方文档 gatewayfilter-factories
    》GlobalFilter 全局过滤 官方文档 global-filters

3)、常用的Gateway Filter

4)、自定义全局过滤器

》》》能干嘛?

  • 全局日志记录
  • 统一网关鉴权

》》》代码实现【实现两个接口 implements GlobalFilter, Ordered
在这里插入图片描述