【微服务】Sentinel(流量控制)

文章目录

    • 1.基本介绍
        • 1.Sentinel是什么
        • 2.Sentinel主要特性
        • 3.Sentinel核心功能
          • 1.流量控制
          • 2.熔断降级
          • 3.消息削峰填谷
        • 4.Sentinel两个组成部分
    • 2.Sentinel控制台显示
        • 1.需求分析
        • 2.下载
        • 3.运行
          • 1.进入cmd
          • 2.输入java -jar sentinel-dashboard-1.8.0.jar
          • 3.查看默认端口8080
        • 4.访问
          • 1.账号和密码都是sentinel
          • 2.登录成功
          • 3.退出就在cmd输入ctrl + c
        • 5.切换端口
          • 1.在启动时携带端口参数 --server.port=8081(端口最大65535)
          • 2.演示
          • 3.netstat -anb | more 查看端口监听情况(空格显示更多)
    • 3.Sentinel监听指定微服务
        • 1.示意图(在10004模块配置)
        • 2.pom.xml引入Sentinel
        • 3.application.yml 配置sentinel与服务端通信
        • 4.测试
          • 1.启动Nacos(启不启动都可以)和Sentinel
          • 2.启动10004微服务
          • 3.nacos查看注册情况
          • 4.浏览器输入 http://localhost:10004/member/get/1
          • 5.http://localhost:8080 查看Sentinel实时监控
        • 5.QPS和Sentinel懒加载
    • 4.Sentinel 流量控制介绍 + QPS实例
        • 1.配置界面
        • 2.基本介绍
        • 3.流量控制实例-QPS
          • 1.需求分析
          • 2.找到/member/get/1的流量控制界面
          • 3.选择QPS,单机阈值设置成1
          • 4.可以查看流控规则
          • 5.点击编辑即可修改
        • 4.测试
          • 1.步骤
          • 2.浏览器快速访问http://localhost:10004/member/get/1,可以看到被限流了
        • 5.流控规则实时生效原因
        • 6.携带参数方式进行限流
          • 1.方式一:修改/member/get/{id} 为/member/get,使用请求参数的形式获取值,限流规则修改为/member/get
            • 1.代码:
            • 2.修改限流规则
            • 3.测试,使用id=2也会被限流
          • 2.方式二:使用URL资源清洗
            • 1.基本介绍
            • 2.com/sun/springcloud/controller/CustomerUrlCleaner.java 将URL进行资源清洗
            • 3.修改限流规则
            • 4.访问测试,成功限流
        • 7.注意事项:Sentinel的流控规则默认没有持久化,只要重启调用API所在模块就没了!
    • 5.Sentinel 流量控制—线程数
        • 1.需求分析
        • 2.修改流控规则
        • 3.浏览器输入http://localhost:10004/member/get/1 并快速刷新
        • 4.为了看到效果,让线程休眠一秒
        • 5.重启10004模块(需要重新配置限流规则),快速发送请求
    • 6.Sentinel 流量控制—关联
        • 1.需求分析
        • 2.com/sun/springcloud/controller/MemberController.java 添加两个接口为t1和t2
        • 3.配置t1的限流规则为关联t2
        • 4.postman模拟高并发测试
          • 1.测试请求t2
          • 2.点击save
          • 3.New Collection
          • 4.命名后创建
          • 5.点击集合右边三个点,然后Run collection
          • 6.选择迭代次数和间隔毫秒数,然后Run test
          • 7.浏览器输入 http://localhost:10004/t1 ,发现被限流
    • 7.Sentinel 流量控制—Warm up
        • 1.基本介绍
        • 2.需求分析
        • 3.具体配置
          • 1.启动Sentinel
          • 2.启动Nacos
          • 3.启动10004微服务,成功注册
          • 4.浏览器先输入 http://localhost:10004/t2 然后查看Sentinel控制台
          • 5.修改流控规则
          • 6.测试
            • 前三秒的QPS为9 / 3 = 3,三秒后的QPS为9
    • 8.Sentinel 流量控制—排队等待
        • 1.基本介绍
        • 2.需求分析
        • 3.具体配置

1.基本介绍

1.Sentinel是什么

image-20240328135400717

2.Sentinel主要特性

image-20240328135431135

3.Sentinel核心功能
1.流量控制

image-20240328140337069

2.熔断降级

image-20240328140327771

3.消息削峰填谷

image-20240328140608196

4.Sentinel两个组成部分

image-20240328140919795

2.Sentinel控制台显示

1.需求分析

image-20240328141057615

2.下载

image-20240328141315133

