当前位置: 首页 > news >正文

【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

今天,我们就使用 Sentinel 实现接口的限流,并使用 Feign 整合 Sentinel 实现服务容错的功能,让我们体验下微服务使用了服务容错功能的效果。

因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开,所以,这里我们使用的服务容错组件是阿里开源的 Sentinel。

当然,能够实现服务容错功能的组件不仅仅有 Sentinel,比如:Hystrix 和 Resilience4J 也能够实现服务容错的目的。

1. 关于 Sentinel

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性

1.1 Sentinel 的特征

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 SpringCloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等

1.2 Sentinel 的主要特性

在这里插入图片描述
Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器

2. 项目集成 Sentinel

在微服务项目中整合 Sentinel 是非常简单的,只需要在项目的 pom.xml 文件中引入 Sentinel 的依赖即可。不过在使用 Sentinel 时,需要安装 Sentinel 的控制台

2.1 安装 Sentinel 控制台

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能

2.1.1 下载 sentinel-dashboard

到链接 下载链接 下载 Sentinel 控制台。我这里下载的是 sentinel-dashboard-1.8.5.jar

2.1.2 启动 sentinel-dashboard

Sentinel 控制台下载完成后,在本地启动 Sentinel 控制台,如下所示:

java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar

2.1.3 访问 sentinel-dashboard

启动后在浏览器中输入 http://localhost:8888 访问 Sentinel 控制台,如下所示:
在这里插入图片描述
输入默认的用户名 sentinel 和密码 sentinel,登录 Sentinel 控制台,如下所示:
在这里插入图片描述
至此,Sentinel 控制台下载并启动成功

2.2 项目集成 Sentinel

1、在订单微服务的 shop-orde r的 pom.xml 文件中添加Sentinel的相关依赖,如下所示

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、在订单微服务的 shop-order 的 application.yml 文中加入 Sentinel 相关的配置,如下所示:

spring:cloud:sentinel:transport:port: 9999 #指定和Sentinel控制台交互的端口,任意指定一个未使用的端口即可dashboard: 127.0.0.1:8888 #Sentinel控制台服务地址

3、为了让大家直观的感受到 Sentinel 的功能,这里我们先在订单微服务的 OrderController 类中新增一个测试接口,如下所示:

@GetMapping(value = "/test_sentinel")
public String testSentinel(){log.info("测试Sentinel");return "sentinel";
}

4、启动订单微服务,在浏览器中输入 http://localhost:8080/order/test_sentinel 访问在订单微服务中新增的接口。

5、刷新 Sentinel 页面,会发现已经显示了订单微服务的菜单,如下所示:
在这里插入图片描述
这里注意一下:

注意:直接启动订单微服务和 Sentinel,会发现 Sentinel 中没有订单微服务的数据,因为 Sentinel 是懒加载机制,所以需要访问一下接口,再去访问Sentinel 就有数据了

至此,订单微服务成功集成了 Sentinel

2.3 集成 Sentinel 限流功能

对提交订单的接口限流

在提交订单的接口 http://localhost:8080/order/submit_order 上实现限流,步骤如下:

1、首先访问下提交订单的接口 http://localhost:8080/order/submit_order ,使得 Sentinel 中能够捕获到提交订单的接口,并点击操作中的 流控 按钮,如下所示:

在这里插入图片描述

2、在新增流控规则显示框中的 QPS 单机阈值设置为 1,点击新增按钮,如下所示:

在这里插入图片描述
3、在浏览器中不断刷新 http://localhost:8080/order/submit_order? userId=1001&productId=1001&count=1 使得每秒访问的频率超过 1 次,会被 Sentinel 限流,如下所示:

在这里插入图片描述
至此,项目中集成了 Sentinel 并使用 Sentinel 实现了接口的限流。

3. Feign 整合 Sentinel 实现容错

我们之前在项目中集成了 Sentinel,并使用Sentinel实现了限流,如果订单微服务的下游服务,比如用户微服务和商品微服务出现故障,无法访问时,那订单微服务该如何实现服务容错呢?使用Sentinel就可以轻松实现

3.1 添加依赖并开启支持

1、在订单微服务的 shop-order 的 pom.xml 文件中添加 Sentinel 的相关依赖,如下所示:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、在订单微服务的 application.yml 文件中添加如下配置开启 Feign 对 Sentinel 的支持:

