【cloud Alibaba】(三)流量控制、熔断降级(下)——Sentinel

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡Sentinel知识点速览

  • 🍹 @SentinelResource注解
    • 🍸 如何使用@SentinelResource
    • 🍸 代码优化
  • 🍹 进阶属性配置
    • 🍸 fallback和blockHandler
    • 🍸 OpenFeign熔断
  • 🍹 配置持久化

🍹 @SentinelResource注解

  之前有关Sentinel的案例中,一旦违反限流规则后,都是用sentinel系统默认的提示: Blocked by Sentinel (flow limiting),我们还可以使用@SentinelResource注解来实现像hystrix一样的兜底降级方法

🍸 如何使用@SentinelResource

  只需要使用@SentinelResource注解,value属性为保证唯一使用映射名,blockHandler使用的是兜底方法的名,兜底方法的参数列表上也要加上BlockException对象

@GetMapping("/byResource")
@SentinelResource(value = "byResource", blockHandler = "handleException")
public CommonResult byResource() {return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001"));
}public CommonResult handleException(BlockException exception) {return new CommonResult(444, exception.getClass().getCanonicalName() + "\t 服务不可用");
}

@SentinelResource注解只能对不符合配置规则的异常进行熔断降级,但是如果出现其他异常(运行时异常…)还是会直接返回错误页面
在这里插入图片描述
此时,超出阈值之后就会调用兜底方案
在这里插入图片描述
规则配置的资源名称:如果是映射路径的话降级就会返回默认的页面,就算下面 @SentinelResource注解配置的有兜底方案也不会执行;如果是@SentinelResource注解的value值,有兜底方案就会执行兜底,没有的话返回默认

🍸 代码优化

  上述的代码编辑像极了hystrix,每一个方法都要对应一个兜底方案,显得接口和兜底方案耦合度很高

  定义一个公共的兜底方案类CustomerBlockHandler,里面有很多的兜底方案,兜底方案定义的时候要使用static修饰

public class CustomerBlockHandler {public static CommonResult handlerException1(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----1");}public static CommonResult handlerException2(BlockException exception) {return new CommonResult(4444, "按客戶自定义,global handlerException----2");}
}

  controller中的接口如果想使用该类中的某个方法作为兜底方法的话,就可以使用@SentinelResource注解配置(以handlerException2为例)

@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException2")
public CommonResult customerBlockHandler() {return new CommonResult(200, "按客戶自定义", new Payment(2020L, "serial003"));
}

🍹 进阶属性配置

🍸 fallback和blockHandler

  学习完sentinel的流控、熔断、热点配置之后,项目中的异常大概就能被分为两种,一种是业务代码出现的异常诸如运行时异常等,还有一种就是不符合sentinel规则的BlockException。对应这两种异常,@SentinelResource注解有fallback和blockHandler两种属性可以分别指定兜底方案

  如果@SentinelResource注解中设置哪个属性的话,哪种异常就会走配置的兜底方案方法。都不设置的话就是业务异常走默认的Whitelabel Error Page,或者sentinel规则异常的默认提示: Blocked by Sentinel (flow limiting)。都设置的话,两种异常都满足的情况下走blockHandler的兜底方案

异常忽略属性

  异常忽略属性exceptionsToIgnore可以配置可忽略的异常类,也就是说当程序出现该异常时就算配置了fallback也不会走对应的兜底方案。完整的@SentinelResource注解参考如下代码

@SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",exceptionsToIgnore = {IllegalArgumentException.class, IndexOutOfBoundsException.class})

🍸 OpenFeign熔断

  在学习如何使用sentinel进行OpenFeign的熔断之前,先让我们复习一下OpenFeign服务调用的使用流程:
(1)引入相关依赖

<!--SpringCloud openfeign -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)配置文件激活Sentinel对OpenFeign的支持(只有使用sentinel进行OpenFeign的熔断才需配置,其他情况下使用OpenFeign配置文件无需进行特有配置)

# 激活Sentinel对Feign的支持
feign:sentinel:enabled: true

(3)主启动类开启OpenFeign支持

@EnableFeignClients

(4)service接口使用@FeignClient注解的value指定调用接口所在微服务名,fallback 指定兜底方案, @GetMapping注解指定调用接口的映射路径,接口定义和 @GetMapping注解直接从被调用接口controller方法上注解复制即可

@FeignClient(value = "nacos-payment-provider", fallback = PaymentFallbackService.class)
public interface PaymentService {@GetMapping(value = "/paymentSQL/{id}")CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}

(5)fallback 指定的兜底方案,@Component注解注册进spring容器,实现原接口后重写方法为兜底方案

@Component
public class PaymentFallbackService implements PaymentService {@Overridepublic CommonResult<Payment> paymentSQL(Long id) {return new CommonResult<>(44444, "服务降级返回,---PaymentFallbackService", new Payment(id, "errorSerial"));}
}

(6)controller接口正常调用service接口的方法

