本文为 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 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
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
节点下添加属性表示使用的 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 注解
在
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|Spring Cloud Alibaba(四)(Spring Cloud 使用 Sentinel 实现限流)】至此,Spring Cloud 使用 Sentinel 实现限流便完成了,然而本示例毕竟只是一个最简单的入门示例,使用的也只是 sentinel 的部分功能。例如规则持久化、动态数据源、异常处理等功能都还未涉及。本示例通过 sentinel-dashboard 配置规则虽然方便,但配置的规则并没有被持久化,一旦项目重启,配置的规则就丢失了,这边需要修改 sentinel-dashboard 中规则存储的逻辑使规则持久化,这部分内容笔者会在后面逐一介绍。
推荐阅读
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- java人生|35K 入职华为Java开发那天,我哭了(这 5 个月做的一切都值了)
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 微服务|微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
- 每日一书|每日一书丨终于有人把云原生讲明白了
- java|ApplicationListener和SpringApplicationRunListener的联系
- Spring|SpringSecurity--自定义登录页面、注销登录配置
- 性能|性能工具之 Jmeter 通过 SpringBoot 工程启动