微服务保护Sentinel

文章介绍了微服务架构中遇到的服务雪崩问题以及如何通过Sentinel进行解决。Sentinel提供了超时处理、舱壁模式(线程隔离)、熔断降级和流量控制等机制,防止整个链路故障。同时,文章详细讲解了Sentinel的配置、限流规则、流控模式、熔断策略以及授权规则等关键功能。
摘要由CSDN通过智能技术生成

服务雪崩
微服务调用链路中的某个服务故障,引起整个链路中所有的微服务不可用,这就是雪崩
解决:
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息
舱壁模式:限定每个业务能使用的线程数,避免耗尽整个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,获取配置变更的推送消息,完成本地更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值