小工具知识网

当前位置: 首页 > 行业知识 > 共同学习|Spring Cloud Alibaba一一sentinel介绍

行业知识

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

2026-11-03 22:51:43 来源:互联网转载

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

         com.alibaba.cloud     spring-cloud-alibaba-nacos-discovery    com.alibaba.cloud    spring-cloud-alibaba-sentinel

    2、yaml

    server:   port: 8086spring:   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

    @RestControllerpublic 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")@EnableDiscoveryClientpublic 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、升级版本

    2.1.1.RELEASE

    2、关闭默认的filter

    spring:  cloud:     sentinel:         filter:            enabled: false

    3、自定义Filter

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

上一篇:轻松下载WSDL文件,一站式解决方案来了!

下一篇:苹果服务器怎么装?