SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战
转载 https://www.cnblogs.com/smallSevens/p/11531534.html
前言
在从0到1构建分布式秒杀系统和打造十万博文系统中,限流是不可缺少的一个环节,在系统能承受的范围内既能减少资源开销又能防御恶意攻击。
在前面的文章中,我们使用了开源工具包 Guava 提供的限流工具类 RateLimiter 和 OpenResty 的 Lua 脚本分别进行 API 和应用层面的限流。今天,我们来聊聊阿里开源的分布式系统的流量防卫兵 Sentinel。
Sentinel 是什么?
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
Sentinel 的开源生态:
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
控制台配置
Sentinel 控制台最少应该包含如下功能:
查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
规则管理和推送:统一管理推送规则。
鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
可以直接从[ release 页面](https://github.com/alibaba/Sentinel/releases " release 页面") 下载最新版本的控制台 jar 包,启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。。
启动脚本 sentinel.sh:
#!/bin/bash
java -Dsentinel.dashboard.auth.username=admin \
-Dsentinel.dashboard.auth.password=admin \
-Dserver.port=8084 -Dcsp.sentinel.dashboard.server=localhost:8084 \
-Dproject.name=sentinel-dashboard \
-jar sentinel-dashboard-1.6.3.jar &
用户可以通过如下参数进行配置:
-Dsentinel.dashboard.auth.username=admin
用于指定控制台的登录用户名为 admin;-Dsentinel.dashboard.auth.password=admin
用于指定控制台的登录密码为 admin;如果省略这两个参数,默认用户和密码均为 sentinel;-Dserver.servlet.session.timeout=7200
用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
客户端配置
pom.xml 引入以下依赖:
<!-- https://blog.52itstyle.vip -->
<parent><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> </dependencies> <dependencyManagement> <!--注意跟 SpringBoot 保持一致 2.1.x for Spring Boot 2.1.x--> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置文件:
# 应用名称 https://blog.52itstyle.vip
spring.application.name=blog
spring.cloud.sentinel.transport.port=8720
# 测试请替换为自己的地址
spring.cloud.sentinel.transport.dashboard=116.190.247.112:8084
这里的 spring.cloud.sentinel.transport.port
端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了1个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
代码配置:
/*** 博文 https://blog.52itstyle.vip*/
@RequestMapping("{id}.shtml")
@SentinelResource("blogView") public String page(@PathVariable("id") Long id, ModelMap model) { try{ Blog blog = blogService.getById(id); String key = "blog_"+id; Long views = redisUtil.size(key); blog.setViews(views+blog.getViews()); model.addAttribute("blog",blog); } catch (Throwable e) { return "error/404"; } return "article"; }
@SentinelResource
注解用来标识资源是否被限流、降级。上述例子上该注解的属性 'blogView'
表示资源名。
默认情况,Sentinel 会拦截所有的 Controller 请求,这里标识资源名,是因为所有的文章都会走这个请求,为了方便统计和流控,这里自定义资源标识。
更多注解支持,请参考:Sentinel/wiki/注解支持。
访问客户端项目,随便点击几个页面,然后登录 Sentinel 控制台,如果看到以下界面,说明配置成功。
配置限流,搜索我们刚才配置的资源名称,选择流控功能。
输入阈值参数,为了测试方便,这里直接输入2,连续刷新浏览器,如果后台出现以下错误,并伴随着前台页面无法正常显示说明配置生效。
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
当然,Sentinel 流程功能不仅仅这么简单,还支持集群模式,在终极版十万博文中,我们可以为集群中的节点,设置单机均分,也可以设置一个总体的阈值。
生产环境中使用
Sentinel 核心库目前已可用于生产环境,目前除了阿里巴巴以外,也有多家企业在生产环境中使用它们。
规则管理及推送
原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境。
不过 Sentinel提供了扩展读数据源ReadableDataSource
,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
监控
Sentinel 会记录资源访问的秒级数据(若没有访问则不进行记录)并保存在本地日志中。Sentinel 控制台可以通过 Sentinel 客户端预留的 HTTP API 从秒级监控日志中拉取监控数据,并进行聚合。
目前 Sentinel 控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。若需要监控数据持久化的功能,可以自行扩展实现。
注意事项
由于一开始没有认真读文档,把控制台部署到了外网,而客户端在内网启动,导致客户端无法被访问到,实时链路和簇点链路数据无法正常显示。
测试的小伙伴注意了,原始模式下,客户端和控制台必须相互被访问到,客户端会向控制台定时发送心跳请求,控制台会向客户端推送规则、拉取流控数据并聚合。
源码
https://gitee.com/52itstyle/spring-boot-blog
参考
https://github.com/alibaba/Sentinel
作者: 小柒
出处: https://blog.52itstyle.vip
转载于:https://www.cnblogs.com/baobeiqi-e/p/11532623.html
SpringBoot 2.0 + 阿里巴巴 Sentinel 动态限流实战相关推荐
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!
前一篇文章介绍了Spring Cloud Gateway的一些基础知识点,今天陈某就来唠一唠网关层面如何做限流? 文章目录如下: 网关如何限流? Spring Cloud Gateway本身自带的限流 ...
- Spring Cloud Gateway 整合阿里 Sentinel网关限流实战
文章目录如下: 网关如何限流? Spring Cloud Gateway本身自带的限流实现,过滤器是RequestRateLimiterGatewayFilterFactory,不过这种上不了台面的就 ...
- Sentinel整合Dubbo限流实战
Sentinel整合Dubbo限流实战 创建provider项目 添加jar依赖 <dependency><artifactId>sentinel-api</artifa ...
- 【alibaba-cloud】网关整合sentinel实现限流
网关整合sentinel实现限流 还是在前几篇博客的基础上搭建的,需要有服务端,客户端,网关等 客户端服务端的搭建:https://blog.csdn.net/wangyunzhao007/artic ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...
- Spring Cloud Alibaba实战(三) - Sentinel之限流
目录 (一)Nacos动态配置 (二)Nacos注册中心 (三)Sentinel之限流 (四)Sentinel之熔断 (五)Gateway之路由.限流 (六)Gateway之鉴权.日志 (七)Gate ...
- sentinel 网关限流
sentinel 网关限流 官网:https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html 网关限流 sentinel支持对主 ...
- sentinel 热点限流
sentinel 热点限流 官网:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html 热点限流 sentinel使用lru算 ...
- 流量治理神器-Sentinel的限流模式,选单机还是集群?
大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...
最新文章
- 2019第四周作业(基础作业+挑战作业)
- FLUSH TABLES WITH READ LOCK
- 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了...
- golang 判断字符串是不是数字
- android布局属性
- MySQL之父直播公开课来了!与腾讯云CDB专家天团联袂分享
- linux查看php命令目录权限,PHP执行linux命令mkdir权限问题
- linux下赛车游戏,SuperTuxKart 1.0 发布,开源Linux赛车游戏
- 千呼万唤始出来!诺基亚发预热海报:5摄手机真要来了
- 以太币转帐速度_燃起来吧!一文带你读懂以太坊网络中的Gas、Gas Fee、Gas Price、Gas...
- Linux搭建测试环境步骤
- 2021SC@SDUSC Zxing开源代码(九)Data Matrix二维码(二)
- 科海思苯酚吸附树脂ADS600详情 参数
- ViewBinding使用详解
- 显卡天梯图2020年10月完整版
- 如何让laravel框架下出现vender文件夹
- 可以将 UI 设计图直接生成代码,简直太神奇了,这真的是解放了程序员生产力吗?...
- 使用pymysql报错:pymysql.err.InternalError: Packet sequence number wrong - got 5 expected 1
- 2022危化品企业双重预防机制数字化建设成为迫切任务
- 【论文笔记】Crop phenotyping in a context of Global Change: what to measure and how to do it
热门文章
- php 两次post,ajax跨域往php程序post数据时,php程序总是执行两次的解决办法
- python语言程序设计基础第二版第六章答案-python语言程序设计基础(第二版)第五章答案随笔...
- python语言编程入门先学什么-自学编程入门,先学什么语言好?
- python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
- python代码案例详解-Python综合应用名片管理系统案例详解
- python语言简介-Python语言介绍
- python学习手册条件-总算晓得python学习手册正式版
- 0基础学python-如何从零基础自学Python?
- 零基础自学python的app-零基础转行Python,为什么有些人自学几天就放弃了?
- python的简单编程-python入门脚本的简单示例