当前位置: 首页 > news >正文

Sentinel网关限流

背景

在微服务架构下,每个服务的性能都不同,为避免出现流量洪峰将服务冲垮,需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具,社区活跃,功能也很全面,包含实时监控、流控、熔断等功能。它也提供了spring-cloud-gateway的支持,可以很方便和spring-gateway进行整合。

目标

spring-gateway服务添加sentinel支持,并通过sentinel dashboard进行规则配置,规则数据存在nacos里,支持规则变更实时生效。

方案

服务结构

spring-gateway改动

引入工程依赖

在pom文件里添加sentinel的依赖:

<!--sentinel支持spring-->

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

</dependency>

<!--自动集成spring gateway-->

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>

</dependency>

<!--支持nacos的动态数据源-->

<dependency>

    <groupId>com.alibaba.csp</groupId>

    <artifactId>sentinel-datasource-nacos</artifactId>

</dependency>

加载限流规则

在application.properties文件里添加sentinel规则对应nacos配置信息:

project.name=spring-gateway

sentinel.nacos.default.namespace=SENTINEL_GROUP

spring.cloud.sentinel.datasource.gw_api_group.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.gw_api_group.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.gw_api_group.nacos.data-id=${project.name}-gw_api_group-rules

spring.cloud.sentinel.datasource.gw_api_group.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.gw_api_group.nacos.data-type=json

spring.cloud.sentinel.datasource.gw_api_group.nacos.rule-type=gw_api_group

spring.cloud.sentinel.datasource.gw_flow.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.gw_flow.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.gw_flow.nacos.data-id=${project.name}-gw_flow-rules

spring.cloud.sentinel.datasource.gw_flow.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.gw_flow.nacos.data-type=json

spring.cloud.sentinel.datasource.gw_flow.nacos.rule-type=gw_flow

spring.cloud.sentinel.datasource.degrade.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.degrade.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.degrade.nacos.data-id=${project.name}-degrade-rules

spring.cloud.sentinel.datasource.degrade.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.degrade.nacos.data-type=json

spring.cloud.sentinel.datasource.degrade.nacos.rule-type=degrade

spring.cloud.sentinel.datasource.system.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.system.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.system.nacos.data-id=${project.name}-system-rules

spring.cloud.sentinel.datasource.system.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.system.nacos.data-type=json

spring.cloud.sentinel.datasource.system.nacos.rule-type=system

spring.cloud.sentinel.datasource.authority.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.authority.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.authority.nacos.data-id=${project.name}-authority-rules

spring.cloud.sentinel.datasource.authority.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.authority.nacos.data-type=json

spring.cloud.sentinel.datasource.authority.nacos.rule-type=authority

spring.cloud.sentinel.datasource.param_flow.nacos.server-addr=${spring.cloud.nacos.config.server-addr}

spring.cloud.sentinel.datasource.param_flow.nacos.namespace=${spring.cloud.nacos.config.namespace}

spring.cloud.sentinel.datasource.param_flow.nacos.data-id=${project.name}-param_flow-rules

spring.cloud.sentinel.datasource.param_flow.nacos.group-id=${sentinel.nacos.default.namespace}

spring.cloud.sentinel.datasource.param_flow.nacos.data-type=json

spring.cloud.sentinel.datasource.param_flow.nacos.rule-type=param_flow

限流处理

请求击中限流规则后,我们要对限流异常进行处理。可以通过自定义BlockRequestHandler来定制处理逻辑,也可以使用sentinel spring gateway的默认处理器,支持需要在配置文件里加上一下信息:

# mode=response代表正常返回响应,mode=redirect代表重定向某个页面

spring.cloud.sentinel.scg.fallback.mode=response

spring.cloud.sentinel.scg.fallback.response-body={"success"false"message":"too many requests(flow limiting)""code"429}

spring.cloud.sentinel.scg.fallback.response-status=429

sentinel dashboard部署

sentinel dashboard是sentinel的管理后台代码,做了定制支持nacos,代码在仓库:GitHub - xsg22/Sentinel at sentinel-nacos-1.8

通过maven打出jar包后,支持传到服务器上进行部署。也可以使用已有的jar:https://download.csdn.net/download/xsgnzb/88522419

部署完整命令如下:

