微服务保护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分布式服务架构高可用流量防护组件之微服务保护

Sentinel分布式服务架构高可用流量防护组件之微服务保护

Sentinel :微服务哨兵

微服务保护Sentinel

Sentinel 介绍与微服务整合

Sentinel 介绍与微服务整合