Sentinel学习(2)——sentinel的使用,引入依赖和配置 对消费者进行流控 对生产者进行熔断降级

前言

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

本篇博客介绍sentinel的使用,引入依赖和配置,结合案例阐述sentinel对消费者进行流控以及对生产者进行熔断降级。

其他关于sentinel的文章如下:

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 & Sentinel的相关概念 + 下载运行

在这里插入图片描述

目录

  • 前言
  • 引出
  • 一、sentinel的使用准备
    • 1.上下文和资源
    • 2.责任的划分
    • 3,引入依赖和配置
  • 二、对消费者进行流量控制
    • 1.单机阈值
    • 2.预热设置
    • 3.排队等待
    • 4.关联模式
      • 补充:自定义限流异常返回
    • 5.链路模式
  • 三、对生产者进行熔断降级
    • 1.异常数
    • 2.异常比例
    • 3.慢调用比例
  • 总结

引出


1.sentinel的使用,引入依赖和配置;
2.对消费者进行流控;
3.对生产者进行熔断降级;

一、sentinel的使用准备

1.上下文和资源

上下文( Context )和 context-name
Context 代表调用链路上下文。是一个根节点,在整个调用链路的开始处,Sentinel 会创建上下文Context 对象,并且为它指定一个 name ,相当于根资源。在 Sentinel 中,不同的调用链路可能使用同一个上下文 Context 对象(共一个根节点)。在这里( 和 Spring MVC 整合 ),我们的调用链路都是在 sentinel_spring_web_context 中:

在这里插入图片描述

资源(Resource)和 resource-name
在 Sentinel 中,对于每一份资源,Sentinel 会为赋予一个 name(或者你手动指定),和 Spring MVC整合时,Sentinel 使用的是 URI 来作为 Controller 方法的资源名( 在这里,Controller 方法就是资源)

在这里插入图片描述

2.责任的划分

对于消费者而言,进行流量控制,别人访问我,我怕自己失败,所以我要限制别人访问我的流量;

对于生产者而言,进行熔断降级,消费者调用生产者,怕生产者出问题,所以进行熔断降级,如果被调用方,即生产者出问题时,给出相应的应对;

在这里插入图片描述

3,引入依赖和配置

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
spring:cloud:# nacos的配置nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/# 命名空间namespace: my-tianju# 组名group: DEV# sentinel的配置sentinel:transport:dashboard: 192.168.111.130:7777port: 8719# 这样一启动能够立马被发现,不用请求一次后才被监控eager: true# 链路相关的配置# 默认是true,开启上下文整合,所有链路在根节点下,链路监控就是将请求分开统计web-context-unify: falseapplication:name: springCloud-consumer#feign:
#  hystrix:
#    enable: true# 打开阿里的 sentinel
feign:sentinel:enabled: true

二、对消费者进行流量控制

QPS(Queries Per Second) 表示每秒的查询数。也就是一台服务器每秒能够响应的查询次数。

1.单机阈值

QPS(Queries Per Second) 表示每秒的查询数。也就是一台服务器每秒能够响应的查询次数。

在这里插入图片描述

请求次数过多,被sentinel限流

在这里插入图片描述

2.预热设置

在系统刚启动时,允许较少的请求,随着系统逐步稳定,提升访问允许的阈值

在这里插入图片描述

JMeter测试post请求,需要加一下请求头参数

在这里插入图片描述

Ramp-up时间:线程启动的间隔时间,如果100个线程10s内启动完成,则设置Ramp-up为100/10=10s

在这里插入图片描述

波形图

在这里插入图片描述

全流程解析:
1.开始的时候每秒允许3次;
2.前10s内逐步提升;
3.在10s后达到稳定值,每秒允许10次;

在这里插入图片描述

3.排队等待

排队等待:也叫流量整形,它让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的在队列排队等待一段时间,(即我们设置的时间,单位是毫秒),没有超过这个时间都能被及时处理,如果超过了这个等待时间针对请求的接口没有线程来处理,则抛出异常

在这里插入图片描述

JMeter参数设置

在这里插入图片描述

波形图

在这里插入图片描述

