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> {
    @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.mfbz.cn/a/758855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法入门(上)

什么是算法&#xff1f; 算法&#xff08;Algorithm&#xff09;是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 给定一个问题&#xff0c;能够解决这个问题的算法是有很多种的。算式中的问题是千奇百怪…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

后端之路第三站(Mybatis)——XML文件操作sql

一、XML映射文件是啥 前面我们学过了在Mapper接口用注解的方式来操作sql语句 那么XML映射文件就另一种操作sql语句的方法 为什么还要有这么个玩意&#xff1f; 我简单说就是&#xff1a;如果有的sql特别复杂的话&#xff0c;比如需要【动态sql】的话&#xff0c;就得用到XM…

数据可视化期末总结

期末考试重点&#xff08;世界上最没意义的事情&#xff09; 选择 p8 数据可视化的标准&#xff1a; 实用、完整、真实、艺术、交互&#xff08;性&#xff09; p21 色彩三属性 色相、饱和度、亮度 p23 视觉通道的类型&#xff1a; 记得色调是定性 p39 散点图&#xff08;二维…

GIT-LFS使用

0.前言 目前git仓库有很多很大的文件需要管理&#xff0c;但是直接上传&#xff0c;每次clone的文件太大&#xff0c;所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包&#xff1a; Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…

Leica Cyclone 3DR2024 一款功能强大的点云建模软件下载License获取

Leica Cyclone 3DR 2024 是一款功能强大的点云建模软件&#xff0c;使用旨在为用户提供全面的点云管理、自动化的点云分析&#xff0c;结合强大的建模&#xff0c;在一个直观友好的环境中&#xff0c;专注的完成挑战&#xff0c;提高生产力&#xff0c;轻松创建并交付专业的成果…

杨幂跨界学术圈:内容营销专家刘鑫炜带你了解核心期刊的学术奥秘

近日&#xff0c;知名艺人杨幂在权威期刊《中国广播电视学刊》上发表了一篇名为《浅谈影视剧中演员创作习惯——以电视剧<哈尔滨一九四四>为例》的学术论文&#xff0c;此举在学术界和娱乐圈均引起了广泛关注。该期刊不仅享有极高的声誉&#xff0c;还同时被北大中文核心…

Data-Driven Reinforcement Learning for Robotic Manipulation

意思是 不同的任务以及机器人都有单独的数据和模型 未来需要整合 一个大的数据集包含所有的 然后训练一个大模型 以后具体的任务只需要针对这个模型进行微调 challenge bootstrapping with large data 2 3 4 高清图补充

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

ctfshow-web入门-命令执行(web59-web65)

目录 1、web59 2、web60 3、web61 4、web62 5、web63 6、web64 7、web65 都是使用 highlight_file 或者 show_source 1、web59 直接用上一题的 payload&#xff1a; cshow_source(flag.php); 拿到 flag&#xff1a;ctfshow{9e058a62-f37d-425e-9696-43387b0b3629} 2、w…

MathType7.6专业数学公式编辑器!与Word、PPT等常用软件无缝对接。

MathType&#xff0c;一款专业的数学公式编辑器&#xff0c;以其强大的功能和友好的用户界面&#xff0c;在科研、教学等领域广受欢迎。它支持丰富的数学符号和公式模板&#xff0c;满足不同用户的需求。同时&#xff0c;MathType还提供了多种输出格式&#xff0c;方便与其他文…

3ds Max导出fbx贴图问题简单记录

1.前言 工作中发现3ds Max导出的fbx在其它软件&#xff08;Autodesk viewer&#xff0c;blender&#xff0c;navisworks&#xff0c;FBXReview等&#xff09;中丢失了部分贴图&#xff0c;但导出的fbx用3ds Max打开却正常显示。 fbx格式使用范围较广&#xff0c;很多常见的三…

如何用Go语言,实现基于宏系统的解释器?

目录 一、Go语言介绍二、什么是宏系统三、什么是解释器四、如何用Go语言实现一个基于宏系统的解释器&#xff1f; 一、Go语言介绍 Go语言&#xff0c;又称为Golang&#xff0c;是一种由谷歌公司开发并开源的编程语言。Go语言的设计目标是提高程序员的生产力&#xff0c;同时具…

树莓派开发之文件传输

文章目录 一、简介使用U盘传输文件使用SD卡传输文件使用Xftp 7传输文件 二、 总结 一、简介 在树莓派开发中经常会用到文件传输&#xff0c;下面介绍几种树莓派文件传输的几种方法。 使用U盘传输文件 &#xff08;1&#xff09;复制所需传输文件到U盘 &#xff08;2&#…

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结…

【计算机图形学】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

json文件 增删查改

默认收藏夹 qt操作json格式文件... 这个人的 写的很好 我的demo全是抄他的 抄了就能用 —————————— 下次有空把我的demo 传上来 在E盘的demo文件夹 json什么名字

小迪安全v2023笔记 1-18

小迪安全v2023笔记 1-18 棱角社区 文章目录 1. 基础入门1. 正向shell与反向shell2. web应用3. 抓包&#xff0c;封包&#xff0c;协议&#xff0c;app&#xff0c;小程序&#xff0c;pc应用&#xff0c;web应用 2. 信息打点1. 常见信息获取2. 文件泄露3. 常见阻碍4. CDN绕过&a…

二叉树第二期:堆的实现与应用

若对树与二叉树的相关概念&#xff0c;不太熟悉的同学&#xff0c;可移置上一期博客 链接&#xff1a;二叉树第一期&#xff1a;树与二叉树的概念-CSDN博客 本博客目标&#xff1a;对二叉树的顺序结构&#xff0c;进行深入且具体的讲解&#xff0c;同时学习二叉树顺序结构的应用…