文章目录
- 一、微服务雪崩及解决方法
- 1.1、超时处理
- 1.2、仓壁模式
- 1.3、断路器
- 1.4、限流
- 二、Sentinel
- 2.1、流量控制
- 2.1.1、普通限流
- 2.1.2、热点参数限流
- 2.2、线程隔离
一、微服务雪崩及解决方法
微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。如果有服务提供者发生故障,当前应用的部分业务因为依赖于这些服务提供者,因此也会被阻塞。用户得不到响应,则微服务的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞,微服务支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。
解决雪崩问题的常见方式有四种:
1.1、超时处理
设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
1.2、仓壁模式
仓壁模式来源于船舱的设计:
船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进水,将故障控制在一定范围内,避免整个船体都被淹没。
与此类似,我们可以限定每个业务能使用的线程数,避免耗尽整个服务器的资源,因此也叫线程隔离。如图,每个业务分配10个线程,服务c的故障导致业务2的资源耗尽,但不会影响业务1,从而不会影响服务A,也就不会引发雪崩。
1.3、断路器
由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
如上图所示,总共有三个请求,两个都失败了,此时认为任务请求失败率过高,需要断开服务A对服务D的请求,于是后续服务A到服务D的请求都会被熔断,如下图:
1.4、限流
流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
总结:
- 限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。
- 超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。
二、Sentinel
在SpringCloud当中支持多种服务保护技术:Netfix Hystrix、Sentinel、Resilience4。早期比较流行的是Hystrix框架,但目前国内实用最广泛的还是阿里巴巴的Sentinel框架。Sentinel是阿里巴巴开源的一款微服务流量控制组件。Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2.1、流量控制
2.1.1、普通限流
当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
例如,我们刚才访问的order-service中的OrderController中的端点:/order/{orderId}
,访问Sentinel网址,可以看到下图:
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
- 流控:流量控制
- 降级:降级熔断
- 热点:热点参数限流,是限流的一种
- 授权:请求的权限控制
点击资源/order/{orderId}
后面的流控按钮,就可以弹出表单。在表单中可以填写设置信息,还可以利用压测工具进行测试等。
点击图中的高级选项,还可以设置流控模式和流控效果。目前工作中还未接触到微服务保护的内容,这次只做基本记录,知道有这个东西即可。
2.1.2、热点参数限流
之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。