51.Sentinel微服务保护
目录
(1)初识Sentinel。
(1.1)雪崩问题及解决方案。
(1.1.1)雪崩问题。
(1.1.2)解决雪崩问题的四种方式。
(1.1.3)总结。
(1.2)服务保护技术对比。
(1.3)Sentinel介绍和安装。
(1.4)微服务整合Sentinel。
(2)流量控制。
(2.1)简单流控。
(2.2)流控模式(直接、关联、链路)。
(2.3)流控效果(快速失败、warm up、排队等待)。
(2.4)热点参数限流。
(3)线程隔离、熔断降级。
编辑 (3.1)FeignClient整合Sentinel。
(3.2)线程隔离(舱壁模式)(线程池隔离、信号量隔离)。
(3.3)熔断降级(慢调用、异常比例、异常数)。
编辑
(4)授权规则。
(4.1) 授权规则。
(4.2)自定义异常结果。
(4.3)总结。
(5) 系统规则。
(6)规则持久化。
(6.1)规则管理模式。
(6.2)实现push模式。
(7)浏览器清除缓存的技巧。
(1)初识Sentinel。
(1.1)雪崩问题及解决方案。
(1.1.1)雪崩问题。
雪崩:一个微服务A依赖(即发送请求,等回应)于另一个微服务B,如果B出现故障,没有回应,则A的这条访问就不会结束(请求不释放),等到微服务A的请求资源都用完后,A也废了(所有访问资源都被占用了)。然后一些微服务依赖服务A的,也得不到A的回应,也跟着废了。这就是雪崩,因为一个微服务出现故障,导致凡是依赖于它的微服务也出现故障。
(1.1.2)解决雪崩问题的四种方式。
提示:前三种是处理出现故障的微服务避免故障传递从而导致雪崩,第四种是预防雪崩,就是还没发生故障的。
(1.1.3)总结。
(1.2)服务保护技术对比。
(1.3)Sentinel介绍和安装。
开启的效果如下(部分截图):
(1.4)微服务整合Sentinel。
提示:整合好之后,启动项目后,需要访问过服务器之后,在sentinel里面才能看到显示 。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
(2)流量控制。
(2.1)简单流控。
每一个端点(Endpoint):可以理解成controller中的每个方法。
QPS 是 "Queries Per Second"(每秒查询数)的缩写:即每秒的请求量。
并发量:表示系统在同一时刻需要处理的请求总数。
提示:被请求过的方法才会被监控到,想要监控它,先请求它。
请求效果如下:每秒访问10次,5次成功,5次失败。
(2.2)流控模式(直接、关联、链路)。
链路:就是对请求来源进行限流。(例如:有ABC三个资源,A和B都要访问C,在统计资源C的时候,只统计某个入口资源,如A或B,如果超过阈值,则限流C)
特别说明:
如果不关闭这个,则所有controller中的方法访问service服务层的该监控方法时,都认为是同一个来源,所以就起不到链路的作用。(需要要配这个参数,不然链路模式不起作用)
以下是关联模式达到阈值后的限流:
(2.3)流控效果(快速失败、warm up、排队等待)。
warm up也叫预热模式:作用就是给刚启动的服务器一些缓冲的时间,让服务器刚开始时处理的请求少一些,然后慢慢增加到正常数量。(初始化QPS是3,然后慢慢增加,达到预热时间后,QPS就变成设置值的QPS了)
排队等待:如果设置的超时时间是5秒,而每秒只能处理10个,那么队列只能放50个。(例如,空闲服务器突然1秒内有60个请求,处理10个,50个放进队列,都能处理完。若是1秒内61,那么有一个不能进入队列,直接返回异常。) (计算失败的请求数量:就是当多出来的超过队列最大容量时,则后面每秒只能进入每秒处理的请求个数,多出来的都会返回异常,例如:超时是5秒,每秒出来1个请求,我每秒请求2次,则第五秒正好队列排满,之后每秒只能进队列1个(每秒处理的个数),多出来的1个请求只能返回异常)。
(2.4)热点参数限流。
热点参数限流对默认的SpringMVC资源无效:解决方法就是给springmvc的方法加上@SentinelResource("hot")注解,里面的hot是给这个资源起的名称。
(3)线程隔离、熔断降级。
线程隔离:就是给每个业务分配一定数量的线程, 即便某业务调用的服务器垮了,也能处理其他业务。
熔断降级:就是按访问的成功与失败的比例,如果失败比例过大,则禁止访问该业务。
(3.1)FeignClient整合Sentinel。
我这里出现一个异常:
Caused by: java.lang.IllegalStateException: Incompatible fallbackFactory instance. Fallback/fallbackFactory of type class cn.itcast.feign.clients.fallback.UserClientFallbackFactory is not assignable to interface org.springframework.cloud.openfeign.FallbackFactory for feign client userservice
解决办法:因为是版本不兼容,换个版本就行。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
本来成功运行了,但是今天早上重新开启服务的时候有报错了:
解决方法是:把Hoxton.SR10换成Hoxton.SR8就可以成功启动服务器了
<!-- <spring-cloud.version>Hoxton.SR10</spring-cloud.version>-->
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
(3.2)线程隔离(舱壁模式)(线程池隔离、信号量隔离)。
(3.3)熔断降级(慢调用、异常比例、异常数)。
(4)授权规则。
(4.1) 授权规则。
授权规则:可以做身份验证,网关也可以身份验证,但是万一泄露了微服务的地址,那么别人可以绕过网关,直接访问微服务,该授权规则就是拦截不是从网关过来的请求。
解析:下方的流控应用填写的名称是实现的RequestOriginParser接口的parseOrigin方法的返回值(当然也可以写其他,可操作空间挺大的),当返回值与流控应用的值一样时,则允许访问,否则拒绝访问。
(4.2)自定义异常结果。
FallbackFactory接口和BlockExceptionHandler接口是的区别:
-
FallbackFactory接口:FallbackFactory接口通常用于实现服务降级的逻辑。当原始服务不可用时,fallback对象会代替原始服务进行处理,并返回预先定义的默认响应或错误信息。(用于远程调用feign,当feign出现异常或熔断隔离,就会调用这个接口的实现)
-
BlockExceptionHandler接口:BlockExceptionHandler接口通常用于处理限流和熔断的异常情况。BlockExceptionHandler接口允许自定义异常处理逻辑,在请求被限流或触发熔断时,可以定义如何处理这些异常情况。(只要不是远程调用,请求被sentinel限流授权等操作,就会调用该实现)
(4.3)总结。
(5) 系统规则。
只对linux系统有用,对sentinel应用的主机进行保护措施。
(6)规则持久化。
(6.1)规则管理模式。
(6.2)实现push模式。
注意:如果没变化的话,要清除缓存。
方法:开发者模式下,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。
# 这里除了配置了flow还配了degrade,如果还要配其他的,就按照这个格式(把xxx换成需要配置的类型,有三个xxx)
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: localhost:8848 # nacos地址
dataId: orderservice-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow # 还可以是:degrade、authority、param-flow
degrade:
nacos:
server-addr: localhost:8848 # nacos地址
dataId: orderservice-degrade-rules
groupId: SENTINEL_GROUP
rule-type: degrade # 还可以是:degrade、authority、param-flow
xxx:
nacos:
server-addr: localhost:8848 # nacos地址
dataId: orderservice-xxx-rules
groupId: SENTINEL_GROUP
rule-type: xxx # 还可以是:degrade、authority、param-flow
sentinel的效果如下:只配置了持久化的流控规则。
添加持久化的流控规则后,去nacos控制台看配置列表:多出了一个配置文件。
(7)浏览器清除缓存的技巧。
总结:开发者模式下,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。
Google Chrome浏览器:
- 在Chrome浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
- 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存并强制重新加载"选项。
- 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。
Mozilla Firefox浏览器:
- 在Firefox浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
- 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除缓存和硬重载"选项。
- 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。
Microsoft Edge浏览器:
- 在Edge浏览器中,按下快捷键"Ctrl + Shift + I"(Windows)或"Cmd + Option + I"(Mac)打开开发者工具。
- 在开发者工具中,右键点击浏览器刷新按钮(位于地址栏旁边),选择"清除浏览器缓存"选项。
- 或者,按下快捷键"Ctrl + F5"或"Shift + F5",这会强制刷新页面并清除缓存。