3.运行
1.进入cmd
2.输入java -jar sentinel-dashboard-1.8.0.jar

image-20240328141455114

3.查看默认端口8080

image-20240328141711211

4.访问
1.账号和密码都是sentinel

image-20240328142944438

2.登录成功

image-20240328143006157

3.退出就在cmd输入ctrl + c
5.切换端口
1.在启动时携带端口参数 --server.port=8081(端口最大65535)
2.演示

image-20240328143355396

3.netstat -anb | more 查看端口监听情况(空格显示更多)

image-20240328143622859

3.Sentinel监听指定微服务

1.示意图(在10004模块配置)

image-20240328144025848

2.pom.xml引入Sentinel
        <!-- 引入sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
3.application.yml 配置sentinel与服务端通信
  • 注意这里与sentinel相关的就只有配置sentinel的部分
  • 这里开启的port是在本机上进行监听,作为客户端与sentinel的服务端进行通信,并且如果8719端口被占用,则会自动将端口号加一直到找到可用的端口
server:port: 10004 # 配置服务端口
spring:application:name: member-service-nacos-provider # 配置服务的名称,名字任意这里与项目
# 配置naocscloud:nacos:discovery:server-addr: localhost:8848 # 配置nacos的地址
# 配置sentinelsentinel:transport:dashboard: localhost:8080 # 配置sentinel的地址port: 8719 # 配置sentinel的端口,当端口冲突时,会自动+1,直到找到可用端口
# 暴露所有的监控点
management:endpoints:web:exposure:include: "*"
mybatis:mapper-locations: classpath:mapper/*.xml # 扫描所有Mapper.xmltype-aliases-package: com.sun.springcloud.entity # 扫描所有实体类,可以直接使用类名来标识
4.测试
1.启动Nacos(启不启动都可以)和Sentinel

image-20240328150303841

image-20240328150242246

2.启动10004微服务

image-20240328150723267

3.nacos查看注册情况

image-20240328150709408

4.浏览器输入 http://localhost:10004/member/get/1

image-20240328151644325

5.http://localhost:8080 查看Sentinel实时监控
  • 注意,这个实时监控只要一段时间不访问,数据就会暂时消失

image-20240328151743346

image-20240328151947861

5.QPS和Sentinel懒加载

image-20240328152108659

4.Sentinel 流量控制介绍 + QPS实例

1.配置界面

image-20240328153608128

2.基本介绍

image-20240328153717724

image-20240328153729769

3.流量控制实例-QPS
1.需求分析

image-20240328154013931

2.找到/member/get/1的流量控制界面

image-20240328154345217

image-20240328154352163

3.选择QPS,单机阈值设置成1

image-20240328154700505

4.可以查看流控规则

image-20240328154814469

5.点击编辑即可修改

image-20240328154834645

4.测试
1.步骤

image-20240328154941559

2.浏览器快速访问http://localhost:10004/member/get/1,可以看到被限流了

image-20240328155038410

5.流控规则实时生效原因

image-20240328155703454

6.携带参数方式进行限流
1.方式一:修改/member/get/{id} 为/member/get,使用请求参数的形式获取值,限流规则修改为/member/get
1.代码:
    /*** 根据id来获取某个会员的信息** @param id 使用请求参数的形式传入参数* @return 返回json格式的数据*/@GetMapping("/member/get") // 这里修改成请求参数的形式public Result getMemberById(@RequestParam("id") Long id) {Member member = memberService.queryMemberById(id);if (member != null) {return Result.success("查询成功!member-service-nacos-provider-10004", member);} else {return Result.error("402", "ID= " + id + "不存在");}}
2.修改限流规则

image-20240328160828746

3.测试,使用id=2也会被限流

image-20240328160903751

2.方式二:使用URL资源清洗
1.基本介绍

image-20240328161030902

2.com/sun/springcloud/controller/CustomerUrlCleaner.java 将URL进行资源清洗

image-20240328163140279

  • 注意:这里的资源清洗只是表示返回给Sentinel的URL改变了
