共同学习|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处理一个请求,部分请求等待超时被拒绝了。

相关推荐
我要吐泡泡了哦24 分钟前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫12325 分钟前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai2 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
铁匠匠匠4 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
小齿轮lsl6 小时前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
Aic山鱼6 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
qq11561487076 小时前
Java学习第八天
学习
天玑y6 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