共同学习|Spring Cloud Alibaba一一sentinel介绍

Sentinel介绍

介绍 · alibaba/Sentinel Wiki · GitHub

1、Sentinel是什么

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促销流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可应用等。
  • 完备的实时监控:Sentinel同时提供实时监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如SpringCloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
  • 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

2、sentinel能干什么?

3、sentinel生态

sentinel安装

下载地址:Release v1.8.1 · alibaba/Sentinel · GitHub

运行jar包即可。

java -jar sentinel-dashboard-1.8.1.jar

java -jar sentinel-dashboard-1.8.1.jar &后台运行

java -jar sentinel-dashboard-1.8.1.jar>out.logs&后台运行并且输出日志到当前目录的out.logs中。

sentinel默认的端口号是8080,所以在启动之前确保8080端口没被占用。

访问sentinel:http://localhost:8080

默认的用户名和密码都是sentinel

sentinel监控服务

1、pom

复制代码
<!-- nacos依赖-->
     <dependency><groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- sentinel依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>

2、yaml

复制代码
server:
   port: 8086
spring:
   application:
       name: server-sentinel
   cloud:
       nacos:
           discovery:
                server-addr: localhost:8848 # 把服务注册到nacos
       sentinel:
           eager: true # 服务启动的时候把服务名称发送给sentinel-dashboard
           transport:
              dashboard: localhost:888 # 让sentinel监测这个服务
              port: 8719 # 与dashboard通讯的端口
management:
    endpoints:
        web :
            exposure:
                include: '*'

这里需要注意:项目集成sentinel,会占用一个端口开启http服务,用来发送心跳检测以检测健康状态,sentinel控制台默认占用的是8719;集成的项目中,会在8719端口以后自动寻找一个可用的端口,比如8720,8720不可用就会找8721,以此顺序往下找。

3、controller

复制代码
@RestController
public class HelloController {
        @GetMapping("/hello1")
        public string hello1(){
              return "hello1";
        }
       @GetMapping("/hello2")
       public string hello2() {
             return "hello2";
       }
}

4、启动类

复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(scanBasePackages = "com.qf")
@EnableDiscoveryClient
public class ServerSentinelApplication {
              public static void main(string[] args) {
                     SpringApplication.run(ServerSentinelApplication.class, args);
              }
}

5、调用接口

复制代码
http://localhost:8006/hello1

6、sentinel查看

sentinel采用的懒加载的模式,先要调用接口,才能看到流量接口。

Sentinel流控原理

1、服务启动sentinel-client把服务信息注册到sentinel-dashborad上面(如果eager为false第一次访问的时候注册)

2、在本机启动一个端口号和sentinel-dashboard通讯,默认是8719,如果被占用自动寻找可用端口8720,8721。。

3、用户访问服务,接着把服务地址推送给sentinel-dashboard,sentinel-dashboard上面就可以服务地址了。

4、用户在sentinel-dashboard上面配置流控规则,dashboard就会把流控规则通过8719端口推送到sentinel-client,

5、用户再次访问服务接口sentinel-client根据流控规则开始做流控

6、sentinel-client和dashboard失去心跳后,dashboard中的流控规则自动删除sentinel-client没有做持久化的前提下)

流控规则

流量控制 (flow control) ,其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的闻值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

1、限流规则

资源名

其实就是我们请求的资源路径

针对来源

这个是此流控规则对应那些微服务进行流控管理,一般填写调用方的微服务名称,多个用","分割

闯值类型

1、QPS: 每秒的最大请求数,超过这个数量进行限流(外部限流)

2、线程数: 调用接口的最大线程数,超过这个数量进行限流(接口内部限流)

案例: 接口内休眠指定的时间在返回,启动两个浏览器同 时调用接口。

单机闯值

单机状态下的最大限制值

是否集群

根据实际情况选择

流控模式

直连: 一般是对自己本身资源的限制。

关联

/hello1关联/hello2,如果/hello2超过阈值就限流/hello1,在微服务中会存在多个服务调用来完成一个业务。如果支付服务失败了,就限流下单服务,不要有太多的订单生成,举例:如果地铁站台排队的人已经很多了,就要从外面限制进来的人了。

案例:使用jemeter调用/hello2使其达到阈值,然后用浏览器调用/hello1发现被限制了。

链路

当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

SpringCloudAlibaba2.1.0中演示链路功能会存在版本的问题,所以需要把SpringCloudAlibaba升级成2.1.1才可以。

1、升级版本

复制代码
<version>2.1.1.RELEASE</version>

2、关闭默认的filter

复制代码
spring:
  cloud:
     sentinel:
         filter:
            enabled: false

3、自定义Filter

复制代码
@Configuration
public class SentinelFilterConfig (
     @Bean
     public FilterRegistrationBean sentinelFilterRegistration(){
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new CommonFilter());
            registration.addUrlpatterns("/*");
            registration.addInitParameter(CommonFilter.WEB CONTEXT UNIFY,"false");
            registration.setName("sentineFilter");
            registration.setOrder(1);
            return registration;
     }
}

流控效果

快速失败

快速失败 (RuleConstant.CONTROL BEHAVIOR DEFAULT) 方式是默认的流量控制方式,当QPS超过任意规则的闽值后,新的请求就会被立即拒绝,拒绝方式为抛出

Warm Up

即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到闻值上限给冷系统一个预热的时间,避免冷系统被压垮。开始的闻值是最大QPS闽值的1/3,然后慢慢增长,直到最大闻值,适用于将突然增大的流量转换为缓步增长的场景。

案例:定义一个接口,刚开始频繁访问,阈值是3所以拒绝此时很多,4s后阈值变为10,拒绝次数就变少了。

排队等待

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,即是让请求以均匀的速度通过,对应的是漏铜算法。

这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

每秒处理一个请求,其余请求等待,如果等待时间超过5s才拒绝。

案例:没有设置流控情况下使用Jmeter发送10个请求,发现3s的时间都处理完了,设置流控后发现1s处理一个请求,部分请求等待超时被拒绝了。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习