Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • SpringCloudAlibaba

    • Nacos

    • Dubbo

    • Zookeeper

    • Sentinel

      • Sentinel基础
        • 1.雪崩
        • 2.限流规则
          • 流控模式
          • 流控效果
          • 热点参数限流
        • 3.降级隔离
          • Feign整合Sentinel
        • 4.线程隔离
          • 线程池隔离
          • 信号量隔离
        • 5.熔断降级
        • 6.授权规则
        • 7.规则持久化
      • Sentinel面试
    • Seata

  • MQ消息队列

  • Nginx

  • Elasticsearch

  • Gateway

  • Xxl-job

  • Feign

  • Eureka

  • 中间件
  • SpringCloudAlibaba
  • Sentinel
phan
2023-05-15
目录

Sentinel基础

# Sentinel基础

# 1.雪崩

雪崩问题:微服务链路中某个服务故障,引起整个链路中的所有微服务都不可用

  • 设定超时时间,超过一定时间没有响应则返回错误信息。但是不能从根本上解决问题,如果在请求等待的时间内发送过来更多的客户请求,则当前服务A的资源还是会被耗尽。
  • 舱壁模式:限定每个业务能使用的线程数量。
  • 熔断降级:由断路器统计当前服务的业务执行异常比例,超出与之则会熔断改业务。拦截访问该业务的一切请求。
  • 流量控制:限制业务访问的QPS。是一种预防的措施。

微服务整合sentinel控制台,在响应微服务引入maven依赖,yaml文件导入sentinel坐标。

# 2.限流规则

每一个端点都是调用链路的一个资源,每个资源可以进行①流控②降级③热点④授权

# 流控模式

  • 直接:当前资源触发阈值,则对当前资源进行限流
  • 关联:统计和当前资源A相关联的另一个资源B的访问量,触发阈值则对当前资源A限流。(当前是读操作,关联写操作,当写操作QPS高时,对读操作进行限流)
  • 链路:统计从指定该链路访问到本资源的请求,触发阈值则对指定链路限流。orderController中两个方法都会调用Service中的一个查询方法,可以指定限流其中某一个方法调用service的QPS。
    • sentinel默认只会标记controller方法作为资源,要标记service中的方法为资源,需要使用@SentinelResource注解
    • sentinel默认会将同一个controller方法做context整合(这些不同方法都属于同一个controller根),需要修改yaml文件把web-context-unify设置为false。

# 流控效果

请求达到阈值采取的措施。

  • 快速失效:新的请求立刻被拒绝并抛出FlowException异常
  • warm up:超出阈值的请求也会立刻拒绝。但是请求阈值初始值为阈值/冷启动因子,然后在预热时间内持续提高到阈值大小。目的是为了应对微服务冷启动,服务器启动减少请求数量。
  • 排队等待:所有的请求进入一个队列中,然后按照阈值允许的时间间隔执行,如果请求预期的等待时间(这里是指预先排队计算好的)超出最大时长则会被拒绝。比如QPS为10,超时时长为5s,所有请求都会进入排队队列按照每100ms执行完毕跳出队列的速度进行,队列等待时长超过5s的请求才会被拒绝。好处在于每次可以流量削峰,控制每秒QPS的同时又尽可能的响应请求。

# 热点参数限流

前面的限流资源针对的是同一个controller的方法,而热点参数限流会统计请求参数值相同的请求,相当于对数据库的某条确切数据的访问。

仅有@SentinelResource注解的方法生效,在sentinel控制台点击热点规则设置。"参数索引"代表方法args参数的下标,第一个参数默认从0开始。

场景:给热点数据设置较大的限流QPS

# 3.降级隔离

# Feign整合Sentinel

  • 在order微服务的yaml文件Feign客户端位置添加sentinel.enabled,设置为true。

  • 在FeignClient接口编写FallbackFactory类,并在config类中注册为Bean

  • 将FallbackFactory配置到FeignClient

对Feign客户端资源进行限流,超出阈值时不会拒绝会执行降级逻辑。

# 4.线程隔离

# 线程池隔离

给微服务每个业务设置一个线程池,当该业务请求过多导致当前线程池内的所有线程都被用尽,那么该业务后续的请求就会被拒绝,此时不会影响到整个微服务资源的使用,每个业务对应的线程池都是独立的。

优缺点:支持不同服务之间的异步调用,但是线程上下文切换额外开销大。适用于低扇出场景(依赖的服务越多扇出越高)

image-20230304183528445

# 信号量隔离

通过一个计数器来控制用户的请求数,每一个请求过来计数器就减一,处理完业务后归还计数器。

优缺点:轻量级,适用于高扇出。

# 5.熔断降级

由断路器统计服务调用的异常比例和慢请求比例,超出阈值则会熔断该服务,熔断时间结束后会进入Half-Open状态,然后尝试放行一次请求,如果通过则解除熔断恢复正常状态。

image-20230304185126277

熔断策略:

  • 慢调用:如果业务响应时长大于指定时长的请求则认定为慢调用。降级规则:响应时长超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例超过0.5,则触发熔断,熔断时长为5s,5s过后进入半开状态放行一次请求做测试。

image-20230304190100342

  • 异常比例&异常数:抛出异常的业务请求数量超过指定异常数。

# 6.授权规则

用于验证请求是从哪里过来的,只允许从gateway网关过来的请求访问。可以通过和网关约定校验规则,比如网关通过过滤器default-filters向请求头添加"origin"字段的键值对,然后sentinel通过RequestOriginParser接口获取请求来源信息进行判断。

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String origin = httpServletRequest.getHeader("origin");
        if (StringUtils.isEmpty(origin)) {
            origin = "blank";
        }
        return origin;
    }
}
1
2
3
4
5
6
7
8
9
10
11

在sentinel中资源点击授权->流控应用->白名单

  • 自定义异常接口,默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方,实现BlockExceptionHandle接口可以自定义异常。

# 7.规则持久化

原始模式:保存在内存,重启服务会丢失

pull模式:保存在本体文件或者数据库,定时去读取。

push模式:控制台会将配置规则推送到远程配置中心Nacos,Sentinel客户端会监听Nacos,获取配置变更的推送消息。

编辑 (opens new window)
#中间件#SpringCloudAlibaba
上次更新: 2023/12/15, 15:49:57
Zookeeper基础
Sentinel面试

← Zookeeper基础 Sentinel面试→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式