前言
本文主要讲的是微服务保护策略的概念
一、微服务问题---雪崩
1.1 雪崩问题
图一
微服务链路中的某个服务故障引整个链路中的所有微服务都不可用,就是雪崩;类似于级联异常;
1.2 解决方案
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。缓解了问题,但是并没有彻底解决问题,当同时异常请求过多时,还是会出现服务故障。
舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
解决了问题,但是浪费资源,因为空闲业务依旧占用线程。
熔断降级:由断路器统计业务执行的异常比例,如果超出阀值则会熔断该业务,拦截访问该业务的一切请求。有效解决了问题,也是常用的策略。
流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。能够降低雪崩的概率,并不能彻底解决问题。
1.3服务保护技术对比
springCloud当中支持多种微服务保护技术
注意: 线程池隔离存在几个问题:
1.线程池隔离使用会导致cpu上下文切换、内存增大等问题
2.从tomcat线程转交任务到新的线程会导致threadlocal中存放的数据丢失
二、Sentinel安装使用
2.1 下载
sentinel官方提供了UI控制台,方便我们对系统做限流设置。我们可以在GitHub下载。
也可以通过下面的链接下载。
2.2 运行
启动: 将jar包放到任意非中文目录,在dos窗口执行命令:java -jar sentinel-dashboard-1.8.1.jar
配置项 | 默认值 | 说明 |
---|---|---|
server.port | 8080 | 服务端口 |
sentinel.dashboard.auth.username | sentinel | 默认用户名 |
sentinel.dashboard.auth.password | sentinel | 默认密码 |
修改配置:可以通过dos命令或者配置文件的方式修改。
1. dos命令修改端口:java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar
2. 配置文件修改用户名和密码:
在同级目录下添加application.properties或者yml文件均可
用户名密码通过
-Dsentinel.dashboard.auth.username=sentinel
//用于指定控制台的登录用户名为sentinel
;
-Dsentinel.dashboard.auth.password=123456
//用于指定控制台的登录密码为123456
;
访问http://localhost:8080页面,就可以看到sentinel的控制台了:
账号和密码,默认都是:sentinel
2.3 微服务整合Sentinel
我们在order-service模块中整合sentinel,并连接sentinel的控制台,步骤如下:
1)在模块的POM文件中引入sentinel依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2)配置控制台
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
3)访问项目的任意请求路径
例如在本项目中,打开浏览器,访问http://localhost:8088/order/101,这样才能触发sentinel的监控。
三、流量控制
雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。
3.1、簇点链路
概念 : 当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点(也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
-
流控:流量控制
-
降级:降级熔断
-
热点:热点参数限流,是限流的一种
-
授权:请求的权限控制
3.2 、流控模式
在sentinel中添加限流规则时,点击高级选项,可以选择三种流控模式: 直接、关联、链路。
3.2.1、直接模式
统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。
3.2.2、关联模式
概念:统计关联资源的流量,当关联资源的流量触发阈值时,对当前资源限流。高优先级资源触发阈值,对低优先级资源限流。
使用场景:
有两个查询接口 普通查询和VIP查询
如果VIP查询达到某个阈值(比如500,证明VIP查询人数很多),就限制普通查询的流量 : 普通人给VIP让路,因为两者要访问同一个数据库
3.2.3. 链路模式
概念:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流
使用场景:
有查询订单和创建订单业务,两者都需要查询商品。
从查询订单进入到查询商品的请求统计,并设置限流。
3.3、流控效果
概念:流控效果是指请求达到流控阈值时应该采取的措施,包括三种:快速失败,warm up,排队等待。
-
1、快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
-
2、warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。是应对服务冷启动的一种方案 ,防止刚冷启动请求量就达到QPS从而故障。
预热时长的单位是秒
-
3、排队等待:让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
1和2适合秒杀模式下,3适合用于常规模式下使用,应对突然变多;
3.4 热点参数限流
对热点数据进行资源倾斜,并且其他资源还正常使用;