【微服务】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 # 配置服务的名称,名字任意这里与项目
# 配置naocs
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置nacos的地址
# 配置sentinel
    sentinel:
      transport:
        dashboard: localhost:8080 # 配置sentinel的地址
        port: 8719 # 配置sentinel的端口,当端口冲突时,会自动+1,直到找到可用端口
# 暴露所有的监控点
management:
  endpoints:
    web:
      exposure:
        include: "*"
mybatis:
  mapper-locations: classpath:mapper/*.xml # 扫描所有Mapper.xml
  type-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 {
    @Override
    public 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

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

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

相关文章

数据结构课设-基于Python的校园导航系统(附源码)

一月份的数据结构课设完成后&#xff0c;我对Python的了解也更加深刻。现将课设报告及源码开源&#xff0c;不足之处希望大家指正。源码我放在博客主页的资源中&#xff0c;需要的话大家自行下载&#xff08;用户信息保存在 users.json 文件中&#xff0c;地图信息保存在 campu…

GooglePlay无法下载应用问题

问题如下 解决方法 1、实际上是因为google尚未添加apk downloader扩展程序 2、添加该扩展程序后&#xff0c;在应用中搜索应用名即可 欧克&#xff01;下载完成

IDEA设置内存大小不生效

IDEA设置内存大小不生效 100%可行的方法 -Xms512m -Xmx4096m1.首先要找对idea加载的是哪个配置文件。 2.找到idea启动文件夹&#xff0c;编辑idea.bat 添加打印修改文件路径的代码&#xff0c;运行idea.bat打印一下你的配置文件路径&#xff0c;找到路径 修改 然后运行idea.…

机器学习作业二之KNN算法

KNN&#xff08;K- Nearest Neighbor&#xff09;法即K最邻近法&#xff0c;最初由 Cover和Hart于1968年提出&#xff0c;是一个理论上比较成熟的方法&#xff0c;也是最简单的机器学习算法之一。该方法的思路非常简单直观&#xff1a;如果一个样本在特征空间中的K个最相似&…

vs2022 关于Python项目无法识别中文的解决方法

这是针对于vs2022安装和使用教程&#xff08;详细&#xff09;-CSDN博客 Python项目无法识别中文的解决方法的文章 一、问题 1.输入代码 print("你好Hello world&#xff01;") 2.启动&#xff0c;发现代码里有中文报错 二、解决方法 1.选择菜单栏里的工具->…

超实用的Maven指南

文章目录 实战记录&#x1f4dd;Maven 指令大全 &#x1f31f;找到没有被使用的jar&#xff08;analyze&#xff09;分析jar是被哪个maven引入&#xff08;tree&#xff09;&#x1f31f; dependencies&#xff08;Maven依赖&#xff09;build-resources&#xff08;资源导入&a…

如何提高知识库系统管理水平?

我们都有过这样的经历--遇到问题或紧急请求时&#xff0c;第一时间就是向知识库系统寻求帮助。很多时候&#xff0c;当你翻遍了无穷无尽的文档&#xff0c;却发现没有任何东西能够摆脱此时的困境&#xff0c;这时&#xff0c;向服务台提交工单成了不可避免的解决方式&#xff0…

基于Java的新生入学报到管理系统的设计与实现(论文+源码+PPT)_kaic

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息…

2024年2月游戏手柄线上电商(京东天猫淘宝)综合热销排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;游戏手柄品牌销售数据已出炉&#xff01;2月游戏手柄销售数据呈现出强劲的增长势头。 根据鲸参谋数据显示&#xff0c;今年2月游戏手柄月销售量累计约43万件&#xff0c;同比去年上涨了78%&#xff1b;销售额累计达1…

Stable Diffusion 模型分享:SDXL Unstable Diffusers ☛ YamerMIX(混合风格)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

每日一题 --- 快乐数[力扣][Go]

快乐数 题目&#xff1a;202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

Spring用到了哪些设计模式?

目录 Spring 框架中⽤到了哪些设计模式&#xff1f;工厂模式单例模式1.饿汉式&#xff0c;线程安全2.懒汉式&#xff0c;线程不安全3.懒汉式&#xff0c;线程安全4.双重检查锁&#xff08;DCL&#xff0c; 即 double-checked locking&#xff09;5.静态内部类6.枚举单例 代理模…

AI 文字转语音工具以及它们的官网收集(值得收藏)

目前比较成熟的 AI 文字转语音工具以及它们的官网&#xff1a; 百度语音合成 (https://ai.baidu.com/tech/speech/tts)&#xff1a; 百度语音合成是百度 AI 推出的语音合成服务&#xff0c;支持多种语言和音色&#xff0c;可以用于语音播报、智能客服、有声阅读等场景。 阿里云…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…

对 CSS 工程化的理解

CSS 工程化是为了解决以下问题&#xff1a; 宏观设计&#xff1a;CSS 代码如何组织、如何拆分、模块结构怎样设计&#xff1f;编码优化&#xff1a;怎样写出更好的 CSS&#xff1f;构建&#xff1a;如何处理我的 CSS&#xff0c;才能让它的打包结果最优&#xff1f;可维护性&a…

【计算机网络】第 11、12 问:流量控制和可靠传输机制有哪些?

目录 正文流量控制的基本方法停止-等待流量控制基本原理滑动窗口流量控制基本原理 可靠传输机制1. 停止-等待协议2. 后退 N 帧协议&#xff08;GBN&#xff09;3. 选择重传协议&#xff08;SR&#xff09; 正文 流量控制涉及对链路上的帧的发送速率的控制&#xff0c;以使接收…

哪些开放式耳机平价又好用的?五款超平价品牌推荐深度测评分享!

在当今快节奏的生活中&#xff0c;高品质的音频设备已成为放松身心的重要途径之一。开放式耳机&#xff0c;凭借其出色的音频表现和舒适的佩戴体验&#xff0c;正逐渐成为音乐爱好者的新选择。它们特有的开放设计不仅减轻了耳罩带来的压迫感&#xff0c;还使得用户仿佛置身于音…

四种常用限流算法、固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法

什么是限流&#xff1f; 限流可以被视为服务降级的一种形式&#xff0c;其核心目标是通过控制输入和输出流量来保护系统。通常&#xff0c;一个系统的处理能力是可以预估的&#xff0c;为了确保系统的稳定运行&#xff0c;当流量达到预定的阈值时&#xff0c;必须采取措施限制进…

vue中使用jsmind生成脑图

项目部分参数&#xff1a; vue&#xff1a;2.6.10 node:16.20.0 1、使用命令行安装jsmind&#xff1a; npm i jsmind -S 2、在文件中引入jsmind&#xff0c;并编写渲染jsmind的代码&#xff1a;&#xff1a; <template><!-- jsmind容器 --><divid"jsmi…

C#_泛型_委托

文章目录 泛型泛型的使用泛型的约束委托委托的实例化多播委托委托的调用内置委托类型委托练习泛型委托Lambda表达式(进阶)上期习题答案本期习题 泛型 泛型&#xff08;Generic&#xff09; 是一种规范&#xff0c;它允许我们使用占位符来定义类和方法&#xff0c;编译器会在编…