@Resource
private PaymentService paymentService;@GetMapping(value = "/consumer/paymentSQL/{id}")
public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id) {return paymentService.paymentSQL(id);
}

🍹 配置持久化

  sentinel中配置的流控、熔断、热点key规则,一旦应用进行重启之后就会消失,但是生产开发的时候需要将这些配置规则进行持久化,避免很多的配置规则再重启后重新配置。这又使用到了Nacos

将sentinel规则持久化进nacos

  第一步: 引入相关依赖

<!--SpringCloud ailibaba sentinel-datasource-nacos-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

  第二步: 配置文件配置数据库相关

spring:cloud:sentinel:datasource:ds1:nacos:server-addr: localhost:8848dataId: cloudalibaba-sentinel-servicegroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow

  第三步: 根据配置文件的dataId值在nacos新建一个配置,配置的值为sentinel规则对应的值在这里插入图片描述

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

resource: sentinel的资源名;
limitApp: 来源应用;
grade: 阈值类型,0表示线程数,1表示QPS;
count: 单机阈值;
strategy: 流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior: 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode: 是否集群。

这样配置上之后就可以实现sentinel规则的持久化,也就是说重启服务之后规则还在,但是只限配置之后的sentinel的规则,未配置的规则依然会在重启之后消失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python gui入门的例子_Python GUI编程之Tkinter入门之道

相信刚学习使用Python进行GUI编程的时候&#xff0c;肯定都会听过Tkinter&#xff0c;毕竟是standard Python interface to the Tk GUI toolkit.用来写一些小程序还是很方便的。但如果是刚接触GUI编程的话肯定是被官方文档搞的有些懵&#xff0c;毕竟还没弄清楚套路。之前使用过…

@async 默认线程池_SpringBoot 线程池的使用

Java大联盟帮助万千Java学习者持续成长关注作者&#xff5c;Musclehengblog.csdn.net/Muscleheng/article/details/81409672前言最近在做订单模块&#xff0c;用户购买服务类产品之后&#xff0c;需要进行预约&#xff0c;预约成功之后分别给商家和用户发送提醒短信。考虑发短信…

mysql 横向扩展 中间件_mysql-proxy数据库中间件架构 | 架构师之路

一、mysql-proxy简介mysql-proxy是mysql官方提供的mysql中间件服务&#xff0c;上游可接入若干个mysql-client&#xff0c;后端可连接若干个mysql-server。它使用mysql协议&#xff0c;任何使用mysql-client的上游无需修改任何代码&#xff0c;即可迁移至mysql-proxy上。mysql-…

python selenium对象怎么序列化_python selenium爬取斗鱼

不加延迟报错selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”.//span[class”DyListCover-hot”]”}(Session info: chrome80.0.3987.122)最开始以为是版本问题&#xff0c;不…

神经网络的全连接层_深度神经网络全连接层

一、概念全连接层一般在网络的最后部分做分类输出&#xff0c;全连接层的有m个输入和n个输出&#xff0c;每一个输出都和所有的输入相连&#xff0c;相连的权重w都是不一样的&#xff0c;同时每一个输出还有一个bias。二、前向全连接假设输入是4&#xff0c;输出是4&#xff0c…

vs 选定内容没有属性页_从智能单品,到全屋智能:2019中国智能家居发展白皮书【附82页PPT】...

2019年&#xff0c;智能家居行业在技术、市场和行业的变革中迎接新的挑战和机遇。一方面&#xff0c;AI、IoT、边缘计算全面赋能智能家居&#xff1b;另一方面&#xff0c;中国的房地产行业正在从上半场的“增量开发”&#xff0c;切换到下半场的“存量经营”、“楼盘精装化”政…

python决策树的应用_机器学习-决策树实战应用

1.下载2.安装&#xff1a;双击3.创建桌面快捷方式安装目录\bin文件夹\&#xff1a;找到gvedit.exe文件右键 发送到桌面快捷方式&#xff0c;如下图&#xff1a;4.配置环境变量将graphviz安装目录下的bin文件夹添加到Path环境变量中&#xff1a;5.验证是否安装并配置成功进入win…

【SSM面向CRUD编程专栏 3】关于黑马程序员最全SSM框架教程视频,P37集老师跳过的模块创建以及tomcat下载安装配置和运行等诸多问题

写在前面&#xff1a;​ 本人是在学习B站黑马程序员SSM框架教程视频的时候在P37集遇到了问题&#xff0c;如果不解决还没办法往下接着听&#xff0c;老师跳过的模块创建以及tomcat下载安装配置和运行等诸多问题&#xff0c;全在这篇博客中得到了解决 &#x1f622;解决上…

python人脸识别源码_Python 抖音机器人,让你找到漂亮小姐姐