限流策略流程:
1.每秒允许10个
2.发过来50个,通过10个剩余的40个进入队列等待:
3.在没有请求的时候,通过队列中等待的请求,

在这里插入图片描述

4.关联模式

关联:/important接口的重要程度要高于 /normal接口,如果,/important接口的访问压力很大,那么,可以『牺牲』掉 /normal` 接口,全力保证 /important 接口的正常运行

在这里插入图片描述

JMeter参数设置

在这里插入图片描述

线程数设置

在这里插入图片描述

add成功,get被限流

在这里插入图片描述

高并发情况,add接口没有出现失效

在这里插入图片描述

补充:自定义限流异常返回

Sentinel 返回的默认信息是 Blocked by Sentinel (flow limiting),如果你对默认响应信息不满意,你可以自定义限流返回信息。

Sentinel 提供了 BlockExceptionHandler 接口。不管什么原因触发了 Sentinel 阻断用户的正常请求,Sentinel 都将『进入』到用户自定义的 BlockExceptionHandler 接口的实现类中,执行 handle方法,并传入当前的请求、响应对象以及异常对象,并以 handle 方法的执行结果作为返回,回传给用户。

package com.tianju.test;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,BlockException ex) throws Exception {String msg = null;if (ex instanceof FlowException) {msg = "该请求限流了,请稍后重试";} else if (ex instanceof DegradeException) {msg = "被熔断了";} else {msg = "其它原因";// ParamFlowException "热点参数限流";// SystemBlockException "系统规则(负载/...不满足要求)";// AuthorityException "授权规则不通过";}// http 状态码response.setStatus(500);response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json;charset=utf-8");response.setContentType("application/json;charset=utf-8");new ObjectMapper().writeValue(response.getWriter(), msg);}
}

需要说明的是:不仅仅是因为限流和熔断这一个原因会导致 BlockExceptionhandler 的handle 方法的执行,还有其它的原因也会调用这个handler方法,因此,需要对 handle 方法的BlockException 参数对象进行 instanceof 判断

5.链路模式

链路限流和关联限流的思路很像,假设我们要去请求某个微服务,该微服务有2个接口(/query和/add),而这两个接口又调用了同一个service层的方法(如:doSomething()方法),那么,我们可以『站在 doSomething的方法』的角度上进行设置:如果是 /query接口在调用service层的doSomething方法,那么就进行限流,而 /add接口的调用就不限流,或设置为更宽松一些的流控

通过配置关闭 sentinel 的 URL 收敛功能

在这里插入图片描述

package com.tianju.consumer.service;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;@Service
public class ConsumerService {@SentinelResource("hello")public String hello(){return "consumerService";}
}

在这里插入图片描述

链路模式,站在service层的方法的角度上

在这里插入图片描述

高并发add接口,没有失效

在这里插入图片描述

快速点击get方法,出现失效情况

在这里插入图片描述

三、对生产者进行熔断降级

熔断器3个状态:

  • Closed:关闭状态,所有请求都正常访问。

  • Open:打开状态,所有请求都会被降级。

    Hystrix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。默认是 五秒之内请求20次 如果有10次失败(50%),则请求不能正常访问。

  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。

    此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时

在这里插入图片描述

1.异常数

如下配置:一秒内发送2次请求,如果有1次失败(异常),则直接熔断,然后降级

在这里插入图片描述

设置参数

在这里插入图片描述

在这里插入图片描述

2.异常比例

在这里插入图片描述

设置fallback方法

在这里插入图片描述

package com.tianju.config;import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {@PostMapping("/storage/sub")HttpResp subStorage(@RequestBody StorageDto storageDto);}

openfeign设置fallback方法

在这里插入图片描述

package com.tianju.config;import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.fallback.StorageFeignFallback;
import com.tianju.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;@FeignClient(value = "storage-server",fallback = StorageFeignFallback.class)
public interface StorageFeign {@PostMapping("/storage/sub")HttpResp subStorage(@RequestBody StorageDto storageDto);
}

生产者出现异常情况

在这里插入图片描述

用postman进行测试

在这里插入图片描述

package com.tianju.config.fallback;import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;/*** 调用库存的feign异常时的返回*/
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {@Overridepublic HttpResp subStorage(StorageDto storageDto) {System.out.println("#########################进入了减库存方法的异常中....###########################");log.debug("进入了减库存方法的异常中....");return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");}
}

在这里插入图片描述

package com.tianju.config.fallback;import com.tianju.common.dto.StorageDto;
import com.tianju.common.result.HttpResp;
import com.tianju.config.StorageFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;/*** 调用库存的feign异常时的返回*/
@Component
@Slf4j
public class StorageFeignFallback implements StorageFeign {@Overridepublic HttpResp subStorage(StorageDto storageDto) {System.out.println("#########################进入了减库存方法的异常中....###########################");log.debug("进入了减库存方法的异常中....");return HttpResp.failed("减库存的openFeign调用失效,请稍后重试");}
}

3.慢调用比例

如下配置:在一秒内,发5次请求,如果每次请求的响应时间超过500毫秒,这种比例达到0.5(50%),就进行熔断,熔断时长就是10秒。如:1秒内有5次请求,其中有3次请求响应时间超过了500毫秒,那么这个比例就是60%,大于50%,此时就熔断,然后降级。

在这里插入图片描述

用Jmeter测试,程序中当id=1时,每次响应都是800毫秒。所以每次的请求都大于500毫秒,失败率100%,这个时候去请求id=4的资源也是无法请求的,因为熔断了,所以也是直接降级。10s后再次请求id=4的就正常了。


总结

1.sentinel的使用,引入依赖和配置;
2.对消费者进行流控;
3.对生产者进行熔断降级;

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

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

相关文章

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类&#xff0c;用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…

华为云云耀云服务器L实例评测|搭建CounterStrike Source Delicated Server(CS起源游戏服务器)

华为云云耀云服务器L实例评测&#xff5c;搭建CounterStrike Source Delicated Server&#xff08;CS起源游戏服务器&#xff09; #【有奖征文】华为云云服务器焕新上线&#xff0c;快来亲身感受评测吧&#xff01;# ⭐️ CounterStrikeSource&#xff08;CS起源是Valve的一款…

启动页面UI(HTML)

从模糊到现实 浮现 <!DOCTYPE html> <html> <head> <style> .body { background-color:#f8f8f8; } /* 定义动画效果 */ keyframes openingAnimation { 0% { opacity: 0; } 100% { opacity: 1; } } /…

ChatGPT架构师:语言大模型的多模态能力、幻觉与研究经验

来源 | The Robot Brains Podcast OneFlow编译 翻译&#xff5c;宛子琳、杨婷 9月26日&#xff0c;OpenAI宣布ChatGPT新增了图片识别和语音能力&#xff0c;使得ChatGPT不仅可以进行文字交流&#xff0c;还可以给它展示图片并进行互动&#xff0c;这是一次ChatGPT向多模态进化的…

【计算机取证篇】Windows禁用驱动程序签名教程

【计算机取证篇】Windows禁用驱动程序签名教程 高级启动—【蘇小沐】 文章目录 【计算机取证篇】Windows禁用驱动程序签名教程1、实验环境 &#xff08;一&#xff09;驱动问题&#xff1a;驱动安装失败&#xff08;二&#xff09;高级启动&#xff1a;F7禁用驱动程序强制签名…

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…

JAVA设计模式-代理模式

一.概念 在软件开发中&#xff0c;也有一种设计模式可以提供与代购网站类似的功能。由于某些原因&#xff0c;客户端不想或不能直接访问一个对象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现间接访问&#xff0c;该方案对应的设计模式被称为代理模式。 ​ 代理模…

12、Kubernetes中KubeProxy实现之iptables和ipvs

目录 一、概述 二、iptables 代理模式 三、iptables案例分析 四、ipvs案例分析 一、概述 iptables和ipvs其实都是依赖的一个共同的Linux内核模块&#xff1a;Netfilter。Netfilter是Linux 2.4.x引入的一个子系统&#xff0c;它作为一个通用的、抽象的框架&#xff0c;提供…

【刷题笔记10.2】LeetCode: 罗马数字转整数

LeetCode: 罗马数字转整数 一、题目描述 二、分析 方法一&#xff1a; 将给定字符串s中的"IV", “IX”, “XL”, “XC”, “CD”, “CM” 全部替换为其他字符如&#xff1a;a, b, c, d, e, f 这种&#xff0c;然后就可以遍历累加了。 s s.replace("IV",…

华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器管理、控制、访问评测

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之体验评测&#xff1a;华为云云耀云服务器管理、控制、访问评测 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

Redis 如何实现数据不丢失的?

Redis 实现数据不丢失的关键在于使用了多种持久化机制,以确保数据在内存和磁盘之间的持久性。以下是 Redis 实现数据不丢失的主要方法: 快照(Snapshot)持久化: Redis 使用快照持久化来定期将内存中的数据写入磁盘。快照是一个数据库状态的副本,包含了所有键和与其相关联的…

Linux命令(91)之mv

linux命令之mv 1.mv介绍 linux命令mv是用来移动文件或目录&#xff0c;并且也可以用来更改文件或目录的名字 2.mv用法 mv [参数] src dest mv常用参数 参数说明-f强制移动&#xff0c;不提示 3.实例 3.1.重命名文件1.txt为ztj.txt 命令&#xff1a; mv 1.txt ztj.txt …

理解Go中的数据类型

引言 数据类型指定了编写程序时特定变量存储的值的类型。数据类型还决定了可以对数据执行哪些操作。 在本文中&#xff0c;我们将介绍Go的重要数据类型。这不是对数据类型的详尽研究&#xff0c;但将帮助您熟悉Go中可用的选项。理解一些基本的数据类型能让你写出更清晰、性能…

深度学习笔记_1、定义神经网络

1、使用了PyTorch的nn.Module类来定义神经网络模型;使用nn.Linear来创建全连接层。(CPU) import torch.nn as nn import torch.nn.functional as F from torchsummary import summary# 定义神经网络模型 class Net(nn.Module):def __init__(self):super(Net, self).__init__()…

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…

excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中,并按照文件名保存在新文件的不同sheet中

excel将文件夹下面的表格文件指定名称的sheet批量导出到指定文件中&#xff0c;并按照文件名保存在新文件的不同sheet中 import pandas as pd import ositems os.listdir("./") sheetname"" for item in items:if item.__contains__(xls):dfpd.read_exc…

px4的gazebo仿真相机模型报错解决办法,返回值256

&#x1f449;事情起因&#xff1a;我想做关于PX4无人机的摄像头仿真&#xff0c;根据PX4的官网文件 Tools/sitl_gazebo文件夹里面有对应的模型可以使用&#xff0c;我就想在mavros_posix_sitl文件里面修改vehicle参数&#xff0c;比如直接将vehicle“iris_stereo_camera”。然…

【前段基础入门之】=>CSS 中对颜色数值的四种表达方式!

导语&#xff1a; 在通过 CSS 设置元素样式的时候&#xff0c;对于颜色的定义&#xff0c;有以下四种表达方式。 文章目录 方式一&#xff1a;【颜色名】方式二&#xff1a;rgb 或 rgba方式三&#xff1a;&#xff1a;HEX 或 HEXA方式四&#xff1a;HSL 或 HSLA 方式一&#xf…

系统集成项目管理总结(笔记)

系统集成项目管理总结 基础知识 第一章 信息化知识 第二章 信息系统服务管理 第三章 系统集成专业技术 第四章 项目管理一般知识 第五章 立项管理 第六章 整体管理 第七章 范围管理 第八章 进度管理 第九章 成本管理 第十章 质量管理 第十一章 人力资源管理 第十二…

【Nuxt】04 Nuxt2-SEO: sitemap.xml、seo优化、robots.txt

1 SiteMap设置 环境准备 注意生成sitemap依赖于nuxtjs/sitemap&#xff0c;并且需要用axios进行请求&#xff0c;不要使用nuxtjs/axios&#xff0c;不然会报错 sitemap.xml配置 在nuxt.config.js中配置下面的内容 npm install nuxtjs/sitemap npm install axios在static/s…