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

news/2024/5/19 20:05:34

今天,我们就使用 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 文件夹下。


http://www.mrgr.cn/p/56741388

相关文章

【MySQL】复合查询

目录 一、基本查询 1、查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J 2、按照部门号升序而雇员的工资降序排序 3、使用年薪进行降序排序 4、显示工资最高的员工的名字和工作岗位 5、显示工资高于平均工资的员工信息 6、显示每…

容灾独家技术揭秘:HyperBDR无主机数据同步技术

01、一对一单机热备-传统灾备方式 单机热备是一种备份解决方案&#xff0c;它使用两台服务器来确保高可用性&#xff0c;是市场上最为常见的灾备模式。 在单机热备中&#xff0c;一台主服务器和一台备用服务器保持同步&#xff0c;以确保在主服务器出现故障或宕机时可以立即切换…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???

1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求&#xff0c;也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求&#xff0c;比如 iPhone、iPad 和 MacBook 等苹…

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

机器学习深度学习——感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——softmax回归的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

腾讯云标准型S6/SA3/SR1/S5/SA2服务器CPU处理器大全

腾讯云服务器CVM标准型CPU处理器大全&#xff0c;包括标准型S6、SA3、SR1、S5、S5se、SA2、S4、SN3ne、S3、SA1、S2ne实例CPU处理器型号大全&#xff0c;标准型S6云服务器CPU采用Intel Ice Lake(2.7GHz/3.3GHz)&#xff0c;标准型S5采用Intel Xeon Cascade Lake 8255C/Intel Xe…

【rtmp】1: FLV videotag 转annexb

【FLV】AVC+AAC的FLV解析过程及pts、dts计算 反复多次,才能熟记细节。 明确细节,遇到问题才能解决。 rtmp 推送flv时, 首先解析flv,flv videotag 转annexb 格式。 然后 按照annexb 输入给rtmp,让rtmp 推送。 而rtmp 推送又需要把annexb 转为avcc 。 annexb 格式文件 录制的…

类的封装和包(JAVA)

封装 所有的OOP语言都会有三个特征&#xff1a; 封装&#xff1b;继承&#xff1b;多态。 本篇文章会为大家带来有关封装的知识。 在我们日常生活中可以看到电视就只有那么几个按键&#xff08;开关&#xff0c;菜单……&#xff09;和一些接口&#xff0c;而而我们通过这些东…

如何利用plotly和geopandas根据美国邮政编码(Zip-Code)绘制美国地图

对于我自己来说&#xff0c;该需求源自于分析Movielens-1m数据集的用户数据&#xff1a; UserID::Gender::Age::Occupation::Zip-code 1::F::1::10::48067 2::M::56::16::70072 3::M::25::15::55117 4::M::45::7::02460 5::M::25::20::55455 6::F::50::9::55117我希望根据Zip-…

代码随想录算法训练营第三十天 | 单调栈系列复习

单调栈系列复习 每日温度未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素 I未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素II未看解答自己编写的青春版重点题解的代码日后再次复习重新写 接雨水未看解答自己编写的青春版…

Spring Boot集成Swagger3.0,Knife4j导出文档

文章目录 Spring Boot集成Swagger3.0,Knife4j导出文档效果展示如何使用简要说明添加依赖添加配置类测试接口token配置位置 官网 说明情况 demo Spring Boot集成Swagger3.0,Knife4j导出文档 效果展示 如何使用 简要说明 Knife4j的前身是swagger-bootstrap-ui,前身swagger-boo…

vue 修改端口号

在根目录创建一个vue.config.js文件夹 module.exports {lintOnSave: false,devServer: {port: 3000,open: true} }运行后

数据结构:单链表的实现(C语言)

个人主页 &#xff1a; 水月梦镜花 个人专栏 &#xff1a; 《C语言》 《数据结构》 文章目录 前言一、单链表实现思路和图解1.节点的定义(SListNode)2.申请一个节点(BuySListNode)3.单链表打印(SListPrint)4.单链表尾插(SListPushBack)5.单链表的头插(SListPushFront)6.单链表的…

SpringBoot 如何进行 统一异常处理

在Spring Boot中&#xff0c;可以通过自定义异常处理器来实现统一异常处理。异常处理器能够捕获应用程序中抛出的各种异常&#xff0c;并提供相应的错误处理和响应。 Spring Boot提供了ControllerAdvice注解&#xff0c;它可以将一个类标记为全局异常处理器。全局异常处理器能…

openGauss学习笔记-26 openGauss 高级数据管理-约束

文章目录 openGauss学习笔记-26 openGauss 高级数据管理-约束26.1 NOT NULL约束26.2 UNIQUE约束26.3 PRIMARY KEY26.4 FOREIGN KEY26.5 CHECK约束 openGauss学习笔记-26 openGauss 高级数据管理-约束 约束子句用于声明约束&#xff0c;新行或者更新的行必须满足这些约束才能成…

8款常用系统镜像烧录软件

系统烧录软件是一种用于将操作系统或其他软件程序安装到嵌入式系统、嵌入式设备或存储设备中的工具。它通常用于将预先编译好的二进制文件或源代码烧录到硬件设备的非易失性存储器中&#xff0c;例如闪存芯片、EEPROM、EPROM或其他存储介质。系统烧录软件提供了一个便捷的方式&…

学习笔记|大模型优质Prompt开发与应用课(二)|第一节:大模型应用密码—Prompt的一千种打开方式

文章目录 第一节:大模型应用密码—Prompt的一千种打开方式01你可能听过一个小故事1910华盛顿纺织厂罢工事件 02 小问题:哪些场景会被提效类目一︰减少重复性工作的成本&#xff08;降本)例如∶做策划初稿、写JD、润色文案prompt生成结果prompt生成结果prompt生成结果promptprom…

网络安全 Day24-select高级用法和多表连接

select高级用法和多表连接 1. select 多子句单表高级实践1.1 select 多子句高级语法1.2 聚合函数1.3 group by 实践1.4 having 筛选1.5 order by 排序1.6 limit 2. 多表连接 1. select 多子句单表高级实践 1.1 select 多子句高级语法 where 和 having 区别是后者是分组后进行…

2023年深圳杯数学建模A题影响城市居民身体健康的因素分析

2023年深圳杯数学建模 A题 影响城市居民身体健康的因素分析 原题再现&#xff1a; 以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病&#xff08;以下简称慢性病&#xff09;已经成为影响我国居民身体健康的重要问题。随着人们生活方式的改变&am…

TCP三次握手和四次挥手以及11种状态(二)

11种状态 1、一开始&#xff0c;建立连接之前服务器和客户端的状态都为CLOSED&#xff1b; 2、服务器创建socket后开始监听&#xff0c;变为LISTEN状态&#xff1b; 3、客户端请求建立连接&#xff0c;向服务器发送SYN报文&#xff0c;客户端的状态变味SYN_SENT&#xff1b; 4、…