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

相关推荐
Komorebi.py1 小时前
【Linux】-学习笔记05
linux·笔记·学习
朝九晚五ฺ8 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
猫爪笔记10 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
pq113_610 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
澄澈i10 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
爱米的前端小笔记11 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
alikami12 小时前
【前端】前端学习
学习
一只小菜鸡..12 小时前
241118学习日志——[CSDIY] [ByteDance] 后端训练营 [06]
学习
Hacker_Oldv13 小时前
网络安全的学习路线
学习·安全·web安全
蒟蒻的贤13 小时前
vue学习11.21
javascript·vue.js·学习