微服务流量卫兵 Sentinel
1 定义概述
啥是流量,啥又是防卫兵呢?
在分布式系统中,流量注定是越来越大的,在每一秒钟都可能处理上百万乃至千万的请求,设想一下服务器宕掉,那对于用户而言,体验肯定是非常坏的;所以我们为了保证 可用性,我们需要有一款流量控制工具,能够帮助我们进行操作。
1.1 sentinel
- 阿里巴巴开源的分布式流量控制工具
- 丰富的应用场景:流量的削峰填谷、集群流量控制、实时熔断下游不可应用。
- 具备可视化平台,具备实时监控功能
Github 学习文档:Sentinel 文档
在使用 Sentinel 之前,我们需要熟悉 其中的两个内容,也是它的核心概念
- 资源:是Sentinel 的核心概念之一,可以是你程序中的任何内容,也可以是某一个服务甚至小到一个方法,在 sentinel 中,它都是一个资源。
- 规则:我们要以怎样的方式来保护资源,他是我们定义的规则,流控规则,熔断降级规则等
1.3 sentinel 的组成
sentinel 分为两个部分,核心库(Java 客户端)和控制台(Dashboard)
核心库:能运行所有的Java 运行时环境,同时对于其他的框架具有很好的兼容度
控制台: 基于 Springboot 开发的应用,不需要额外的Tomcat容器。
2. 引入 Sentinel 并搭建
2.1 导入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
控制台的相关文档:(https://github.com/alibaba/Sentinel/wiki)
2.2 启动部署
//-Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080
//默认用户名和密码都是 sentinel
// 启动指令
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar如何判断在线呢?
采用心跳检测机制,sentinel 客户端会发送心跳包,判断机器是否在线
sentinel 控制台主界面
2.4 配置使用
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8080 port: 9999
#dashboard: 8080 控制台端口
#port: 9999 本地启的端口,随机选个不能被占用的,与dashboard进行数据交互,会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互, 若被占用,则开始+1一次扫描
- Sentinel 是懒加载模式,因此不会配置就生效,而是需要访问服务,才能被控制台发现
3. 熔断的状态与恢复
服务熔断一般有三种状态:
熔断关闭(closed)
服务没有故障,熔断器所处的状态,对调用方的状态没有任务限制
熔断开启(open)
后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
半熔断(half - open)
所谓半熔断,就是说在隔一段时间之后,系统会恢复正常调用
熔断恢复
经过熔断时长后,熔断器会进入探测恢复状态,尝试恢复服务调用,允许有限的流量对该服务进行调用,同时会进行监控成功率;
如果成功率达到预期,说明服务已经恢复,进入熔断关闭的状态,如果成功率仍旧很低,则重新进入熔断状态。
4. Sentinel 自定义异常
微服务的数据交互都是json格式,而初始的熔断信息是一段英文,这样对于调用方来说非常不友好,因此我们可以将异常定义成json格式的异常信息
Alibaba Cloud 2.2 之后的新版写法
@Component
public class UrlBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {//降级业务处理}
}
4.1 异常种类的总结
FlowException #限流异常
DegradeException #降级异常
ParamFlowException #参数限流异常
SystemBlockException #系统负载异常
AuthorityException #授权异常
因此我们可以在 Handler 中的 降级业务处理 中书写如下代码段:
Map<String,Object> backMap=new HashMap<>();if (e instanceof FlowException){backMap.put("code",-1);backMap.put("msg","限流-异常啦");}else if (e instanceof DegradeException){backMap.put("code",-2);backMap.put("msg","降级-异常啦");}else if (e instanceof ParamFlowException){backMap.put("code",-3);backMap.put("msg","热点-异常啦");}else if (e instanceof SystemBlockException){backMap.put("code",-4);backMap.put("msg","系统规则-异常啦");}else if (e instanceof AuthorityException){backMap.put("code",-5);backMap.put("msg","认证-异常啦");}// 设置返回json数据httpServletResponse.setStatus(200);httpServletResponse.setHeader("content-Type","application/json;charset=UTF-8");httpServletResponse.getWriter().write(JSON.toJSONString(backMap));
5. Sentinel 整合 Feign
依旧按照 微服务系列文章所沿用的,视频订单 项目例子
添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在配置文件的 Feign 中开启对 Sentinel 的支持
feign:sentinel:enabled: true
在service包中 准备容错service ,Fallback()(即当出现熔断式要返回给调用方什么数据)
@Service
public class VideoServiceFallback implements VideoService {@Overridepublic Video findById(int videoId) {Video video = new Video();video.setTitle("这个是Fallback里面的视频");return video;}@Overridepublic int save(Video video) {return 0;}
}
然后在 FeigClient 的注解中声明好 上面的 Fallback类
@FeignClient(value = "xdclass-video-service", fallback = VideoServiceFallback.class)
微服务流量卫兵 Sentinel相关推荐
- 微服务限流Sentinel讲解(二)
2.1.Sentinel介绍和安装 2.1.1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件.官网地址:home Sentinel 具有以下特征: •丰富的应用场景:S ...
- SpringCloud 微服务监控方案sentinel + spring boot admin
SpringCloud 微服务监控方案sentinel + spring boot admin 前言:项目基于springcloud框架,服务注册中心使用的是Eureka spring boot ad ...
- 海量数据大课学习笔记(7)-商用短链平台实战-账号微服务+流量包设计-滴课堂
文章目录 前言 第1集 账号微服务和流量包数据库表+索引规范讲解<上> 第2集 账号微服务和流量包数据库表+索引规范讲解<下> 第3集 账号微服务-流量包业务模型概念补充 第4 ...
- SpringCloud微服务组件:Sentinel限流熔断
点击关注公众号,实用技术文章及时了解 前言 什么是雪崩问题? 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况. 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请 ...
- 微服务限流Sentinel讲解(一)
1.Sentinel使用的基本场景 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务. 如图,如果服务提供者I发生了故障,当前的应 ...
- 微服务限流Sentinel讲解(五)
授权规则可以对请求方来源做判断和控制. 4.1.授权规则 4.1.1.基本规则 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式. 白名单:来源(origin)在白名单内的调用者允许访问 黑 ...
- 微服务限流Sentinel讲解(四)
3.隔离和降级 限流是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障. 而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了. ...
- 微服务限流Sentinel讲解(三)
3.3.流控效果 在流控的高级选项中,还有一个流控效果选项: 流控效果是指请求达到流控阈值时应该采取的措施,包括三种: 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常. ...
- 阿里巴巴开源力作(二)--分布式流量卫兵Sentinel简介及控制台安装
文章目录 简介 控制台的安装 Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性 ...
最新文章
- Qt选择文件对话框-中文路径-转std::string
- 数据结构特性解析 (一) 数组
- Linux中profile、bashrc、bash_profile之间的区别和联系
- CodeForces - 1366E Two Arrays(组合数学+思维)
- android中多态的应用_动态代理原理及在 Android 中的应用
- C# 读取Excel CSV 类型文件到DataSet中,反之从DataSet写入excel
- 学习web前端还是UI?先了解Web前端和UI的区别是什么?在选择
- 计算机组成原理课后答案(唐朔飞第三版) 第二章
- 朱丹超级搜索术笔记:百度搜索相关的技巧
- DTCC 干货分享:Real Time DaaS - 面向TP+AP业务的数据平台架构
- Oliver的救援(广搜练习题)
- canvas绘图有锯齿毛边问题的解决
- 实测百度如流:精致又豪横! AI协同办公应有的样貌
- TreeView的图标个性化和动态数据加载
- 用python计算圆柱体的体积和表面积_Java圆柱体表面积和体积计算代码实例
- 贝茜的报复(dfs + 位运算)
- 关系型数据库和非关系型数据库简单介绍:
- 作业二:词云制作 使用软件wordart
- Helm:问题对应:k3s下使用helm 3提示Kubernetes cluster unreachable
- 遥控定时小夜灯芯片,充电遥控小夜灯PCBA控制板,遥控小台灯
热门文章
- 五四青年节。无奋斗,不青春!
- [开源]爱发布类似fir.im和蒲公英的App发布平台
- db2取数据库日期时间_DB2日期和时间函数汇总
- ubuntu查看 固态硬盘位置_在Ubuntu(Linux)中启用固态硬盘(固态硬盘)TRIM | MOS86...
- 【 rbx1翻译 第七章、控制移动基座】第二节、运动控制级别
- Arduino小白的学习历程
- 网络-数据链路层回顾
- 文件监控(二) 代码
- 百度微笑起航将人脸识别玩出新高度
- vue组件读取static文件夹内json文件的图片路径问题