本项目作者沉迷于抖音无法自拔&#xff0c;常常花好几个小时在抖音漂亮小姐姐身上。本着高效、直接地找到漂亮小姐姐的核心思想&#xff0c;我用 Python ADB 做了一个 Python 抖音机器人 Douyin-Bot。特性自动翻页颜值检测人脸识别自动点赞自动关注随机防 Ban自动评论原理打开…

thinkphp josn mysql_ThinkPHP:JSON字段类型的使用(ORM)

ThinkPHP5.1版本正式发布已经有一段时间了&#xff0c;我会陆续给大家介绍其中的新特性。今天要给大家介绍的是一个可能很多用户还不了解的一个特性&#xff1a;JSON字段数据支持。不过首先注意一点&#xff0c;本篇内容中描述的JSON字段数据的支持是从V5.1.4版本引入的。由于包…

获取http地址如何从上面抓取图片_用 Python 自动抓取妹子图

目录前言Media Pipeline启用Media Pipeline使用 ImgPipeline抓取妹子图瞎比比与送书后话前言我们在抓取数据的过程中&#xff0c;除了要抓取文本数据之外&#xff0c;当然也会有抓取图片的需求。那我们的 scrapy 能爬取图片吗&#xff1f;答案是&#xff0c;当然的。说来惭愧&a…

错误代码0x800f0950怎么解决_解决win10安装net framework 3.5失败(错误代码 0x800F0950)...

视频教程&#xff1a;Win10教程 安装net framework 3.5失败(错误代码 0x800F0950)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com一&#xff1a;出现问题&#xff1a;报错代码二&#xff1a;解决步骤1.通过命令提示符明确自己系统版本Windows键X ,打开&#xff08;命…

python 日志不会按照日期分割_django实现日志按日期分割

settings文件中配置&#xff1a; LOGGING { version:1, disable_existing_logger:False, formatters:{ verbose:{ format:%(asctime)s \"%(pathname)s&#xff1a;%(module)s:%(funcName)s:%(lineno)d\" [%(levelname)s]-%(message)s }, }, # 处理器 handlers:{ # 输…

exe打包工具哪个最好_一键分发工具哪个最好用?这款30万人都在用,很优秀!...

现代化媒体对于传播越来越重要&#xff0c;16年到如今&#xff0c;视频内容产业实在有话题度&#xff0c;其高效的粉丝互动机制、低资金投入高额回报等等亮点&#xff0c;强烈吸引着数以百万计的创造者&#xff0c;为了达到极其出色的阅读量&#xff0c;这些人往往会运用到所有…

date转timestamp格式_技术分享 | MySQL:timestamp 时区转换导致 CPU %sy 高的问题

作者&#xff1a;高鹏文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》&#xff0c;深入透彻理解 MySQL 主从&#xff0c;GTID 相关技术知识。本文为学习记录&#xff0c;可能有误请谅解。本文建议PC端观看&#xff0c;效果更佳。这个问题是一个朋友遇到的风云&#xff0c…

mysql架构组成_第 2 章 MySQL 架构组成

麻雀虽小&#xff0c;五脏俱全。MySQL 虽然以简单著称&#xff0c;但其内部结构并不简单。本章从MySQL物理组成、逻辑组成&#xff0c;以及相关工具几个角度来介绍 MySQL 的整体架构组成&#xff0c;希望能够让读者对 MySQL 有一个更全面深入的了解。2&#xff0e;1 MySQL物理文…

win2008 mysql端口_使用自定义端口连接SQL Server 2008的方法

使用过SQL Server的人大多都知道&#xff0c;SQL Server服务器默认监听的端口号是1433&#xff0c;但是我今天遇到的问题是我的机器上有三个数据库实例&#xff0c;这样使用TCP/IP远程连接时就产生了问题。如何在Microsoft SQL Server Management Studio里加入端口号连接呢&…

python基本命令range_Python的Range()函数(指南)

当需要执行特定次数的操作时&#xff0c;Python内置的range函数十分方便。 读罢本文&#xff0c;你将&#xff1a; 理解Python的range函数是如何工作的 了解Python 2和Python 3中的实现方式有何不同 看过了不少range()函数操作实例 有能力解决它的一些局限性 让我们开始吧&…

qos的_QoS 概述

QoS 是一个很大的领域&#xff0c;涉及到网络中的多个层次和环节。本文仅简要的谈谈 Endpoint 侧的 QoS 概念&#xff0c;将这些纷繁的概念名词串起来&#xff0c;便于理解。QoS 技术背景下图说明了 QoS workflow 中&#xff0c;各项技术的位置和关系摘自 &amp;lt; 端到端Q…

centos daemonize_手把手教你在centos上配置Django项目(超详细步骤)

前言关于Django的部署&#xff0c;本人也踩了很多坑&#xff0c;这篇文章一步一步教你怎么进行部署&#xff0c;只需要你按照我的步骤来就OK了&#xff01;这里我们使用的服务器是一个全新的服务器&#xff0c;没有安装任何东西。基础环境搭建步骤★ 注意&#xff1a;下面的步骤…