SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控

SpringCloudAlibaba–Sentinel

Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些规则保护应用。它比Hystrix支持的范围广泛,如Spring Cloud、Dubbo、gRPC都可以整合。集成简单,只需少量的配置和代码就可以完成,容易完成自己定制化的逻辑。

  • 资源是Sentinel最关键的概念,遵循Sentinel API的开发规范定义资源,就能将应用保护起来。

  • 规则可以通过控制面板配置,也可以和资源联合起来,规则可以在控制台修改并且即时生效。

名词解释

  • 限流:对某个资源的访问数量做限制,不让流量一窝蜂地挤进资源访问
  • 降级:即使系统出现问题情况下,也要尽可能提供服务,在可用和完全不可用之间找一个平衡点,如返回友好提示。
  • 熔断:是一种资源访问的状态,熔断状态时,直接拒绝所有的访问,返回友好提示

同类产品对比

基础特性SentinelHystrixResilience4j
限流QPS、线程数、调用关系有限的支持Rate Limiter
注解支持支持支持支持
动态规则配置支持多种数据源支持多种数据源有限支持数据源
熔断降级策略平均响应时间、异常比例、异常数异常比例平均响应时间、异常比例
控制台配置各种规则简单监控无控制台
常用适配框架Servlet、SpringCloud、Dubbo、gRPCServlet、Spring CloudNetflixSpringBoot、Cloud

Resilience4j在国外使用较多,而Hystrix框架已经停止更新进入维护了。

下载和运行

按照笔者之前的笔记,SpringCloudAlibaba是选择的2021.0.4.0版本的,那么可以看下它们之间的版本对应关系

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNsTZKUf-1690077185768)(../imgs2/1.png)]

选择这个1.8.5版本即可,到sentinel的下载页面选择即可https://github.com/alibaba/Sentinel/releases

在这里插入图片描述

下载完毕后的jar包启动即可

java -jar sentinel-dashboard-1.8.5.jar

默认的端口是8080,如需更改命令行添加即可

java -jar -Dserver.port=9090 sentinel-dashboard-1.8.5.jar

启动后,打开http://localhost:8080/,账号和密码都是sentinel

在这里插入图片描述

进入后发现没有任何的资源可以进行规则控制。sentinel是采用的懒加载的方式,当使用时才会进行加载。

集成Sentinel

生产者

项目中引入依赖

<dependencies><!-- 服务注册  服务发现需要引入的 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--健康监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--SpringBoot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--sentinel依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies>

bootstrap.yml中做配置

server:port: 8002
spring:application:name: provider # 应用名cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址sentinel:transport:port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描dashboard: 127.0.0.1:8080 # 仪表版访问地址

java controller做个资源

@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {@RequestMapping("/test")public String test() {return "sentinel-provider8002 test()" + RandomUtils.nextInt(0, 1000);}
}

消费者

同生产者引入依赖,做好配置,再到controller做个资源

使用RestTemplate+Ribbon做远程调用,添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

javaConfig配置

@Configuration
public class GenericConfiguration { // 常规配置类@LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力@Beanpublic RestTemplate restTemplate(){ // 创建RestTemplate,并交个Spring容器管理return new RestTemplate();}
}
@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {private final String SERVER_URL = "http://provider";@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/test")public String test() {return restTemplate.getForObject(SERVER_URL + "/test", String.class);}@RequestMapping("/sentinelTest")public String sentinelTest() {return "sentinel-consumer9001 sentinelTest" + RandomUtils.nextInt(0, 1000);}}

完成后,启动项目调用生产者的test接口,然后到sentinel控制台。

curl localhost:9001/test
==> sentinel-provider8002 test()599

在这里插入图片描述

两个服务都出现在了控制台上。

Sentinel常用控制规则

我们需要对接口进行压测,所以使用jmeter吧,到jmter官方下载即可。

流控规则

流控主要是设置QPS或线程数等参数保护应用,针对某个资源的设置,下面操作sentinel控制台设置一些规则。

注意:要先调用接口后,才能添加规则(s加载)

QPS–直接–快速失败

QPS:(Query Per Second)指每秒可处理的请求数

在簇点链路–>列表视图–>到/sentinelTest资源点击流控,阈值选择QPS,单机阈值1,新增。

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFrataJl-1690077185772)(../imgs2/6.png)]

