本文为 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 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
<properties>
节点下添加属性表示使用的 sentinel 版本
<properties>
......
<!-- 指定使用的 sentinel 版本 -->
<sentinel.version>1.7.1</sentinel.version>
......
</properties>
<!-- spring-cloud sentinel 支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<!-- Dubbo 集成 Sentinel -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
<version>${sentinel.version}</version>
</dependency>
m03-nacos-dubbo-sentinel-provider/pom.xml
<!-- spring-cloud sentinel 支持 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Dubbo 集成 Sentinel -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
</dependency>
说明
- 添加
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-provider
及 m03-nacos-dubbo-sentinel-consumer
模块。
访问 consumer 得到类似如下结果证明项目启动成功:
{"msg":"请求成功","result":"Shawearn,你好,你的用户 ID 是 1704517887","code":0}
添加流控规则
登入 Sentinel 控制台,在 m03-nacos-dubbo-sentinel-provider
> 簇点链路
,如下图:
上图红框标注的资源便是本示例中的 Dubbo 服务实现接口,点击 流控
按钮添加流控规则
为了方便看到限流效果,此处笔者将 单机阈值 设置为 1,阈值类型 为 QPS,表示每秒只允许一个请求,超过的请求直接返回失败,流控规则可在 流控规则
列表中进行查看与管理
测试规则
通过浏览器访问如下地址:
http://localhost:8021/hello?name=Shawearn
未超过阈值时返回结果如下:
{"msg":"请求成功","result":"Shawearn,你好,你的用户 ID 是 1704517887","code":0}
超过阈值时访问便会被快速失败掉:
结束语
至此,Spring Cloud 使用 Sentinel 实现限流便完成了,然而本示例毕竟只是一个最简单的入门示例,使用的也只是 sentinel 的部分功能。例如规则持久化、动态数据源、异常处理等功能都还未涉及。本示例通过 sentinel-dashboard 配置规则虽然方便,但配置的规则并没有被持久化,一旦项目重启,配置的规则就丢失了,这边需要修改 sentinel-dashboard 中规则存储的逻辑使规则持久化,这部分内容笔者会在后面逐一介绍。