Sentinel解决雪崩问题

news2024/11/22 15:11:28

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

解决雪崩问题三种方案:

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

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

 服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阀值则会熔断该业务,则拦截该接口的请求。熔断期间,所以请求快速失败,全走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> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public 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.coloradmin.cn/o/1877360.html

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

相关文章

MathType2024最新破解版在哪里可以下载?

在当今科技日益发展的时代&#xff0c;我们每个人都可能遇到需要在电子文档、网页或其他平台中输入复杂数学公式的情况。这时&#xff0c;一个强大且易用的数学公式编辑器就成了我们迫切需要的工具。而MathType&#xff0c;作为一款专业、精准的数学公式编辑器&#xff0c;无疑…

大模型和数据库最新结合进展

写在前面 本文主要内容是上次接受 infoQ 访谈&#xff0c;百度智能云朱洁老师介绍了大模型和 AI 结合相关话题&#xff0c;这次整体再刷新下&#xff0c;给到对这个领域感兴趣的同学。 当前&#xff0c;百度智能云云数据库特惠专场开始&#xff01;热销规格新用户免费使用&am…

IDEA中导入Maven项目

IDEA中导入Maven项目 方式1&#xff1a;使用Maven面板&#xff0c;快速导入项目 打开IDEA&#xff0c;选择右侧Maven面板&#xff0c;点击 号&#xff0c;选中对应项目的pom.xml文件&#xff0c;双击即可 说明&#xff1a;如果没有Maven面板&#xff0c;选择 View > Appe…

<电力行业> - 《第8课:输电(一)》

1 输电环节的意义 电能的传输&#xff0c;是电力系统整体功能的重要组成环节。发电厂与电力负荷中心通常都位于不同地区。在水力、煤炭等一次能源资源条件适宜的地点建立发电厂&#xff0c;通过输电可以将电能输送到远离发电厂的负荷中心&#xff0c;使电能的开发和利用超越地…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

什么是预主密钥(pre-master secret)?

什么是预主密钥&#xff08;Pre-Master Secret&#xff09;&#xff1f; 在SSL/TLS协议中&#xff0c;预主密钥&#xff08;Pre-Master Secret&#xff09;是建立安全连接的关键要素之一。它在客户端和服务器之间生成共享密钥的过程中扮演重要角色。本文将详细介绍预主密钥的生…

J018_冒泡排序

一、排序过程 如果要对一个数组进行升序排序&#xff1a; 每个轮次两两数字进行比较&#xff0c;如果前面的数字大于后面的数字&#xff0c;则交换两个数字的位置&#xff1b;如果前面的数字小于或等于后面的数字&#xff0c;则这两个数字位置不变。直到把数组中所有数字比较…

打靶记录——靶机medium_socnet

靶机下载地址 https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 打靶过程 由于靶机和我的Kali都处于同一个网段&#xff0c;所以使用arpscan二次发现技术来识别目标主机的IP地址 arpscan -l除了192.168.174.133&#xff0c;其他IP都是我VMware虚拟机正…

amis源码 更新组件数据域的几种方法

更新组件数据域的几种方法&#xff1a; 默认都是合并数据&#xff0c;非覆盖(指定replace为true的才是覆盖)&#xff1a; const comp amisScoped.getComponentById(id);//或者getComponentByName(name) 1.comp.setData(values, replace); //更新多个值values&#xff0c; r…

wget之Win11中安装及使用

wget之Win11中安装及使用 文章目录 wget之Win11中安装及使用1. 下载2. 安装3. 配置环境变量4. 查看及使用1. 查看版本2. 帮助命令3. 基本使用 1. 下载 下载地址&#xff1a;https://eternallybored.org/misc/wget 选择对应的版本进行下载即可 2. 安装 将下载后的wget-1.21.4-w…

Rpc服务的提供方(Rpcprovider)的调用流程

首先&#xff0c;服务的提供方&#xff0c;会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法&#xff0c; 那么&#xff0c;我们通过protobuf提供的抽象层的service和method&#xff0c;将服务对象和它所对应的服务方法记录在map表中&#xff0c; 当它启动以后&#xff…

Java--常用类APl(复习总结)

前言: Java是一种强大而灵活的编程语言&#xff0c;具有广泛的应用范围&#xff0c;从桌面应用程序到企业级应用程序都能够使用Java进行开发。在Java的编程过程中&#xff0c;使用标准类库是非常重要的&#xff0c;因为标准类库提供了丰富的类和API&#xff0c;可以简化开发过…

电影APP——项目建议书参考

项目建议书 1. 前言1.1 实现目标1.2 项目应用范围1.3 项目名称 2. 概述2.1 国内外发展综述2.2 拟解决的问题2.2.1 业务问题2.2.2 技术需求 2.3 系统环境需求2.3.1 网络需求描述2.3.2 业务需求描述2.3.3 运行环境/用户描述 2.4 功能建议2.4.1应用场景描述2.4.2功能划分/功能模型…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示…

windographer数据操作教程

目录 通道设置将4个windographer文件拼到一起映射关系通道设置 先把风速列选中,将Type改为 wind speed 无需额外操作,确认一下即可

Linux(Ubuntu20.04)系统中安装deb软件包错误(依赖关系问题-仍未被配置)解决的办法

在Ubuntu16.04下采用如下dpkg命令安装deb软件安装包时&#xff1a; sudo dpkg -i XXXX.deb 发生安装失败&#xff0c;返回信息为&#xff02;正处理时有错误发生&#xff02;&#xff0c;并且在安装过程中出现&#xff02;依赖关系问题-仍未被配置&#xff02;的提示&#xff0…

【机器学习300问】136、C4.5虽然改善了ID3决策树算法的部分缺点,但还是有不足,请问还有更好的算法吗?CART算法构建决策树

一、C4.5算法仍存在的不足 &#xff08;1&#xff09;计算效率不高 C4.5使用的信息增益率计算涉及熵的对数计算&#xff0c;特别是当属性值数量大时&#xff0c;计算成本较高。 &#xff08;2&#xff09;处理连续数值属性不够高效 ID3算法只能处理离散属性&#xff0c;需要预…

一个CentOS“倒下去”,更多开源创新服务器操作系统站起来

“一切过往&#xff0c;皆为序章。” ——出自莎士比亚的戏剧《暴风雨》 CentOS 7将在2024年6月30日正式停更&#xff0c;这在某种程度上宣告了国外开源操作系统一个时代的结束。那么&#xff0c;这是不是必然意味着&#xff0c;一个属于我国自主创新的开源操作…

pg_rman:备份和恢复管理工具#postgresql培训

pg_rman 是 PostgreSQL 的在线备份和恢复工具。 pg_rman 项目的目标是提供一种与 pg_dump 一样简单的在线备份和 PITR 方法。此外&#xff0c;它还为每个数据库集群维护一个备份目录。用户只需一个命令即可维护包括存档日志在内的旧备份。 #PG培训#PG考试#postgresql考试#pos…

Java 基本数据类型【基础篇】

目录 Java 数据类型基本数据类型整数类型【byte、short、int、long】浮点类型【float、double】布尔类型【boolean】字符类型【char】 引用数据类型 Java 数据类型 Java 语言支持的数据类型分为两种&#xff1a;基本数据类型 和 引用数据类型。其数据类型结构如下图所示&#x…