热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloudAlibaba系列微服务搭建笔记三_Sentinel

目录儿六 、流量控制框架-Sentinel6.1 Sentinel 简介6.2 下载运行Sentinel控制台6.3 搭建一个Sentinel测试项目6.4 添加对应配置6.5 访问消费者测试接口6.

目录儿

  • 六 、流量控制框架-Sentinel
    • 6.1 Sentinel 简介
    • 6.2 下载运行Sentinel控制台
    • 6.3 搭建一个Sentinel测试项目
    • 6.4 添加对应配置
    • 6.5 访问消费者测试接口
    • 6.6 使用Sentinel常用规则
      • 6.6.1 流控规则
      • 6.6.2 降级规则
      • 6.6.3 系统规则
      • 6.6.4 授权规则
    • 6.7 使用@SentinelResource注解
      • 6.7.1 blockHandler 属性-指定限制响应方法
      • 6.7.2 热点规则
      • 6.7.3 fallback 属性-指定业务异常响应方法
      • 6.7.4 代码优化
    • 6.8 Sentinel持久化
      • 6.8.1 持久化流控规则
      • 6.8.2 持久化降级规则
      • 6.8.2 持久化系统规则


六 、流量控制框架-Sentinel

6.1 Sentinel 简介

Sentinel是阿里开源的流量控制框架,从限流、降级、熔断、三个维度保护服务;
基于上游服务和下游服务这一情景&#xff0c;再去了解这三个限流维度&#xff08;维度&#xff1a;限流 <降级 <熔断&#xff09;&#xff1b;每个服务都是通过接口对外提供服务&#xff0c;客户端请求服务和服务之间的相互调用&#xff0c;当服务的访问流量QPS到达指定量级就会触发相应的流控规则。

  • 限流&#xff1a;对服务资源的访问流量实行限制措施&#xff0c;单位时间内只允许一定量的访问通过&#xff0c;一般是让溢出的访问排队等候。
  • 降级&#xff1a;当服务出现故障或者出现其他不能提供服务的情况下&#xff0c;返回预设的静态数据或页面&#xff0c;给予友好提示。即使心已经碎了&#xff0c;也要面露微笑。
  • 熔断&#xff1a;直接拒绝访问。

6.2 下载运行Sentinel控制台

下载地址&#xff1a;https://github.com/alibaba/Sentinel/releases
这里下载了1.7.1版本的jar包&#xff0c;下载完直接运行就好&#xff0c;账号密码都是sentinel
默认端口是8080&#xff0c;可以用-Dserver.port&#61;xxxx指定端口。

访问仪表盘可以看到目前是没有数据的状态&#xff0c;因为还没有任何服务和它交互。
在这里插入图片描述

6.3 搭建一个Sentinel测试项目

链接&#xff1a;搭建一个Sentinel测试项目

6.4 添加对应配置

直接在Nacos上添加配置
在这里插入图片描述

custom:info: sentinel-sample provider

custom:info: sentinel-sample consumer

6.5 访问消费者测试接口

http://localhost:8041/test
http://localhost:8041/getConfig在这里插入图片描述
可以看到Sentinel仪表盘监控到了访问。组件测试没问题。

6.6 使用Sentinel常用规则


6.6.1 流控规则

链接&#xff1a;流控规则

6.6.2 降级规则

Sentinel降级主要有三个策略&#xff1a;RT异常比例异常数
链接&#xff1a;降级规则

6.6.3 系统规则

前面的流控规则和降级规则都是针对单个资源而言
系统规则则是针对整个应用服务的流量控制规则
在这里插入图片描述
它有四种阈值类型&#xff1a;

  • LOAD&#xff1a;负载&#xff0c;当系统负载超过阈值&#xff0c;就会触发保护机制&#xff08;LOAD规则只能在LinuxUnix-like系统上生效&#xff09;
  • RT&#xff1a;当整个应用所有资源的平均响应时间达到阈值&#xff0c;触发保护机制。
  • 线程数&#xff1a;当整个应用的并行请求数达到设定阈值&#xff0c;触发保护机制。
  • 入口QPS&#xff1a;当整个应用的请求数达到阈值&#xff0c;触发保护机制。

6.6.4 授权规则

链接&#xff1a;授权规则

6.7 使用&#64;SentinelResource注解

前面的Sentinel常用规则主要是用Sentinel控制面板上的一些规则、参数去配置限流保护
还有一种能够实现定制化保护&#xff0c;实现更细粒度的规则保护&#xff0c;那就是在代码层面用&#64;SentinelResource定制自己的流控规则。

说人话&#xff0c;&#64;SentinelResource可以贴在接口上面&#xff0c;指定接口限流时做的操作&#xff08;比如自定义返回的提示内容&#xff09;&#xff0c;这样就做到了每个接口都能够有自己的限流提示信息。而不是返回Sentinel默认的Block By Sentinel(flow limiting)


