Sentinel解决雪崩问题

我们或多或少都对雪崩问题有点了解,在微服务系统中,各个微服务互相调用,关系错综复杂,如果其中一个微服务挂了或者处理消息的速度大幅下降,需要被处理的消息越积越多,那么影响的不仅仅是本微服务的功能,还会牵扯到调用该微服务的其他微服务出现问题,问题逐次传递,问题可就大了。

解决雪崩问题三种方案:

 请求限流:对于服务提供者要做出请求限流,就是限制访问本微服务的请求的并发量,避免服务因流量激增出现故障。

 线程隔离:对于服务消费者(就是调用其他微服务的微服务)要做线程隔离,也叫舱壁模式,模拟船舱板的防水原理。通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散。

 服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阀值则会熔断该业务,则拦截该接口的请求。熔断期间,所以请求快速失败,全走fallback逻辑(备用逻辑,程序员自己编写的),fallback逻辑就是让业务失败时不抛出异常而是返回写好的默认数据或给出友好提示。

Sentinel是阿里巴巴开源的一款springCloud微服务流量控制组件,它可以帮我们完成上述的一系列服务保护的功能。且Sentinel带有控制台,可以帮我们更方便的操作。

我们想使用Sentinel的话,需要下载它的jar包,

网址:Release v1.8.8 · alibaba/Sentinel · GitHub

然后启动jar包,启动命令:

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

为了方便,我把我的jar包名改为了sentinel-dashboard.jar 了。

启动成功后我们就可以访问控制台了,地址:http://localhost:8090

然后我们会进入登陆页面,第一次登陆的话,账号密码都是:sentinel

这是登陆后的页面:

 左边的目录,其中sentinel-dashboard是其自带的,而cart-service是我自己注册的微服务,你们应该是没有的。

然后我们看右半面,实时监控的内容,每一对图形和表格对应着它监控的路径,反正的该路径的访问情况。

下面让我们把我们的微服务注册到里面

首先我们需要为我们的微服务引入maven依赖

<!--        sentinel服务保护--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

然后在application.yaml中添加相应配置:

spring:cloud:sentinel:transport:dashboard: localhost:8090 #sentinel指控台地址http-method-specify: true  # 是否设置请求方式作为资源名称

因为我们微服务大多都是用Restful风格设置的API路径,所以如果不管请求方式的是,有很多方法的API路径是一样的,而Sentinel中的簇点资源路径默认是以路径(不包含请求方式)为资源名称的,所以我们要开启该配置http-method-specify,把请求方式+请求路径作为簇点资源名称。

 簇点链路:就是单机调用的链路。是一次请求进入服务后经过每一个被Sentinel监控的资源链。默认Sentinel会监控springMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点资源设置的,而资源名默认就是接口的请求路径。

簇点资源就是簇点链路中监控的本微服务的一个个的API接口。

下面我们就可以启动我们的微服务了,启动成功后,就可以在我们的Sentinel- dashboard中看到我们启动的微服务了,我启动的微服务名称就是cart-service。

然后在控制台我们进入cart-service服务,进入簇点链路页面中,会发现是空白的,因为我们启动后还没有访问其中的API接口,在我们访问一次后Sentinel才会检测到。

我的微服务都如下几个API方法:

 我们访问一下其中的get路径的方法后,在回到控制台的簇点资源页面,就可以看到我们刚刚访问的get路径方法了。

 GET:/carts  对应的通过QPS、拒绝QPS等等,是访问该路径的次数,被拒绝访问次数等等。

下面我们试着对get方法实现请求限流:点击该方法对应的  流控  ,

 我们就选QPS,是每秒请求的数量,用于请求限流,在单机阀值中写上我们需要限制的次数,就是每秒该路径最多被访问n次。完成后点新增就可以了。然后我们就可以在本微服务目录下的流控规则中看到我们填写的请求限流了。

然后是线程隔离,同样是上图的页面,这次选 并发线程数,同样在单机阀值中填写最多同时启用的线程数量,完成后我们同样可以在流控规则中看到我们添加的规则。

服务熔断:思路是由熔断器统计服务调用的异常比例、慢请求比例,如果超出阀值就会熔断该服务,即拦截访问该微服务的一切请求当服务恢复时,断路器会放行该服务。