java -jar sentinel-dashboard.jar --auth.enabled=true --auth.username=admin --auth.password=123456 --server.port=9090 --spring.cloud.nacos.config.namespace=xxx --spring.cloud.nacos.config.server-addr=xxx

部署的时候要注意几个参数:

# 访问端口

server.port=9090

# 登录账号

auth.enabled=true

auth.username=admin

auth.password=123456

# nacos连接地址

spring.cloud.nacos.config.server-addr=xxx

spring.cloud.nacos.config.namespace=xxx

数据源

sentinel包含7种规则类型,这些规则数据存放在nacos里。配置格式是,dataId=${project.name}-${ruleType}-rules,group=SENTINEL_GROUP。例如,限流规则对应的dataId=spring-gateway-gw_flow-rules。

这是sentinel定义的RuleType:

public enum RuleType {

    /**

     * 限流规则,非网关模式

     */

    FLOW("flow", FlowRule.class),

    /**

     * 降级规则

     */

    DEGRADE("degrade", DegradeRule.class),

    /**

     * 根据请求参数进行限流的规则

     */

    PARAM_FLOW("param-flow", ParamFlowRule.class),

    /**

     * 系统规则,根据cpu使用率、load指标进行限流

     */

    SYSTEM("system", SystemRule.class),

    /**

     * 授权规则,app的白名单/黑名单

     */

    AUTHORITY("authority", AuthorityRule.class),

    /**

     * 限流规则,网关模式

     */

    GW_FLOW("gw-flow",

            "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"),

    /**

     * api定义信息

     */

    GW_API_GROUP("gw-api-group",

            "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition");

}

注意,使用网关模式对接时,限流规则不能放到flow类型下,要使用gw_flow类型。

相关文章:

Sentinel网关限流

背景 在微服务架构下&#xff0c;每个服务的性能都不同&#xff0c;为避免出现流量洪峰将服务冲垮&#xff0c;需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具&#xff0c;社区活跃&#xff0c;功能也很全面&#xff0c;包含实时监控、流控、熔断等功能。…...

solidworks对电脑要求高吗?2023solidworks配置要求

solidworks对电脑要求高吗&#xff1f;SolidWorks是一款功能强大的三维CAD软件&#xff0c;对电脑配置有一定的要求。一般来说&#xff0c;运行SolidWorks需要的电脑配置包括较高的处理器性能、足够的内存和存储空间&#xff0c;以及一块性能良好的显卡。此外&#xff0c;对于大…...

搭建神经网络(torch.nn的用法)

零零碎碎总结了一些torch框架里面nn模块的用法&#xff0c;尤其是关于搭建神经网络的 nn.ModuleList nn.Module nn.Sequential nn.Linear nn.Dropout nn.Embedding nn.DataParallel() 将模型封装起来&#xff0c;便于在多个gpu上并行计算&#xff0c;训练或者推理 nn.…...

卡码网语言基础课 | 11. 句子缩写

目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…...

Surface RT 安装 Linux

零&#xff1a;起因 在家无事找出来一台老旧设备 Surface RT 一代的&#xff0c;系统最新是 Windows 8.1 arm版&#xff0c;应用商店都已经打不开了 虽说有破解方法&#xff0c;能运行些软件&#xff0c;但怎么说也不是任意安装&#xff0c;所以局限性还是相当的大&#xff0…...

C++中的函数重载:多功能而强大的特性

引言 函数重载是C编程语言中的一项强大特性&#xff0c;它允许在同一个作用域内定义多个同名函数&#xff0c;但这些函数在参数类型、个数或顺序上有所不同。本文将深入探讨函数重载的用法&#xff0c;以及它的优势和应用场景。 正文 在C中&#xff0c;函数重载是一项非常有…...

数据分析实战 | K-means算法——蛋白质消费特征分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 ​编辑 八、模型评价 九、模型调参与预测 一、数据及分析对象 txt文件——“protein.txt”&#xff0c;主要记录了25个国家的9个属性&#xff0c;主…...

HTTP协议详解-下(Tomcat)

如何构造 HTTP 请求 对于 GET 请求 地址栏直接输入点击收藏夹html 里的 link script img a…form 标签 通过 form 标签构造GET请求 <body><!-- 表单标签, 允许用户和服务器之间交互数据 --><!-- 提交的数据报以键值对的结果来组织 --><form action&quo…...