feign:sentinel:enabled: true

3.2 为远程调用实现容错

需要在订单微服务 shop-order 中,为远程调用接口实现容错方法

1、这里,先为用户微服务实现容错。在订单微服务中新建 com.zzc.order.feign.fallback 包,并在此包下创建 UserServiceFallBack 类实现 UserService 接口,用于调用用户微服务的容错类,如下所示:

@Component
public class UserServiceFallBack implements UserService {@Overridepublic User getUser(Long uid) {User user = new User();user.setId(-1L);return user;}}

注意:

容错类需要实现一个被容错的接口,并实现这个接口的方法

2、指定容错类。,在订单微服务的 com.zzc.order.feign.UserService 接口上的 @FeignClient 注解上指定容错类,如下所示:

@FeignClient(value = "server-user", fallback = UserServiceFallBack.class)
public interface UserService {@GetMapping(value = "/user/get/{uid}")User getUser(@PathVariable("uid") Long uid);}

3、修改订单微服务的业务实现类中提交订单的业务方法,如下所示:

// ...
if (user == null){throw new RuntimeException("未获取到用户信息: " + JSONObject.toJSONString(orderParamVo));
}
if (user.getId() == -1){throw new RuntimeException("触发了用户微服务的容错逻辑: " + JSONObject.toJSONString(orderParamVo));
}
Product product = productService.getProduct(orderParamVo.getProductId());
if (product == null){throw new RuntimeException("未获取到商品信息: " + JSONObject.toJSONString(orderParamVo));
}
if (product.getId() == -1){throw new RuntimeException("触发了商品微服务的容错逻辑: " + JSONObject.toJSONString(orderParamVo));
}
// ...
Result<Integer> result = productService.updateCount(orderParamVo.getProductId(), orderParamVo.getCount());
if (result.getCode() != HttpCode.SUCCESS){throw new RuntimeException("库存扣减失败");
}
if (result.getCode() == 1001){throw new RuntimeException("触发了商品微服务的容错逻辑: " + JSONObject.toJSONString(orderParamVo));
}

可以看到,修改后的提交订单的业务方法主要增加了服务容错的判断逻辑

至此,我们在项目中使用Sentinel实现了服务容错的功能

3.3 测试服务容错

停掉所有的用户微服务和商品微服务(也就是只启动订单微服务),在浏览器中访问 http://localhost:8080/order/submit_order?userId=1001&productId=1001&count=1 ,结果如下所示:

在这里插入图片描述
当然,读者也可以测试:只启动用户、订单微服务;商品、订单微服务。

返回的原始数据:

触发了用户微服务的容错逻辑: {“count”:1,“empty”:false,“productId”:1001,“userId”:1001}

说明项目集成Sentinel成功实现了服务的容错功能

代码地址

代码已经上传至码云,码云地址

其中,数据库文件位于 db 文件夹下。

相关文章:

【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错

今天&#xff0c;我们就使用 Sentinel 实现接口的限流&#xff0c;并使用 Feign 整合 Sentinel 实现服务容错的功能&#xff0c;让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开&#xff0c;所以&#xff0c;这里我们使用的服…...

mysql的主从复制

1.主从复制的原理 主从复制的原理是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时&#xff0c;会将这些变更写入二进制日志&#xff08;Binary Log&#xff09;中。从服务器通过连接到主服务器&#xff0c;请求从主服务器获取二进制日志&#xff0c;并将…...

【Golang 接口自动化03】 解析接口返回XML

目录 解析接口返回数据 定义结构体 解析函数&#xff1a; 测试 优化 资料获取方法 上一篇我们学习了怎么发送各种数据类型的http请求&#xff0c;这一篇我们来介绍怎么来解析接口返回的XML的数据。 解析接口返回数据 定义结构体 假设我们现在有一个接口返回的数据resp如…...

Java+bcprov库实现对称和非对称加密算法

BouncyCastle&#xff0c;即BC&#xff0c;其是一款开源的密码包&#xff0c;包含了大量的密码算法。 本篇主要演示BC库引入&#xff0c;对称加密算法AES、SM4和 非对称加密EC算法的简单实现&#xff0c;以下是实现过程。 一、将BC添加到JRE环境 前提&#xff1a;已安装JRE环…...

