微服务保护Sentinel
Posted leese233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务保护Sentinel相关的知识,希望对你有一定的参考价值。
服务雪崩
微服务调用链路中的某个服务故障,引起整个链路中所有的微服务不可用,这就是雪崩
解决:
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息
舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat资源,因此也叫线程隔离
熔断降级:由断路器统计业务执行的异常比例,如果超出阈值会熔断该业务,拦截访问该业务的一切请求
流量控制:限制业务访问的QPS(每秒钟访问数量),避免服务因流量的突增而故障
微服务整合Sentinel
引入依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
修改配置文件
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
限流规则
sentinel默认只标记Controller中的方法为资源,如果要标记其他方法,需要利用@SentinelResource注解 @SentinelResource("任意命名的资源名")
而且sentinel默认会将Controller方法做context整合,导致链路模式流控失效,需要修改application.yml,添加配置
sping:
cloud:
sentinel:
web-context-unify: false #关闭context整合
簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点,因此SpringMVC的每一个端点就是调用链路的一个资源
流控规则
阈值类型 QPS(每秒并发数量) 线程数
流控的三种模式 直接 关联 链路
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认模式
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
链路:统计从知道链路访问到本资源的请求,触发阈值时,对指定链路限流
流控效果 快速失败 Warm Up 排队等待
快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常,是默认处理方式
warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值
排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔小于指定时长。后面的请求必须等待前面执行完成,如果请求预期的等待时长超过最大时长,则会被拒绝
热点参数限流:热点参数限流是分别统计参数值相同的请求,判断是否超过阈值(默认对
SpringMVC资源无效,需要@SentinelResource注解)
线程隔离和熔断降级,需要开启Feign的Sentinel功能
feign:
sentinel:
enabled: true
给FeignClient编写失败后的降级逻辑
方式一:FallbackClass ,无法对远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理
线程隔离实现方式:在阈值类型中选择线程数使用信号量隔离
熔断策略有三种:慢调用、异常比例、异常数
慢调用:业务的响应时长大于指定时长的请求认定为慢调用。在指定的时间内,如果请求的数量超过设定的最小数量,慢调用比例大于设定的阈值,会触发熔断
异常比例:在指定的时间内,如果出现异常的比例大于设定的阈值,会触发熔断
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式
白名单:来源在白名单内的调用者可以访问
黑名单:来源在黑名单的调用者不允许访问
例如,我们只允许从网关来的请求访问order-service,那么流控应用就填网关名称
sentinel是通过RequestOriginParser这个接口的ParseOrigin来获取请求来源的,我们可以实现这个接口,重写方法,尝试从request中获取一个名为origin的请求头,作为origin的值
@Component
public class HeaderOriginParser implements RequestOriginParser
@Override
public String parseOrigin(HttpServletRequest request)
// 1.获取请求头
String origin = request.getHeader("origin");
// 2.非空判断
if (StringUtils.isEmpty(origin))
origin = "blank";
return origin;
我们必须让所有从gateway路由到微服务的请求都带上origin头
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=origin,gateway
资源名为路径,流控应用是值origin的值gateway,授权类型为白名单
规则管理模式
原始模式:sentinel的默认模式,将规则保存在内存,重启服务会丢失
pull模式:控制台将配置的规则推送到sentinel客户端,而客户端会将规则保存在本地文件或数据库中。以后会定时去本地文件或数据库查询,更新本地规则
push模式:控制台将配置规则推送到远程配置中心,例如nacos,sentinel客户端监听nacos,获取配置变更的推送消息,完成本地更新
微服务-SpringCloud学习系列: 熔断保护Sentinel
Sentinel支持信号量隔离(不支持线程池隔离),多种熔断降级策略,支持QPS流量控制。Sentinel是Hystrix的替代方案。
Sentinel的核心概念:资源,规则,检验规则是否生效。
1.Sentinel的使用
①安装管理控制台(去官网下载对应的jar包,注意启动脚本中jar的版本)
②将所有微服务交给控制台管理
在微服务中引入依赖和增加配置(这里注意Sentinel是懒加载,在接收到请求之后才能在控制台看到数据,也可以在控制台配置各种规则)
③对服务的熔断保护
④Sentinel的简单原理
2.Sentinel的本地配置(因为控制台的配置是在内存中存储的,重启之后就会失效)
配置项
本地限流规则配置:
3.Sentinel对Template调用的全局熔断保护
在RestTemplate的Bean上增加@SentinelRestTemplate注解并配置熔断降级的类和方法或者异常降级的类和方法
这里注意降级方法的中返回值SentinelClientHttpResponse中需要的设置成对应返回值的JSON字符串,否则会发生JSON解析异常。
4.Sentinel对Feign的全局降级配置
①引入依赖
②配置开启Sentinel支持
③编写降级类
和Hystrix对Feign的熔断降级类似,配置完成后可以在控制台配置规则。
5.总结
Sentinel是由阿里巴巴开发的熔断保护组件,支持灵活的配置规则(例如限流规则,熔断规则)
以上是关于微服务保护Sentinel的主要内容,如果未能解决你的问题,请参考以下文章
Sentinel分布式服务架构高可用流量防护组件之微服务保护