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.mzph.cn/bicheng/38280.shtml

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

相关文章

C++ | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…

SCI二区|北极海鹦优化算法(APO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;W Wang受到北极海鹦的生存和捕食行为启发&#xff0c;提出了北极海鹦优化算法&#xff08;Arctic Puffin Optimization, APO&#xff09;。 2.算法原理 2.1算法思想 …

Tcmalloc工具定位内存泄漏问题

内存泄漏问题定位 gperftools工具安装 执行如下操作&#xff1a; git clone https://github.com/gperftools/gperftools.git 注&#xff1a;如果网速较慢&#xff0c;可直接去下载压缩包。 如我下载的地址&#xff1a;https://github.com/gperftools/gperftools/releases/ta…

SA 注册流程

目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS&#xff0c;取得下行时钟同步&#xff0c;并获取小区的PCI&#xff1b;如果失败则转步骤1搜索下一个频点&#xff1b;否则继续后续步骤&#xff1b; 3.解析Mib&#xff0c;…

WDG看门狗

1 WDG 1.1 简介 WDG是看门狗定时器&#xff08;Watchdog Timer&#xff09;的缩写&#xff0c;它是一种用于计算机和嵌入式系统中的定时器&#xff0c;用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗&#xff0c;它时刻盯着你的程序&#xff0c;确保它们正常运行。…

SpringBoot启动出错:无法访问org.springframework.boot.autoconfigure.SpringBootApplication

无法访问org.springframework.boot.autoconfigure.SpringBootApplication类文件具有错误的版本 61.0&#xff0c;应为 52.0请删除该文件或确保该文件位于正确的类路径子目录中。 出现该问题是由于版本不兼容&#xff0c; 在pom.xml文件中&#xff0c;修改版本为2开头即可

一个用于Win的自动复制文本的工具:Auto_Copy

自动复制工具 这是一个用在 Windows 上的的小工具,会将你选中的任何文本保存下来,可以通过点击右键粘贴选中内容。 一、灵感来源: 在使用Mobaxterm时,我注意到其软件中具备选中即自动复制和右键直接粘贴的功能。但是,这种选中自动复制的功能仅在软件内部有效。由于这一功…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

RTMP推流到SRS流媒体服务器消息处理

RTMP推流到SRS流媒体服务器消息处理 SRS和客户端是怎么交换消息的&#xff1f;各个消息有什么作用&#xff1f;握手成功后&#xff0c;SRS和客户端进行消息交换&#xff0c;对应wiresharek这部分截图&#xff1a; 流程图&#xff08;之前画的&#xff0c;可能不够详细&#xf…

在Linux (Ubuntu 16) 下安装LabVIEW

用户尝试在Ubuntu 16操作系统上安装LabVIEW&#xff0c;但找不到合适的安装文件来支持Ubuntu。已经下载了运行时文件&#xff0c;并尝试将.rpm包转换为.deb包并安装在Ubuntu上。然而&#xff0c;安装完成后&#xff0c;没有在应用程序中看到LabVIEW的图标。 用户希望能够在Ubu…

【操作系统】内存管理——页面分配策略(个人笔记)

学习日期&#xff1a;2024.6.28 内容摘要&#xff1a;页面分配策略和内存映射文件&#xff0c;内存映射文件 页面分配置换策略 基本概念 驻留集&#xff0c;指请求分页存储管理中给进程分配的物理块的集合&#xff0c;在采用了虚拟存储技术的系统中&#xff0c;驻留集大小一…

springcloud第4季 分布式事务seata实现AT模式案例2【经典案例】

一 seata案例 1.1 背景说明 本案例使用seata的at模式&#xff0c;模拟分布式事务场景&#xff1a;【下订单&#xff0c;减库存&#xff0c;扣余额&#xff0c;改状态】 AT模式原理&#xff1a;是2pc方案的演变&#xff0c; 一阶段&#xff1a;业务数据和回滚日志记录在同一…

Android studio 打包低版本的Android项目报错

一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…

static修饰的对象在内存中的存储及其用法

一、static修饰的变量在内存中的存储位置 static关键字无论是在C语言还是C中都有着极其重要的作用&#xff0c;那么对于static来说&#xff0c;它修饰的对象是存储在内存的哪个位置呢&#xff1f;它的作用与它在内存中的位置有什么联系&#xff1f;还有它都适用于哪些场景&…

15.数据库简介+MySQl使用+SQL语句

文章目录 数据库简述一.数据库简介DB1.定义:2.DBMS数据库管理系统3.数据库分类 二.MySQL的安装1.安装步骤2.MySQL数据库图形管理工具3.mysql程序常用命令4.MySQL字符集及字符序5.Navicat快捷键操作 三.MySQL数据库基本操作 .........................................表管理一.…

RPC远程过程调用--Thrift

RPC远程过程调用–Thrift 简介 Thrift是一个由Facebook开发的轻量级、跨语言的远程服务调用框架&#xff0c;后进入Apache开源项目。支持通过自身接口定义语言IDL定义RPC接口和数据类型&#xff0c;然后通过编译器生成不同语言代码&#xff0c;用于构建抽象易用、可互操作的R…

黄子韬揭秘徐艺洋与EXO的不解之缘

黄子韬揭秘&#xff1a;徐艺洋与EXO的不解之缘在娱乐圈的繁华与喧嚣中&#xff0c;总有一些不为人知的故事&#xff0c;它们或温馨、或励志&#xff0c;或是感叹命运的奇妙。近日&#xff0c;黄子韬在一档热门综艺节目中意外爆料&#xff0c;揭开了徐艺洋与EXO之间鲜为人知的秘…

ffmpeg使用bmp编码器把bgr24编码为bmp图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 不使用AVOutputFormat code void CFfmpegOps::EncodeBGR24ToBMP(const char* infile, const char* width_str, const char* height_str…

IT之家最新科技热点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(3)专栏里有上两步的源代码

创建用户登录程序&#xff0c;验证用户账号和密码信息是否在数据库student中的用户表tb_account中存在。用户登录界面如下图所示&#xff1a; 当单击“登录”按钮时&#xff0c;处理以下几种情况&#xff1a; &#xff08;1&#xff09;用户名未输入&#xff0c;提示用户名不能…