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


推荐阅读
  • Spring Boot与Graylog集成实现微服务日志聚合与分析
    本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ... [详细]
  • RocketMQ 运维监控实践指南
    本文详细介绍了如何实现 RocketMQ 的运维监控,包括监控平台的搭建、常用运维命令及其具体用法。适合对 RocketMQ 监控感兴趣的读者参考。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • spring(22)JdbcTemplate
    2019独角兽企业重金招聘Python工程师标准###1.导入jar包,必须jar包:c3p0、mysql-connector、beans、con ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
  • Spring Cloud 学习指南:初学者入门篇
    Spring Cloud 学习指南:初学者入门篇 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在本篇学习指南中,我们将探讨 Spring Cloud 2020 版本中的技术选型和版本选择策略。具体来说,我们将详细介绍如何在项目中选用 Spring Boot 和 Spring Cloud 的最佳组合。本文以 Spring Boot 2.2.2 为例,结合实际应用场景,提供详细的配置和使用建议,帮助开发者更好地理解和应用这些框架。此外,我们还将讨论不同版本之间的兼容性和升级路径,确保项目能够平稳过渡到最新版本。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
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社区 版权所有