6.7.1 blockHandler 属性-指定限制响应方法

链接&#xff1a;blockHandler属性

6.7.2 热点规则

链接&#xff1a;热点规则

6.7.3 fallback 属性-指定业务异常响应方法

fallback属性和上面的blockHandler 属性都是用来指定处理方法的&#xff0c;它指定的是业务代出现异常后的处理方法&#xff0c;当业务报出异常就会进入指定的方法响应请求。

&#64;RequestMapping("/fallBackTest")&#64;SentinelResource(value &#61; "fallBackTest", fallback &#61; "fallBackHandler")public String fallBackTest(String param) {int i &#61; 1 / 0;return "return from fallBackTest";}

异常响应方法

public String fallBackHandler(String param, BlockException blockException) {return "return from customfallBackHandler" &#43; RandomUtils.nextInt();}

因为有int i &#61; 1 / 0&#xff0c;所以接口必报算术异常&#xff0c;进入fallBackHandler()方法响应请求。

如果没有生效有可能是版本问题&#xff0c;1.6.0之前的版本不能针对业务异常进行处理。


blockHandlerfallback属性是可以一起用的&#xff0c;当达到阈值时直接进入blockHandler指定的限制响应方法&#xff1b;当没有达到阈值&业务出现异常时&#xff0c;直接执行fallback指定的异常响应方法。


如果有想要忽略的异常不想交由blockHandler指定的限制响应方法处理&#xff0c;可以用exceptionsToIgnore属性指定。
如&#xff1a;&#64;SentinelResource(value &#61; "fallBackTest", fallback &#61; "fallBackHandler",exceptionsToIgnore &#61; {RuntimeException.class})&#xff0c;表示忽略RuntimeException.class类型的异常。


6.7.4 代码优化

在上面对于blockHandlerfallback属性的使用&#xff0c;其指定的方法都放在了Controller中&#xff0c;这样会显得非常凌乱
这时候可以使用另外两个对应的属性fallbackClassblockHandlerClass来优化代码结构。
首先定义fallbackClass指定的异常响应类&#xff1a;

public class FallBackHandler {public static String fallBackHandler(String param, BlockException blockException) {return "return from customfallBackHandler" &#43; RandomUtils.nextInt();}
}

注意&#xff1a;方法必须用static修饰。

同理定义限制响应类

public class CustomBlockHandler {public static String customBlockHandler(String param, BlockException blockException) {return "return from customBlockHandler" &#43; RandomUtils.nextInt();}
}

绑定资源&#xff0c;指定响应类&#xff0c;指定响应方法名

&#64;RequestMapping("/test")&#64;SentinelResource(value &#61; "fallBackTest", blockHandlerClass &#61; {CustomBlockHandler.class},blockHandler &#61; "customBlockHandler",fallbackClass &#61; {FallBackHandler.class},fallback &#61; "fallBackHandler")public String fallBackTest(String param) {int i &#61; 1 / 0;return "return from fallBackTest";}

6.8 Sentinel持久化

Sentinel支持多种持久化方案&#xff1a;

  • 存储到文件
  • 使用Redis存储
  • 使用Nacos存储
  • 使用Zookeeper存储
  • 使用Apollo存储

因为NacosSentinel同属于SpringCloudAlibaba&#xff0c;因此我选择用nacos

配置nacos数据源:
加入nacos数据源依赖

<dependency><groupId>com.alibaba.cspgroupId><artifactId>sentinel-datasource-nacosartifactId>dependency>

6.8.1 持久化流控规则


  1. 增加数据源配置
    修改bootstrap.yml配置文件&#xff08;一下只是修改部分的配置&#xff09;

spring:application:name: sentinel-consumer # 应用名cloud:sentinel:transport:port: 8719 # 启动一个端口为8719的 Http Server 与仪表盘进行交互&#xff0c;dashboard: 127.0.0.1:8051 # 仪表盘datasource: # 新增datasource1: # 新增 自定义数据源名字nacos: # 新增 数据源类型server-addr: 124.221.89.200:8848 # 新增 nacos 服务地址dataId: sentinel-consumer-datasource1 # 新增 对应nacos上配置的IDgroupId: DEFAULT_GROUP # 新增 对应nacos上配置所在的组data-tupe: json # 新增 对应nacos上配置的类型rule-type: flow # 新增 flow 表示流控规则

  1. nacos上添加配置
    在这里插入图片描述

[{"resource":"/test","limitApp":"default","grade":1,"count":1,"strategy":0,"controlBehavior":0,"clusterMode":false}
]

说明&#xff1a;
resource&#xff1a;资源名称
limitApp&#xff1a;限制来源
grade&#xff1a;阈值类型&#xff08;0-线程数1-QPS&#xff09;
count&#xff1a;阈值
strategy&#xff1a;流控模式&#xff08;直接、关联、链路&#xff09;
controlBehavior&#xff1a;流控效果&#xff08;快速失败、Warm Up、排队等待&#xff09;
clusterMode&#xff1a;是否集群


对应的Bean类为com.alibaba.csp.sentinel.slots.block.flow.FlowRule

public class FlowRule extends AbstractRule {private int grade &#61; 1;private double count;private int strategy &#61; 0;private String refResource;private int controlBehavior &#61; 0;private int warmUpPeriodSec &#61; 10;private int maxQueueingTimeMs &#61; 500;private boolean clusterMode;private ClusterFlowConfig clusterConfig;private TrafficShapingController controller;...
}

这样子无论是重启Sentinel控制台还是重启应用服务都不会丢失流控设置。

6.8.2 持久化降级规则

上面配置了一个流控规则的持久化库
现在配置一个降级规则的持久化库&#xff0c;因为已经导入依赖了&#xff0c;直接加配一个数据源即可

  1. 修改bootstrap.yml配置文件&#xff08;一下只是修改部分&#xff09;

spring:application:name: sentinel-consumer # 应用名cloud:sentinel:transport:port: 8719 # 启动一个端口为8719的 Http Server 与仪表盘进行交互&#xff0c;dashboard: 127.0.0.1:8051 # 仪表盘datasource:datasource1:nacos:server-addr: 124.221.89.200:8848dataId: sentinel-consumer-datasource1groupId: DEFAULT_GROUPdata-tupe: jsonrule-type: flowdatasource2: # 新增nacos: # 新增server-addr: 124.221.89.200:8848 # 新增dataId: sentinel-consumer-datasource2 # 新增groupId: DEFAULT_GROUP # 新增data-tupe: json # 新增rule-type: degrade # 新增 degrade 表示降级规则

  1. nacos上添加配置
    在这里插入图片描述

[{"resource":"/test","limitApp":"default","grade":2,"count":1,"timeWindow":3}
]

timeWindow&#xff1a;时间窗口

这样降级数据源也配置好了

对应的Bean类为com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

public class DegradeRule extends AbstractRule {private int grade &#61; 0;private double count;private int timeWindow;private int minRequestAmount &#61; 5;private double slowRatioThreshold &#61; 1.0D;private int statIntervalMs &#61; 1000;...
}


6.8.2 持久化系统规则

一样的&#xff0c;也是在bootstrap.yml配置文件中新配置一个数据源

spring:application:name: sentinel-consumer # 应用名cloud:sentinel:transport:port: 8719 # 启动一个端口为8719的 Http Server 与仪表盘进行交互&#xff0c;dashboard: 127.0.0.1:8051 # 仪表盘datasource:datasource1:nacos:server-addr: 124.221.89.200:8848dataId: sentinel-consumer-datasource1groupId: DEFAULT_GROUPdata-tupe: jsonrule-type: flowdatasource2:nacos:server-addr: 124.221.89.200:8848dataId: sentinel-consumer-datasource2groupId: DEFAULT_GROUPdata-tupe: jsonrule-type: degradedatasource3: # 新增nacos: # 新增server-addr: 124.221.89.200:8848 # 新增dataId: sentinel-consumer-datasource3 # 新增groupId: DEFAULT_GROUP # 新增data-tupe: json # 新增 rule-type: system # 新增 system 表示系统规则

nacos创建对应配置
在这里插入图片描述

系统规则属性&#xff1a;
avgRt&#xff1a;系统平均响应时间
highestCpuUsage&#xff1a;CPU使用率
highestSystemLoad&#xff1a;负载
maxThread&#xff1a;最大业务线程数
qps&#xff1a;每秒处理请求数


对应的Beancom.alibaba.csp.sentinel.slots.system.SystemRule

public class SystemRule extends AbstractRule {private double highestSystemLoad &#61; -1.0D;private double highestCpuUsage &#61; -1.0D;private double qps &#61; -1.0D;private long avgRt &#61; -1L;private long maxThread &#61; -1L;...
}


持久化注意事项&#xff1a;

  1. Sentinel的持久化相当于直接从数据源拉取配置创建规则&#xff0c;所以更改Nacos上的配置Sentinel规则会即时生效&#xff0c;重启也不会丢失。
  2. 修改Sentinel上的配置而没有修改Nacos数据源上的配置&#xff0c;重启会丢失&#xff0c;因为修改并不会自动同步到Nacos上。

承上&#xff1a;SpringCloudAlibaba系列微服务搭建笔记二_RestTemplate&#43;Ribbon
启下&#xff1a;待续
请添加图片描述


推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
author-avatar
晴晴qing951025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有