国内最大Llama开源社区发布首个预训练中文版Llama2

"7月31日&#xff0c;Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代&#xff01; | 全球最强&#xff0c;但中文短板…...

Qt应用开发(基础篇)——滑块类 QSlider、QScrollBar、QDial

目录 一、前言 二、QAbstractSlider类 1、invertedAppearance 2、invertedControls 3、maximum 4、minimum 5、orientation 6、pageStep 7、singleStep 8、sliderDown 9、tracking 10、sliderPosition 11、value 12、信号 三、QDial类 1、notchSize 2、notchTa…...

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

MongoDB文档--架构体系

阿丹&#xff1a; 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成&#xff1a; 存储结构&#xff1a;MongoDB采用文档型存储结构&#xff0c;一个数据库包含多个集合&#xff0c;一个集合包含多个文档。存储形式&#…...

GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等

跟着吴秋生老师的视频开展的学习&#xff0c;首先购买了云&#xff0c;用来设置全局。 1、尝试使用arcgis pro自带的conda conda env list查看电脑上环境&#xff0c;我自己电脑上有三个环境&#xff0c;使用的arcgis pro python克隆的环境作为的默认的环境 但是这样的前提…...

软件测试面试总结——http协议相关面试题

前言 在PC浏览器的地址栏输入一串URL&#xff0c;然后按Enter键这个页面渲染出来&#xff0c;这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点&#xff0c;不知道背后的逻辑&#xff0c;是无法发现隐藏的bug&#xff0c;只能找一…...

大数据与okcc呼叫中心融合的几种方式

在实际的生产实践中&#xff0c;为提高营销效率&#xff0c;避免骚扰大众&#xff0c;很多呼叫中心业务会与大数据平台进行合作&#xff0c;进行精准营销。 买卖数据是非法的&#xff0c;大数据平台方并不会提供直接的数据&#xff0c;一般情况下&#xff0c;提供的数据都是脱…...

WAF绕过-工具特征-菜刀+冰蝎+哥斯拉

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...

使代码减半的5个Python装饰器

大家好&#xff0c;到目前为止&#xff0c;Python编程语言由于其语法简单&#xff0c;在机器学习和网络开发等各个领域的应用功能强大。除非绝对必要&#xff0c;装饰器一般很少出现在视野中&#xff0c;比如使用staticmethod装饰器来表示类中的静态方法。装饰器能提供的大量强…...

线程池的线程回收问题

首先&#xff0c;线程池里面分为核心线程和非核心线程。 核心线程是常驻在线程池里面的工作线程&#xff0c;它有两种方式初始化。 向线程池里面添加任务的时候&#xff0c;被动初始化主动调用prestartAllCoreThreads方法 当线程池里面的队列满了的情况下&#xff0c;为了增加…...

盘点那些不想骑车的原因和借口。

在自行车骑行的热潮中&#xff0c;我们都会找到各种千奇百怪的借口来解释我们为什么不想骑。本文将结合当前热点话题和趋势&#xff0c;从心理学、文化等多个角度&#xff0c;深入探讨这些借口背后的原因。 首先&#xff0c;我们不能忽视的是&#xff0c;骑行是一项需要耐力和毅…...

【深度学习Week3】ResNet+ResNeXt

ResNetResNeXt 一、ResNetⅠ.视频学习Ⅱ.论文阅读 二、ResNeXtⅠ.视频学习Ⅱ.论文阅读 三、猫狗大战Lenet网络Resnet网络 四、思考题 一、ResNet Ⅰ.视频学习 ResNet在2015年由微软实验室提出&#xff0c;该网络的亮点&#xff1a; 1.超深的网络结构&#xff08;突破1000层&…...

Visual Studio 2022的MFC框架全面理解

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…...

C# 消息队列 (MSMQ) 进程之间的通信

2个程序之间使用消息队列进行通信。 该代码只适用.NET Framework 版本&#xff0c;如果是.NET Core 请使用其他第三方消息队列框架&#xff0c;因为.NET Core 对System.Messaging 已经不支持呢。 进程1用于创建消息队列&#xff0c;然后发送消息。 代码如下: using System; u…...

算法练习(4):牛客在线编程05 哈希