打开jmeter压测:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8Z4O7kF-1690077185772)(../imgs2/7.png)]

查看执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bl7WO34A-1690077185773)(../imgs2/8.png)]

10个请求也就两个成功了,其他都被限流了,直接blocked

QPS–直接–WarmUp

数据预热,即初始请求QPS等于阈值/codeFactor,codeFactor默认值3,经过预热时长1s后单机阈值变为100

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qC7UC1Ql-1690077185773)(../imgs2/9.png)]

压测数量100

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ok19c3YR-1690077185774)(../imgs2/10.png)]

看结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0Y5NtUv-1690077185774)(../imgs2/11.png)]

前期接口正常返回,当访问量越来越多时,请求QPS=codeFactor(3)时,其他访问直接回绝,经过1s的预热,QPS变成了100后,后面的的所有请求全部正常访问。

QPS–直接–排队等待

让请求全部均匀访问通过,如果请求量超过阈值就等待,若等待超时就返回失败。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rQdwpOeC-1690077185774)(../imgs2/12.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YmAOFAH4-1690077185775)(../imgs2/13.png)]

虽然QPS单机阈值是1,但是我们的超时时间为15s,所以等得起访问全部成功。

QPS–关联–快速失败

如果访问B接口到达了阈值,那么就让A接口返回失败。适用于资源之间有资源竞争或依赖关系。

再写一个接口sentinelTestB

@RequestMapping("/sentinelTestB")
public String sentinelTestB() {return "sentinel-consumer9001 sentinelTestB" + RandomUtils.nextInt(0, 1000);
}

设置规则,要注意当我们重启项目后,这些接口需要重新访问一遍才会出现在sentinel的簇点链路中

在这里插入图片描述

jmter不停访问/sentinelTestB,让B接口超过达阈值,然后在去调用/sentinelTest时直接回绝访问

因为sentinelTestB是没有做流控的,所以请求都是成功的,但是因为访问B接口的请求数是超过QPS阈值的,那么A接口则直接失败。

curl localhost:9001/sentinelTest
Blocked by Sentinel (flow limiting)

线程数–直接

限制处理请求的业务线程数,达到阈值就限流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1YFoTer-1690077185776)(../imgs2/15.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7Cja2mh-1690077185776)(../imgs2/16.png)]

可以看到很多请求都被限流了,这个跟服务器的配置有关,当服务器的配置较好时,可以适当将阈值设置的高一些,保证资源的访问情况。

控制台几个关键词

  • 资源名:就是接口的资源,名称唯一即可
  • 针对来源:此资源对调用者进行限流,默认defatult,对所有客户端限流;可填写调用者的spring.application.name指定对某个客户端进行限流。
  • 阈值类型:QPS:每秒能接受的请求数量,线程数:能够使用的业务线程数(服务器内部的线程数)
  • 流控模式:
    • 直接:达到条件,直接执行某个流控效果
    • 关联:如果关联资源达到条件,直接限流自身
    • 链路:记录从入口资源的流量,达到条件也只限流入口资源
  • 流控效果:
    • 快速失败:达到条件,直接返回失败
    • WarmUp:预热,给一个缓冲时间,缓慢增加阈值
    • 排队等待:让系统匀速处理请求,其他请求进入等待,超时后未被处理的请求直接返回失败

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

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

相关文章

Guitar Pro8吉他谱制作软件好不好用?

吉他谱是学习和演奏吉他的重要工具之一&#xff0c;对于吉他爱好者而言&#xff0c;掌握一款优秀的吉他谱制作软件是必不可少的。随着科技的进步&#xff0c;现在有许多吉他谱制作软件可供选择。下面我们就来看吉他谱制作软件哪个好&#xff0c;以及怎么制作吉他谱子吧&#xf…

【OpenGL学习】之着色器GLSL基础

基本类型: 类型说明void空类型,即不返回任何值bool布尔类型 true,falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2, vec3, vec4n维浮点数向量 n-component floating point vectorbvec2, bvec3, bvec4n维布尔向量 Boolean vectorivec2, ivec3, iv…

005.PADS VX2.4自定义快捷键设置及修改