acwing算法基础之搜索与图论--prim算法

目录 1 基础知识2 模板3 工程化 1 基础知识 朴素版prim算法的关键步骤&#xff1a; 初始化距离数组dist&#xff0c;将其内的所有元素都设为正无穷大。定义集合S&#xff0c;表示生成树。循环n次&#xff1a;找到不在集合S中且距离集合S最近的结点t&#xff0c;用它去更新剩余…...

Amazon EC2 Serial Console 现已在其他亚马逊云科技区域推出

即日起&#xff0c;交互式 EC2 Serial Console 现也在以下区域推出&#xff1a;中东&#xff08;巴林&#xff09;、亚太地区&#xff08;雅加达&#xff09;、非洲&#xff08;开普敦&#xff09;、中东&#xff08;阿联酋&#xff09;、亚太地区&#xff08;香港&#xff09;…...

hdlbits系列verilog解答(100输入逻辑门)-39

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 构建一个具有 100 个输入in[99:0]的组合电路。 有 3 个输出: out_and: output of a 100-input AND gate. out_or: output of a 100-input OR gate. out_xor: output of a 100-input XOR gate. 二、verilog源…...

Python 中 Selenium 的屏幕截图

文章目录 使用 save_screenshot() 函数在 Python 中使用 selenium 捕获屏幕截图使用 get_screenshot_as_file() 函数在 Python 中使用 selenium 捕获屏幕截图使用 Screenshot-Selenium 包在 Python 中使用 selenium 捕获屏幕截图总结我们可以使用 Selenium 在自动化 Web 浏览器…...

scrapy发json的post请求

一 、scrapy发json的post请求&#xff1a; def start_requests(self):self.headers {Content-Type: application/json}json_data {"productName": "", "currentPage": "1", "recordNumber": "10", "langua…...

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行结果&#xff1a; 4总结&#xff1a; 5介绍&#xff1a; 1解题思路&#xff1a; 利用循环&#xff08;穷举法&#xff09;来 对 所 需要的数 进行确定 2代码如下&#xff1a; #include <stdio.h>int main() …...

自主开发刷题应用网站H5源码(无需后端无需数据库)

该应用使用JSON作为题库的存储方式&#xff0c;层次清晰、结构简单易懂。 配套的word模板和模板到JSON转换工具可供使用&#xff0c;方便将题库从word格式转换为JSON格式。 四种刷题模式包括顺序刷题、乱序刷题、错题模式和背题模式&#xff0c;可以根据自己的需求选择适合的模…...

java 读取excel/word存入mysql

引入依赖 <!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artif…...

11.(vue3.x+vite)组件间通信方式之ref与$parent、$children

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 注: (1)ref 加在标签(div等)上,是拿到dom 对象 (2)ref加上组件上,拿到的是组件的引用 (3)让父组件获取子组件的数据或者方法需要通过defineExpose对外暴露,另外让父组件获取子组件的数据或者方法需要通过d…...

[工业自动化-12]:西门子S7-15xxx编程 - PLC从站 - ET200 SP系列详解

目录 一、概述 1.1 概述 二、系统组成 2.1 概述 2.2 与主站的通信接口模块 2.3 总线适配器 2.4 基座单元 2.5 电子模块 2.6 服务器模块 一、概述 1.1 概述 PLC ET200 SP 是西门子&#xff08;Siemens&#xff09;公司生产的一款模块化可编程逻辑控制器&#xff08;PL…...

消息队列简介

消息队列 在认识rabbitMQ之前&#xff0c;我们需要先认识下消息队列。 消息队列&#xff0c;一般简称为MQ&#xff08;Message Queue&#xff09;。先不管消息(Message)这个词&#xff0c;先看看队列(Queue)。 队列就是一种先进先出的数据结构。 所以消息队列可以简单理解为&a…...

SQL中实现汉字的拼音首字母查询

由于汉语拼音首字母也就23个&#xff0c;该方法利用汉字字符按拼音字母排序的特点来生成对应的拼单首字母&#xff0c;只需找到这23个汉语拼音首字母中分别排序在第一的汉字生成23条临时表数据用于参照&#xff0c;即可简单实现汉字匹配拼音首字母 CREATE FUNCTION f_GetPyAcr…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...