package jz.bm;import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet;public class bm5 {/*** BM50 两数之和*/public int[] twoSum (int[] numbers, int target) {int[] res new int[…...

数字信号处理——频谱分析

数字信号处理——频谱分析 频谱分析 频谱分析是一种将复杂信号分解为较简单信号的技术。许多物理信号均可以表示为许多不同频率简单信号的和。找出一个信号在不同频率下的信息&#xff08;如振幅、功率、强度或相位等&#xff09;的做法即为频谱分析。 频谱 频谱是指一个时域…...

[软件工程] 架构映射战略设计方案模板

3 系统上下文 结合全局分析阶段获得的价值需求&#xff08;利益相关者、系统愿景、系统范围&#xff09;确定系统上下文&#xff0c;体现用户、目标系统与伴生系统之间的关系。 3.1 概述 绘制系统上下文图&#xff0c;明确解空间的系统边界。 3.2 系统协作业务流程1…n 根据全局…...

Springboot MongoDB 事务

目录 1. 事务和TransactionTemplate 2. 事务和MongoTransactionManager 3. 响应式事务 4. 事务和TransactionalOperator 5. 事务和ReactiveMongoTransactionManager 6. 事务内部的特殊行为 从版本4开始&#xff0c;MongoDB支持 事务。事务是建立在 会话之上的&#xff0c…...

SAP自建表日志

文章目录 1.在表里加上日志记录字段1.1 加入日志结构1.2 在代码中调用记录日志通用函数1.3 在SM30里面记录日志1.4 缺点1.5 优点 2.表技术设置-日志数据更改2.1 RZ10或者RZ11修改系统参数2.2 设置表的属性2.3 查询日志2.4 缺点2.5 优点 3 SCDO文档对象3.1 勾选相应字段-数据元素…...

ansible-kubeadm在线安装单masterk8s v1.19-v1.20版本

ansible可以安装的KS8版本如下&#xff1a; [rootk8s-master01 ~]# yum list kubectl --showduplicates | sort -r kubectl.x86_64 1.20.0-0 kubernetes kubectl.x86_64 1.20.0-0 …...

mongodb docker 及常用命令

MongoDB属于非关系型数据库&#xff0c;它是由C编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。 中文手册 https://www.w3cschool.cn/mongodb/ 安装 https://www.mongodb.com/try/download/community 二进制安装可见另一篇&#xff1a; centos7 mongodb 4.0.28…...

最新版本mac版Idea 激活Jerbel实现热部署

1.环境准备 1.安装docker desktop 客户端创建本地服务 2.创建guid 3.随便准备一个正确格式的邮箱 2.具体操作 1.通过提供的镜像直接搭建本地服务 docker pull qierkang/golang-reverseproxy docker run -d -p 8888:8888 qierkang/golang-reverseproxy2.guid 通过如下网址直…...

基于Ubuntu22.04部署bcache模式ceph

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 将Bcache集成到Ceph OSD后端可以带来一些优点和潜在的缺点。以下是它们的一些方面&#xff1a; 优点&#xff1a; 提高性能&#xff1a;BCache作为SSD缓存设备&#xff0c;可以提供更快的数据读取和写入速度…...

根据URL批量下载文件并压缩成zip文件

根据url批量下载图片或者视频&#xff0c;只需要将图片的url和名称放到数组对象即可&#xff0c;例如&#xff1a; let fileArr [{fvUrl:https://image.xuboren.com/image/2023/07/26/1410829074764cdbaa4314a084eb749e.jpg,fvName: 图片名称},{fvUrl:https://image.xuboren.…...

机器学习笔记之优化算法(六)线搜索方法(步长角度;非精确搜索;Glodstein Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Glodstein Condition] 引言回顾&#xff1a; Armijo Condition \text{Armijo Condition} Armijo Condition关于 Armijo Condition \text{Armijo Condition} Armijo Condition的弊端 Glodstein…...

Ant Design Pro 封装网络请求

可以直接在antdPro项目的app.tsx文件中对request进行运行时配置&#xff0c;并且该配置会直接透传到umi-request的全局配置。后续直接从umi中引入request或者useRequest直接使用&#xff0c;可以说是非常方便。文档可查看&#xff1a;umi.js 具体配置代码&#xff1a; import…...