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相关推荐

  1. 微服务限流Sentinel讲解(二)

    2.1.Sentinel介绍和安装 2.1.1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件.官网地址:home Sentinel 具有以下特征: •丰富的应用场景:S ...

  2. SpringCloud 微服务监控方案sentinel + spring boot admin

    SpringCloud 微服务监控方案sentinel + spring boot admin 前言:项目基于springcloud框架,服务注册中心使用的是Eureka spring boot ad ...

  3. 海量数据大课学习笔记(7)-商用短链平台实战-账号微服务+流量包设计-滴课堂

    文章目录 前言 第1集 账号微服务和流量包数据库表+索引规范讲解<上> 第2集 账号微服务和流量包数据库表+索引规范讲解<下> 第3集 账号微服务-流量包业务模型概念补充 第4 ...

  4. SpringCloud微服务组件:Sentinel限流熔断

    点击关注公众号,实用技术文章及时了解 前言 什么是雪崩问题? 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况. 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请 ...

  5. 微服务限流Sentinel讲解(一)

    1.Sentinel使用的基本场景 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务. 如图,如果服务提供者I发生了故障,当前的应 ...

  6. 微服务限流Sentinel讲解(五)

    授权规则可以对请求方来源做判断和控制. 4.1.授权规则 4.1.1.基本规则 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式. 白名单:来源(origin)在白名单内的调用者允许访问 黑 ...

  7. 微服务限流Sentinel讲解(四)

    3.隔离和降级 限流是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障. 而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了. ...

  8. 微服务限流Sentinel讲解(三)

    3.3.流控效果 在流控的高级选项中,还有一个流控效果选项: 流控效果是指请求达到流控阈值时应该采取的措施,包括三种: 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常. ...

  9. 阿里巴巴开源力作(二)--分布式流量卫兵Sentinel简介及控制台安装

    文章目录 简介 控制台的安装 Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性 ...

最新文章

  1. Qt选择文件对话框-中文路径-转std::string
  2. 数据结构特性解析 (一) 数组
  3. Linux中profile、bashrc、bash_profile之间的区别和联系
  4. CodeForces - 1366E Two Arrays(组合数学+思维)
  5. android中多态的应用_动态代理原理及在 Android 中的应用
  6. C# 读取Excel CSV 类型文件到DataSet中,反之从DataSet写入excel
  7. 学习web前端还是UI?先了解Web前端和UI的区别是什么?在选择
  8. 计算机组成原理课后答案(唐朔飞第三版) 第二章
  9. 朱丹超级搜索术笔记:百度搜索相关的技巧
  10. DTCC 干货分享:Real Time DaaS - 面向TP+AP业务的数据平台架构
  11. Oliver的救援(广搜练习题)
  12. canvas绘图有锯齿毛边问题的解决
  13. 实测百度如流:精致又豪横! AI协同办公应有的样貌
  14. TreeView的图标个性化和动态数据加载
  15. 用python计算圆柱体的体积和表面积_Java圆柱体表面积和体积计算代码实例
  16. 贝茜的报复(dfs + 位运算)
  17. 关系型数据库和非关系型数据库简单介绍:
  18. 作业二:词云制作 使用软件wordart
  19. Helm:问题对应:k3s下使用helm 3提示Kubernetes cluster unreachable
  20. 遥控定时小夜灯芯片,充电遥控小夜灯PCBA控制板,遥控小台灯

热门文章

  1. 五四青年节。无奋斗,不青春!
  2. [开源]爱发布类似fir.im和蒲公英的App发布平台
  3. db2取数据库日期时间_DB2日期和时间函数汇总
  4. ubuntu查看 固态硬盘位置_在Ubuntu(Linux)中启用固态硬盘(固态硬盘)TRIM | MOS86...
  5. 【 rbx1翻译 第七章、控制移动基座】第二节、运动控制级别
  6. Arduino小白的学习历程
  7. 网络-数据链路层回顾
  8. 文件监控(二) 代码
  9. 百度微笑起航将人脸识别玩出新高度
  10. vue组件读取static文件夹内json文件的图片路径问题