005.PADS VX2.4自定义快捷键设置及修改 若部分快捷键不符合操作习惯或者部分功能系统未设置快捷键&#xff0c;可自定义快捷键功能&#xff0c;自定义快捷键功能需要注意设置的按键需要与无模命令区分&#xff0c;以免与无模命令冲突&#xff1b;如若需要修改某个快捷功能&…

年轻小伙爆肝ARST

关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ⭐️● Algorithm: 每周至少做一个 LeetCode 的算法题 ⭐️● Review: 阅读并点评至少一篇技术文章 ⭐️● Tips: 学习至少一个技术技巧 ⭐️● Share: 分享一篇有观点和思考的技术文章 希望通过此次活动能聚集一波热爱技…

移动端商品详情页设计

效果图 代码如下 页面设计 <div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&#xffe5;<span&…

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…

ROS-Moveit机械臂追踪二维码(四)

ROS-Moveit机械臂追踪二维码(四) 在仿真环境增加相机 <gazebo reference"camera_depth_frame"><sensor name"camera1" type"depth"><always_on>true</always_on><update_rate>20.0</update_rate><came…

KnowStreaming系列教程第二篇——项目整体架构分析

一、KS项目代码结构&#xff1a; ks项目代码结构如上&#xff1a; (1)km-console 是前端部分&#xff0c;基于React开发 (2)km-rest 是后端部分&#xff0c;主要是接受前端请求&#xff0c;对应controller相关代码所在模块 (3)km-biz:业务逻辑处理 (4)km-core:核心逻辑 (5…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

Java_23_并发包

并发包 并发包的来历&#xff1a; 在实际开发中如果不需要考虑线程安全问题&#xff0c;大家不需要做线程安全&#xff0c;因为如果做了反而性能不好&#xff01; 但是开发中有很多业务是需要考虑线程安全问题的&#xff0c;此时就必须考虑了。否则业务出现问题。 Java为很多业…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的&#xff0c;变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9&#xff0c;且已完成docker的构建 二、安装mysql5.7 安装镜像&#xff1a;[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器&#xff0c;且分配端口号[rootlocalhost lll]# dock…

JVM(Java Virtual Machine)

哥几个来学 JVM 啦~~ 目录 &#x1f332;一、JVM 执行流程&#xff08; JVM 是如何运行的&#xff1f;&#xff09; &#x1f333;二、JVM 运行时数据区 &#x1f366;1. 堆&#xff08;线程共享&#xff09; &#x1f367;2. Java 虚拟机栈&#xff08;线程私有&#xff0…

关于我组件家庭服务器,挑选硬件设备的经历

目录 起因 升级——玩客云 原因 折腾日记 又升级——d2550工控主机 原因 折腾日记 又双升级——itx主机 原因 折腾日记 又双叒升级&#xff08;目前再用的机器&#xff09;——i9级x99平台e5v3主机 原因 折腾日记 心得 起因 起因大概在今年三月底四月初的时候&…

DuckDB全面挑战SQLite

概要 当我们想要在具有嵌入式数据库的本地环境中工作时&#xff0c;我们倾向于默认使用 SQLite。虽然大多数情况下这都很好&#xff0c;但这就像骑自行车去 100 公里之外&#xff1a;可能不是最好的选择。 这篇文章中将讨论以下要点&#xff1a; • DuckDB 简介&#xff1a;它…

uniapp WIFI上下班打卡

大纲 &#x1f959; uniapp官网&#xff1a;uni-app官网 &#x1f959; WIFI功能模块&#xff1a; 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE &#xff08;访问权限状态&#xff09; 2. CHANGE_WIFI_STATE&#xff…

SpringBoot整合ActiveMQ

ActiveMQ简单使用 JMS ActiveMQ 下载安装 https://activemq.apache.org/components/classic/download/解压缩文件。进入win64目录&#xff0c;双击运行activemq.bat文件&#xff0c;运行服务 将下面的网址输入到浏览器&#xff0c;用户名和密码都是admin SpringBoot整合Act…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展&#xff0c;外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业&#xff0c;可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化&#xff0c;我们在这里提供了一些提…

异构线程池的c++实现方案

概要 通常线程池是同质的&#xff0c;每个线程都可以执行任意的task&#xff08;每个线程中的task顺序执行&#xff09;&#xff0c;如下图所示&#xff1a; 但本文所介绍的线程和task之间有绑定关系&#xff0c;如A task只能跑在A thread上&#xff08;因此称为异构线程池&am…