深度解析阿里的Sentinel

1、前言

这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。

文章目录如下:

图片

2、什么是sentinel?

sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵

Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。

  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性如下图

图片

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

3、sentinel和Hystrix有何区别?

具体区别如下图:

图片

4、sentinel版本如何选择?

这里选择的spring-cloud-alibaba-dependencies的版本是2.2.1.RELEASE,因此sentinel版本选择1.7.1,大家可以根据自己的版本选择对应sentinel的版本,版本对应关系如下图:

图片

注意:一定要按照官方推荐的版本适配,否则出现意想不到的BUG追悔莫及.........

5、Sentinel 控制台如何安装?

sentinel和nacos一样,都有一个控制台,但是这里不用自己手动搭建一个微服务,官方已经搭建好了,只需要下载对应得jar包运行即可。下载地址:https://github.com/alibaba/Sentinel/tags

选择对应得版本下载即可,我这里选择1.7.1版本,下载的jar包如下图:

图片

当然你可以通过源码构建:mvn clean package

注意:JDK版本必须>=1.8

此时我们只需要运行这个jar包即可,命令如下:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

上述参数含义如下:

  • -Dserver.port:指定启动的端口,默认8080

  • -Dproject.name:指定本服务的名称

  • -Dcsp.sentinel.dashboard.server:指定sentinel控制台的地址,用于将自己注册进入实现监控自己

启动成功之后,浏览器访问:http://localhost:8080,登录页面如下图:

图片

默认的用户名和密码:sentinel/sentinel

登录成功之后页面如下:

图片

可以看到目前只有一个服务sentinel-dashboard被监控了,这个服务就是自己

注意:上述参数都是可选的,没必要可以不填。

那么问题来了:默认的用户名和密码在生产环境上肯定不能用,如何修改呢?

从 Sentinel 1.6.0 起sentinel已经支持自定义用户名和密码了,只需要在执行jar命令时指定即可,命令如下:

java -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123 -jar sentinel-dashboard-1.7.1.jar

用户可以通过如下参数进行配置:

  • -Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel

  • -Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel

  • -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

注意:部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。

除了用户名密码相关的配置,sentinel控制台还提供了其他的可配置选项,如下图:

图片

6、微服务如何接入sentinel控制台?

微服务为什么要集成sentinel控制台,sentinel不是提供了相关的API吗?

其实Spring Boot 官方一直提倡约定>配置>编码的规则,能够不硬编码何乐而不为呢?

因此本文后续内容主要还是结合sentinel控制台进行讲解,关于API的使用大家可以按照官方文档学习,讲解的非常清楚。

好了,言归正传,微服务如何接入sentinel控制台呢?

1、新建微服务模块注册进入Nacos

新建一个微服务模块:sentinel-service9008

相关配置如下:

server:
  port: 9008
spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

2、添加依赖

除了Nacos的依赖,还需要添加一个sentinel的依赖:

<!--sentinel的依赖-->
<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

3、添加配置集成控制台

只需要添加如下配置即可集成sentinel控制台:

spring:
  cloud:
    sentinel:
      transport:
       ## 指定控制台的地址,默认端口8080
        dashboard: localhost:8080

4、新建一个测试接口

下面新建一个测试接口,用于测试相关规则,如下:

@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {

    @GetMapping("/test")
    public String test(){
        return "接收到一条消息--------";
    }
}

5、启动微服务

启动9008这个微服务,然后浏览器输入:http://localhost:9008/sentinel/test,此时查看sentinel控制台,将会看见sentinel-service这个服务已经被监控了,如下图:

图片

注意:sentinel是懒加载机制,只有访问过一次的资源才会被监控。

不过可以通过配置关闭懒加载,在项目启动时就连接sentinel控制台,配置如下:

spring:
    sentinel:
      # 取消控制台懒加载,项目启动即连接Sentinel
      eager: true

7、流量控制如何配置?

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

QPS:每秒请求数,即在不断向服务器发送请求的情况下,服务器每秒能够处理的请求数量。

并发线程数:指的是施压机施加的同时请求的线程数量。

同一个资源可以创建多条限流规则,一条限流规则由以下元素组成:

  • resource:资源名,即限流规则的作用对象。

  • count: 限流阈值

  • grade:限流阈值类型(1:QPS  0:并发线程数),默认值QPS

  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源,默认值default

  • strategy:判断的根据是资源自身**(0),还是根据其它关联资源 (1),还是根据链路入口(2)**,默认值根据资源本身。

  • controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。

以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule,各元素如下图:

图片

注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。

以上几个元素在sentinel控制台对应规则如下图:

图片

1、三种流控效果

流控效果总共分为三种,对应元素controlBehavior,分别如下:

快速失败

默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException

warm up

预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

注意:这一效果只针对QPS流控,并发线程数流控不支持。

预热底层是根据令牌桶算法实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值