热门标签 | 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;待续
请添加图片描述


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
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社区 版权所有