熔断流程:当服务的异常比例、慢请求比例达到阀值后,就会被熔断一定时间,等时间过了,熔断器就会尝试着放行一次本服务,如果请求正常则放行,如果依然异常或者慢请求就会被继续熔断一定时间,不断循环。

下面让我们开始配置熔断:

点击本方法的 熔断 按钮,就是上面的所说的流控的旁边。

 可以看到熔断策略有3种:慢比例、异常比例、异常数。这个是可以同时对同一个方法设置多个熔断策略的,我们只要新增多个熔断规则就行。

最大RT指慢调用的最大等待时长,只要超出该时间就是慢调用。比例阀值就是慢调用比例与用调用次数的比值,如果大于该比值就会进入熔断。熔断时长就是每次熔断的时间。最小请求数就是只有在访问本方法的次数超出了5次,并且慢比例大于比例阀值时才会进入熔断。

新增后,我们就可以在本服务目录下的熔断规则中查看到我们新增的规则。

前面我们说过熔断时,对本方法的请求会走快速失败策略,所以我们需要定义一下快速失败的逻辑,而且这是微服务系统,我们一般都是用openFeign进行远程调用,我们需要开启Sentinel对Feign接口的检测,在application.yaml中添加配置:

feign:sentinel:enabled: true  #将feign作为Sentinel的簇点资源

下面让我们编写一下快速失败逻辑,这里的远程调用我用的是查询购物车(cart-service)时,同样需要查询购物车中每一件商品的详细信息(向item-service服务发送远程调用)

这是我的对item-service发送feign调用的接口类

package com.hmall.hmapi.client;import com.hmall.hmapi.client.fallback.ItemClientFallbackFactory;
import com.hmall.hmapi.dto.ItemDTO;
import com.hmall.hmapi.dto.OrderDetailDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;import java.util.Collection;
import java.util.List;@FeignClient(value = "item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

然后我们去编写该item-service查询商品服务的快速失败逻辑类,需要去实现FallbackFactory接口

package com.hmall.hmapi.client.fallback;import com.hmall.common.utils.CollUtils;
import com.hmall.hmapi.client.ItemClient;
import com.hmall.hmapi.dto.ItemDTO;
import com.hmall.hmapi.dto.OrderDetailDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;
import java.util.List;@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("查询商品失败",cause);return CollUtils.emptyList();}};}
}

这里我们为了简单,失败逻辑就仅仅是返回了空集合,并在idea控制台返回个失败日志。

最后,还有一件事,把item的feign接口类的失败策略设置为我们写好的失败策略:

package com.hmall.hmapi.client;import com.hmall.hmapi.client.fallback.ItemClientFallbackFactory;
import com.hmall.hmapi.dto.ItemDTO;
import com.hmall.hmapi.dto.OrderDetailDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;import java.util.Collection;
import java.util.List;@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

在@FeignClient注解中用fallbackFactory参数声明。这下就结束了

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

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

相关文章

Echarts地图实现:山东省报考人数

Echarts地图实现&#xff1a;山东省报考人数 效果预览 设计思路 数据可视化&#xff1a;选择地图作为数据展示的方式&#xff0c;可以直观地展示山东省不同城市的报考人数分布。交互性&#xff1a;通过ECharts的交互功能&#xff0c;如提示框&#xff08;tooltip&#xff09;…

Unity之HTC VIVE Cosmos环境安装(适合新手小白)(一)

提示&#xff1a;能力有限&#xff0c;错误之处&#xff0c;还望指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity版本电脑配置相关关于unity版本下载建议&#xff1a;0.先下载unity Hub1.不要用过于旧的版本2.不要下载最新版本或者其他非长期支持版本 二、官网下…

大模型微调实战之基于星火大模型的群聊对话分角色要素提取挑战赛:Task01:跑通Baseline

目录 0 背景1 环境配置1.1 下载包1.2 配置密钥1.3 测试模型 2 解决问题2.1 获取数据2.2 设计Prompt2.2 设计处理函数2.3 开始提取 附全流程代码 0 背景 Datawhale AI夏令营第二期开始啦&#xff0c;去年有幸参与过第一期&#xff0c;收获很多&#xff0c;这次也立马参与了第二…

论文工具使用---connected papers

如何使用connected papers 使用方法具体功能其他资源 官网地址&#xff1a;connected papers &#xff1a;一个旨在帮助科研工作者快速搜索文献的全新工具&#xff0c;可以清晰的查看文献的引文信息&#xff0c;了解文献的引用和被引用关联。 使用方法 输入论文标题后&#xf…

