Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)

本文为 Spring Cloud Alibaba 系列 的第四篇文章,系列文章持续更新,点此 查看更多
本示例代码基于之前的 m01 模块代码改造,项目启动依赖同 m01 模块,读者可以阅读此博文 《使用 Nacos + Dubbo 实现的远程服务调用》 了解 m01 模块代码功能。
本示例完整代码 点此查看;
Sentinel 介绍 Sentinel 是面向分布式服务架构的高可用流量防护组件,随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
本文将介绍如何在 Spring Cloud 项目中使用 Sentinel 进行限流。
Sentinel 控制台安装与启动 获取控制台
可以从 release 页面 下载最新版本的控制台 jar 包。
也可以从最新版本的源码自行构建 Sentinel 控制台:
  • 下载 控制台 工程
  • 使用以下命令将代码打包成一个 fat jar: mvn clean package
启动控制台
Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可,本例中笔者下载的为 sentinel-dashboard-1.7.1,启动命令如下:
java -Dserver.port=8019 -Dcsp.sentinel.dashboard.server=localhost:8019 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

若启动时端口冲突,可使用 -Dserver.port=新端口 指定使用其他端口。
此处笔者使用 8019 端口启动 Sentinel 控制台,访问 http://localhost:8019 ,用户及密码默认都为 sentinel,登录成功进入如下界面:
Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
文章图片

Spring Cloud 集成 Sentinel 新建项目
复制之前 m01 模块中的代码,修各模块名称及相应依赖模块,如下:
修改前模块名 修改后模块名
m01 m03
m01-nacos-dubbo-api m03-nacos-dubbo-sentinel-api
m01-nacos-dubbo-consumer m03-nacos-dubbo-sentinel-consumer
m01-nacos-dubbo-provider m03-nacos-dubbo-sentinel-provider
添加依赖
m03/pom.xml
节点下添加属性表示使用的 sentinel 版本
......>1.7.1 ......

com.alibaba.cloud spring-cloud-starter-alibaba-sentinel ${spring-cloud-alibaba.version} com.alibaba.csp sentinel-apache-dubbo-adapter ${sentinel.version}

m03-nacos-dubbo-sentinel-provider/pom.xml
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel com.alibaba.csp sentinel-apache-dubbo-adapter

说明
  • 添加 spring-cloud-starter-alibaba-sentinel 依赖后,会将项目所有的 web 接口定义为资源,可在 sentinel 控制台的 簇点链路 中对资源进行流控等操作;
  • 添加 sentinel-apache-dubbo-adapter 依赖后,会将当前服务提供的 Dubbo 接口实现方法定义为资源,可在 sentinel 控制台的 簇点链路 中对资源进行流控等操作,若读者不需要对 Dubbo 服务实现接口进行流控,可不添加此依赖;
  • 读者亦可通过 @SentinelResource 注解将指定的方法定义为资源,注意该方法不能为 private 修饰,若有兴趣了解此注解的详细用法,可参阅 @SentinelResource 注解
指定 Sentinel 控制台信息
m03-nacos-dubbo-sentinel-provider 下的 application.yml 中添加配置指定 Sentinel 控制台地址:
spring: cloud: sentinel: transport: dashboard: localhost:8019

此配置值请读者根据自己 sentinel-dashboard 服务的 IP 和端口地址进行修改;
启动项目 依次启动 m03-nacos-dubbo-sentinel-providerm03-nacos-dubbo-sentinel-consumer 模块。
访问 consumer 得到类似如下结果证明项目启动成功:
{"msg":"请求成功","result":"Shawearn,你好,你的用户 ID 是 1704517887","code":0}

添加流控规则 登入 Sentinel 控制台,在 m03-nacos-dubbo-sentinel-provider > 簇点链路 ,如下图:
Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
文章图片

上图红框标注的资源便是本示例中的 Dubbo 服务实现接口,点击 流控 按钮添加流控规则
Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
文章图片

为了方便看到限流效果,此处笔者将 单机阈值 设置为 1,阈值类型 为 QPS,表示每秒只允许一个请求,超过的请求直接返回失败,流控规则可在 流控规则 列表中进行查看与管理
Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
文章图片

测试规则 通过浏览器访问如下地址:
http://localhost:8021/hello?name=Shawearn

未超过阈值时返回结果如下:
{"msg":"请求成功","result":"Shawearn,你好,你的用户 ID 是 1704517887","code":0}

超过阈值时访问便会被快速失败掉:
Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)
文章图片

结束语 【Spring|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)】至此,Spring Cloud 使用 Sentinel 实现限流便完成了,然而本示例毕竟只是一个最简单的入门示例,使用的也只是 sentinel 的部分功能。例如规则持久化、动态数据源、异常处理等功能都还未涉及。本示例通过 sentinel-dashboard 配置规则虽然方便,但配置的规则并没有被持久化,一旦项目重启,配置的规则就丢失了,这边需要修改 sentinel-dashboard 中规则存储的逻辑使规则持久化,这部分内容笔者会在后面逐一介绍。

    推荐阅读