微服务_3.微服务保护

文章目录

一、微服务雪崩及解决方法

微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。如果有服务提供者发生故障,当前应用的部分业务因为依赖于这些服务提供者,因此也会被阻塞。用户得不到响应,则微服务的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞,微服务支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。

解决雪崩问题的常见方式有四种:

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阈值。

限流 是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离 (舱壁模式)和熔断降级手段了。

2.2、线程隔离

线程隔离 之前讲到过:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。线程隔离是对客户端 (调用方)的保护,需要在调用方 发起远程调用时做线程隔离。

2.3、熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器 统计服务调用的异常比例或慢请求比例,如果超出阈值则会熔断该服务:即拦截访问该服务的一切请求。而当服务恢复时,断路器会放行访问该服务的请求。

2.3.1、断路器状态机

断路器控制熔断和放行是通过状态机来完成的。状态机有三个状态,

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
    • 请求成功:则切换到closed状态
    • 请求失败:则切换到open状态

2.3.2、断路器熔断策略

断路器熔断策略有三种:慢调用、异常比例、异常数。

2.3.2.1、慢调用

业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

例如:

解读:

RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

2.3.2.2、异常比例,异常数

统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

例如,一个异常比例设置:

解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.4,则触发熔断。

一个异常数设置:

解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于2次,则触发熔断。

2.4、授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。前面学习微服务时可以利用网关实现访问控制,但是如果出现"内鬼",直接泄露微服务信息,外部人员可以绕过网关直接访问微服务,此时就可以利用授权规则来避免。

  • 白名单:来源(origin)在白名单内的调用者允许访问

  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

点击左侧菜单的授权,可以看到授权规则:

比如:

我们允许请求从gateway到order-service,不允许浏览器访问order-service,那么白名单中就要填写网关的来源名称(origin)

相关推荐
cui_win1 天前
Redis高可用-Sentinel(哨兵)
redis·bootstrap·sentinel
FIN技术铺3 天前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
cyt涛4 天前
Sentinel — 微服务保护
微服务·架构·sentinel·限流·熔断·降级·隔离
ketil276 天前
Redis - 哨兵(Sentinel)
数据库·redis·sentinel
阿伟*rui7 天前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
茶馆大橘8 天前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
Shenqi Lotus8 天前
Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)
redis·sentinel·cluster·failover·sharding·自动分片·水平拆分
Genius Kim8 天前
SpringCloud Sentinel 服务治理详解
spring cloud·sentinel·php
为美好的生活献上中指8 天前
Java学习Day60:微服务总结!(有经处无火,无火处无经)
java·spring boot·spring cloud·微服务·sentinel·jetty
转世成为计算机大神8 天前
易考八股文之谈谈对sentinel的理解和作用?
java·开发语言·sentinel