动态人物抠图换背景 MediaPipe

pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部&#xff0c;手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…

Matlab|【需求响应】空调负荷需求响应模型

1主要内容 程序主要复现《溫控负荷的需求响应潜力评估及其协同优化管理研究_谢敦见》2.5部分章节的内容&#xff0c;建立空调负荷的聚合模型&#xff0c;考虑调节空调温度对空调响应潜力的影响&#xff0c;程序结果充分说明随着上调温度增大&#xff0c;响应程度逐渐增大。 具…

【详细】CNN中的卷积计算是什么-实例讲解

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、 CNN的基础卷积计算1.1.一个例子了解CNN的卷积计算是什么1.2.卷积层的生物意义 二、卷积的拓展&#xff1a;多输入通道与多输出通道2.1.多输入通道卷积2.2.多输出通道卷积 三、卷积的实现3.1.pytorch实现卷积…

昇思25天学习打卡营第01天|基本介绍

昇思25天学习打卡营第01天|基本介绍 MindSpore API层次 昇思MindSpore为开发者提供了三个层次的API&#xff1a; Low-Level Python API: 提供了最基本的数据结构与运算操作&#xff0c;如张量、自动微分等。Medium-Level Python API&#xff1a;对底层API进行封装&#xff0…

CSS|03 尺寸样式属性文本与字体属性

尺寸样式属性 height:元素高度height的值&#xff1a;auto 自动length 使用px定义高度% 基于包含它的块级对象的百分比高度 width&#xff1a;元素的宽度width的值与height一样span标签可以设置宽度、高度吗&#xff1f; 答&#xff1a;不可以&#xff0c;因为span标签是一个行…

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中&#xff0c;通常我们会使用消息代理来构建一个Topic&#xff0c;让所有 服务节点监听这个主题&#xff0c;当生产者向topic中发送变更时&#xff0c;这个主题产生的消息会被…

HBuilder X 小白日记02-布局和网页背景颜色

html&#xff1a; 例子1&#xff1a; 整个&#xff1a; css案例&#xff1a; 1.首先右键&#xff0c;创建css文件 2.在html文件的头部分&#xff0c;引用css&#xff0c;快捷方式&#xff1a;linkTab键 <link rel"stylesheet" href" "> 3.先在css…

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6

前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路&#xff0c;LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…

Camera Raw:增强

Camera Raw 中的增强 Enhance命令基于 AI 技术提升图像的质量&#xff0c;可用于降噪、生成清晰的细节以及提高图像的分辨率。 ◆ ◆ ◆ 主要用途 1、高 ISO 图像降噪 勾选“去杂色” Denoise&#xff0c;可轻松消除使用高 ISO 设置或在低光环境下拍摄的照片中的噪点。 可以对…

MySQL之如何处理超大分页

如何处理MySQL超发分页&#xff1f; 可以使用覆盖索引解决 【点击进入】 MySQL超大分页处理 在数据量较大时&#xff0c;如果使用limit分页查询&#xff0c;在查询时&#xff0c;越往后&#xff0c;分页查询效率会越低。 示例&#xff1a; select * from user limit 900000…

小白学webgl合集-WebGL中给图片添加背景

一.实现效果 二.逻辑 为了在WebGL中给图片添加背景&#xff0c;主要的逻辑步骤包括初始化WebGL上下文、编写和编译着色器、创建和绑定缓冲区、加载和配置纹理以及绘制场景。以下是代码逻辑的详细说明&#xff1a; 1. 获取WebGL上下文 首先&#xff0c;通过获取<canvas>…

汽车电子工程师入门系列——CAN 规范系列通读

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

Java | Leetcode Java题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }

【Qt】QMessageBox 各种对话框的默认显示效果

1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…

ONLYOFFICE 8.1版本桌面编辑器测评:重塑办公效率的巅峰之作

在数字化办公日益普及的今天&#xff0c;一款高效、便捷且功能强大的桌面编辑器成为了职场人士不可或缺的工具。ONLYOFFICE 8.1版本桌面编辑器凭借其卓越的性能和丰富的功能&#xff0c;成功吸引了众多用户的目光。今天&#xff0c;我们将对ONLYOFFICE 8.1版本桌面编辑器进行全…