热门标签 | 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 Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • Spring Boot 入门指南
    本文介绍了Spring Boot的基本概念及其在现代Java应用程序开发中的作用。Spring Boot旨在简化Spring应用的初始设置和开发过程,通过自动配置和约定优于配置的原则,帮助开发者快速构建基于Spring框架的应用。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文精选了 GitHub 上由个人维护且获得大量 Star 的 Spring Boot 学习项目,适合初学者和技术爱好者参考。 ... [详细]
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
    go,通过,map,filter,foreach,等,流,式,ap ... [详细]
  • 近期,公司在构建新的交易系统时遇到了一个常见的问题——金额存储。由于涉及资金的操作需要高度的准确性,使用float类型进行金额计算可能会导致不可预见的误差。本文将深入探讨这一问题,并提供解决方案。 ... [详细]
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社区 版权所有