package com.sun.springcloud.controller;import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;/*** Description: URL资源清洗** @Author sun* @Create 2024/3/28 16:17* @Version 1.0*/
@Component // 注入到spring容器中
public class CustomerUrlCleaner implements UrlCleaner {@Overridepublic String clean(String originUrl) {// 判断是否为空if (StringUtils.isBlank(originUrl)) {return originUrl;}// 如果是/member/get开头的url,就将其清洗为/member/get/*if (originUrl.startsWith("/member/get")) {return "/member/get/*";}return originUrl;}
}
3.修改限流规则

image-20240328163403118

4.访问测试,成功限流

image-20240328163306195

7.注意事项:Sentinel的流控规则默认没有持久化,只要重启调用API所在模块就没了!

5.Sentinel 流量控制—线程数

1.需求分析
  • 一次请求就是一个线程

image-20240328164416517

2.修改流控规则

image-20240328164945544

3.浏览器输入http://localhost:10004/member/get/1 并快速刷新
  • 这里并没有被限流,原因是,第一次请求开启了一个工作线程,在第二次请求到达之前,上一个工作线程已经关闭

image-20240328165340507

4.为了看到效果,让线程休眠一秒

image-20240328170155053

5.重启10004模块(需要重新配置限流规则),快速发送请求
  • 成功限流

image-20240328170258292

6.Sentinel 流量控制—关联

1.需求分析
  • 简单来说就是t1关联t2,当t2的QPS超过1,则t1被限流

image-20240328171438642

2.com/sun/springcloud/controller/MemberController.java 添加两个接口为t1和t2
    // 编写两个测试的接口,路由分别为t1和t2@GetMapping("/t1")public String t1() {return "t1";}@GetMapping("/t2")public String t2() {return "t2";}
3.配置t1的限流规则为关联t2

image-20240328172336128

4.postman模拟高并发测试
1.测试请求t2

image-20240328172844044

2.点击save

image-20240328173047249

3.New Collection

image-20240328173058885

4.命名后创建

image-20240328173129677

5.点击集合右边三个点,然后Run collection

image-20240328173221786

6.选择迭代次数和间隔毫秒数,然后Run test

image-20240328173326517

7.浏览器输入 http://localhost:10004/t1 ,发现被限流

image-20240328173520355

7.Sentinel 流量控制—Warm up

1.基本介绍

image-20240329093452389

2.需求分析
  • 简单来说假如最终要到达的QPS为90,设置的预热时间为3s,则在3s内,QPS只能为90/3=30,而在3s后QPS逐渐增加,直到为90

image-20240329093950996

3.具体配置
1.启动Sentinel

image-20240329094753020

2.启动Nacos

image-20240329095314944

3.启动10004微服务,成功注册

image-20240329095443614

4.浏览器先输入 http://localhost:10004/t2 然后查看Sentinel控制台

image-20240329100210480

5.修改流控规则

image-20240329100304866

6.测试
前三秒的QPS为9 / 3 = 3,三秒后的QPS为9

image-20240329100516116

8.Sentinel 流量控制—排队等待

1.基本介绍

排队等待策略只有在超过了QPS的情况下才会生效,也就是假如设置的QPS为1,就表示1s只能处理一个请求,一旦1s内有两个请求,那么第二个请求就会进行排队等待,当第一个请求完成之后才会处理第二个请求。

关于设置的超时时间,表示等待的时间一旦超过了这个时间就会被限流

需要注意的是,如果想要启动排队等待的流控策略,则阈值类型就必须要是QPS

2.需求分析

image-20240329101608392

3.具体配置
  • 这样配置就表示1s内只能有一个请求,如果有第二个就会进行排队等待,直到第一个请求处理完,一旦等待时间超过1s就会被限流

image-20240329103247859

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

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

相关文章

数据结构(一)----前导知识

目录 一.数据相关 1.数据元素与数据项 2.数据对象和数据结构 3.数据结构的三要素 &#xff08;1&#xff09;逻辑结构 &#xff08;2&#xff09;数据运算 &#xff08;3&#xff09;物理结构&#xff08;存储结构&#xff09; 4.数据类型和抽象数据类型 二.算法 1.算…

[数据结构]排序

本篇主要是对常见排序的分类和一些排序的详解 一、插入排序 1.直接插入排序 // 直接插入排序函数 void insertionSort(int arr[], int n) {int i, key, j;for (i 1; i < n; i) {key arr[i]; // 取出待排序的元素j i - 1;// 将大于key的元素向后移动一位while (j > 0…

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器 1、接上篇 Windows Server 2022 使用ApacheDS用户认证 使用Administrator用户远程登录192.168.1.100windows server&#xff0c;打开pGina软件 2、输入刚刚在ApacheDS中的新添加的用户测试一下&#xff0c;会自动添加…

设计模式之抽象工厂模式精讲

概念&#xff1a;为创建一组相关或相互依赖的对象提供一个接口&#xff0c;而且无须指定他们的具体类。 抽象工厂模式是工厂方法模式的升级版本。在存在多个业务品种或分类时&#xff0c;抽象工厂模式是一种更好的解决方式。 抽象工厂模式的UML类图如下&#xff1a; 可以看…

C++教学——从入门到精通 4.setw()语句

这次玩点新鲜的------setw() 这家虎是啥呢&#xff1f; 我们编程输出的时候总是要输出空格&#xff0c;但有些时候又点的手都麻了 这时setw语句就派上用场了 具体怎么用呢&#xff1f; 如下图 #include"iostream"// #include"iomanip"// bits/stdc…

OSCP靶场--RubyDome

OSCP靶场–RubyDome 考点(CVE-2022-25765 suid ruby提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.249.22 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-29 00:28 EDT Nmap scan report for 192.168.249.22 Hos…

配置文件乱码

1、改UTF-8 &#xff08;1&#xff09;已经创建的项目 (2)新项目也改一下

YOLOv9改进策略 :主干优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet

💡💡💡本文改进内容: VanillaNet,是一种设计优雅的神经网络架构, 通过避免高深度、shortcuts和自注意力等复杂操作,VanillaNet 简洁明了但功能强大。 💡💡💡引入VanillaBlock GFLOPs从原始的238.9降低至 165.0 ,保持轻量级的同时在多个数据集验证能够高效涨点…

北京WordPress建站公司

北京wordpress建站&#xff0c;就找北京wordpress建站公司 http://wordpress.zhanyes.com/beijing

java--this关键字

this代表当前对象&#xff0c;this后面可以加&#xff1a; 1、属性--> this.属性&#xff1a; 当方法中的局部变量与成员变量名称相同时&#xff0c;成员变量必须用this&#xff0c;其它情况的this可以省略 2、方法--this.方法&#xff1a;静态方法中不能使用this关键字&…

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c;用…

求组合数I(acwing)

题目描述&#xff1a; 给定n组询问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod(1e97)的值。 输入格式: 第一行包含整数n。 接下来n行&#xff0c;每行包含一组a和b。 输出格式: 共n行&#xff0c;每行输出一个询问的解。 …

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP&#xff1f; ISP住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符&#xff0c;通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的&#xff0c;即每次连接时都可能会…

java基础动态代理和反射(一)-- 动态代理,反射,动态语言,静态语言

动态代理 代理&#xff1a;本来应该自己做的事情&#xff0c;却请来了别人来做&#xff0c;被请的人就是代理对象。动态代理&#xff1a;在程序运行过程中产生的这个对象。动态代理其实就是通过反射来生成一个代理。 import java.lang.reflect.InvocationHandler; import jav…

苹果推出Swift开发教程 无需编码知识小白也能学

简介 苹果推出Swift开发教程&#xff0c;教授开发者如何使用 Swift、SwiftUI 和 Xcode 开发 iOS 应用。从基本的界面设计到复杂的数据建模和空间计算。据苹果公司称&#xff0c;网站上提供的教程 "适合所有人"&#xff0c;即使是那些没有任何编码经验的人。教程提供…

让工作自动化起来!无所不能的Python

让工作自动化起来&#xff01;无所不能的Python 让工作自动化起来&#xff01;无所不能的Python编辑推荐内容简介作者简介前言为什么要写这本书读者对象如何阅读本书 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全…

Java中常见的锁策略

目录 乐观锁 vs 悲观锁 悲观锁: 乐观锁&#xff1a; 重量级锁 vs 轻量级锁 ⾃旋锁&#xff08;Spin Lock&#xff09; 公平锁 vs 非公平锁 可重⼊锁 vs 不可重入锁 读写锁 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别…

【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

与一般的Dataloader的区别在于我们对图像进行了随机裁剪&#xff0c;需要进行额外的操作才能将其打包到dataloader里面 这一段的代码如下&#xff1a; if args.distributed:sampler_train DistributedSampler(dataset_train)sampler_val DistributedSampler(dataset_val, shu…

C语言动态内存讲解+通讯录2.0

文章目录 前文malloc和freecallocrealloc枚举常量的简单说明及使用 通讯录2.0动态开辟通讯录,满了就扩容保存数据和载入数据 通讯录2.0演示推荐好用的软件 前文 本文主要介绍动态开辟的几个函数,以及改进之前的通讯录。 我们局部变量等是在栈区上开辟空间的,而我们动态开辟的空…

非wpf应用程序项目【类库、用户控件库】中使用HandyControl

文章速览 前言参考文章实现方法1、添加HandyControl包&#xff1b;2、添加资源字典3、修改资源字典内容 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 前言 wpf应用程序中&#xff0c;在入口项目中…