【微服务笔记18】微服务组件之Gateway实现服务限流(计数器算法、漏桶算法、令牌桶算法)

news2024/9/25 19:19:57

这篇文章,主要介绍微服务组件之Gateway实现服务限流(计数器算法、漏桶算法、令牌桶算法)。

目录

一、服务限流

1.1、几种限流算法

(1)计数器算法

(2)漏桶算法

(3)令牌桶算法

1.2、Gateway实现服务限流

(1)引入依赖

(2)添加配置信息

(3)指定令牌生成方式

(4)运行测试


一、服务限流

1.1、几种限流算法

限流就是指:限制服务的请求量,客户端每秒钟发起的HTTP请求数量(QPS,Queries Per Second),表示每秒钟的查询数量。为了能避免大量请求堆积,从而导致服务器宕机,所以就需要对请求进行限流操作。常见的限流算法有下面这些:

  • 计数器算法(Counter)。
  • 漏桶算法(Leaky Bucket)。
  • 令牌桶算法(Token Bucket)。

(1)计数器算法

计数器算法是指:设置一个计数器,当在指定的时间范围里面,某个接口有访问则将计数器加1,当计数器达到最大值,并且此时是在这个时间范围里面,那么此时就对这个接口进行限流操作。

这种算法虽然实现简单,但是存在一个问题,那就是如果在结束时间和下一次开始时间之间,刚好来了大量请求,那么此时就是1秒出现大量请求,有可能导致服务崩溃。

(2)漏桶算法

漏桶算法,是指:大量请求可以到达,但是这些请求会首先进入一个地方,我们这个地方叫做:桶,请求来了就放入桶里面,然后每次这个桶就分发一个请求给对应的微服务,从而实现限流操作。

这种算法虽然能够控制请求量,但是也有问题,那就是如果大量请求同时达到Gateway,那么Gateway可能会出现宕机情况,此外由于每次都是从桶中分发一个请求到下游系统,如果下游系统每次能够处于200个请求,显示浪费了下游系统的资源。

(3)令牌桶算法

令牌桶算法,是对漏桶算法的一个改进,它的思想是:对每次请求都需要获取一个令牌,只要拿到令牌的请求才能够继续执行,没有拿到令牌的请求,要么被阻塞,要么快速失败,令牌桶算法会有一个桶专门用于保存令牌,这个令牌会按照规则自动生成并放入令牌桶里面。

令牌桶算法是最优的一种限流算法,Gateway中的限流算法就是采用了令牌桶算法,支持三种令牌桶算法:基于URI限流、基于请求参数限流、基于IP限流。

1.2、Gateway实现服务限流

Gateway中提供的限流是采用的令牌桶算法,并且基于Redis + LUA脚本实现的限流,所以这里需要引入redis的依赖。

(1)引入依赖

  • 在gateway工程中,引入redis依赖、gateway依赖。
<!-- 引入 Gateway 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 引入 redis 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- 引入 commons-pool 连接池依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

(2)添加配置信息

在application.yml配置文件中,添加如下内容:

server:
  port: 8888
spring:
  application:
    name: gateway-limiting
  # 配置 gateway 路由信息
  cloud:
    gateway:
      # 指定路由信息
      routes:
        - id: consumer-client # 路由唯一标识,一般和微服务应用名称相同即可
          # 目标路由的服务地址,这里采用的是静态路由(将微服务的地址写死在配置文件里面)
          uri: http://localhost:8081/
          # 配置断言,也就是请求的URI满足哪些规则,才可以匹配当前这个routes路由信息
          predicates:
            # 这里使用路由断言
            - Path=/**
          filters:
            # 指定限流过滤器
            - name: RequestRateLimiter
              args:
                # 基于令牌桶算法,生成令牌的速率
                redis-rate-limiter.replenishRate: 1
                # 令牌桶的最大容量
                redis-rate-limiter.burstCapacity: 2
                # 指定生成令牌的算法解析策略,这里是使用了SpEL表达式,获取寻找名字是 keyResolver 的bean对象
                key-resolver: "#{@keyResolver}"
  # redis 配置
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    lettuce:
      pool:
        max-active: 1024
        max-wait: 10000
        max-idle: 200
        min-idle: 5

(3)指定令牌生成方式

Gateway中可以有多种限流策略,例如:通过URI进行限流、通过请求参数限流、通过IP地址限流。要是有哪一种限流策略,只需要修改对应的KeyResolver即可。

package com.gitee.demo.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @version 1.0.0
 * @Date: 2023/4/20 14:16
 * @Copyright (C) ZhuYouBin
 * @Description: 令牌桶算法中,令牌的生成算法
 */
@Configuration
public class KeyResolverConfiguration {

    @Bean
    public KeyResolver keyResolver() {
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                // 这里根据请求【URI】进行限流
                return Mono.just(exchange.getRequest().getPath().toString());
            }
        };
    }

//    @Bean
//    public KeyResolver keyResolver() {
//        return new KeyResolver() {
//            @Override
//            public Mono<String> resolve(ServerWebExchange exchange) {
//                // 这里根据请求【请求参数username】进行限流
//                return Mono.just(exchange.getRequest().getQueryParams().getFirst("username"));
//            }
//        };
//    }
//
//    @Bean
//    public KeyResolver keyResolver() {
//        return new KeyResolver() {
//            @Override
//            public Mono<String> resolve(ServerWebExchange exchange) {
//                // 这里根据请求【IP地址】进行限流
//                return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
//            }
//        };
//    }

}
  • 注意:KeyResolver只能够存在一个Bean对象。

(4)运行测试

启动redis服务、启动网关工程、启动消费者工程,浏览器访问某个接口,测试是否限流成功。假设现在是采用URI限流模式,并且配置文件中设置的是最大允许2个请求同时访问,超过2个请求,就会报错,客户端就会接收到【HTTP ERROR 429】的响应结果,这表示被限流了。

到此,Gateway服务限流就介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件之Gateway实现服务限流(计数器算法、漏桶算法、令牌桶算法)。

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

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

相关文章

叮咚,你的耳鼻喉专科医院营销策略快来查收

进入后疫情时代以来&#xff0c;人们对健康意识的不断提高&#xff0c;医疗行业也开始卷起来了&#xff0c;通过各种渠道来宣传和推广医院&#xff0c;吸引更多的患者。那么今天就以耳鼻喉专科医院为主&#xff0c;聊聊这类医院该怎么在Z时代做好营销。 医院营销可以分为线上和…

【行为型模式】观察者模式

文章目录 1、概述2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现 4、观察者模式优缺点5、应用场景 1、概述 观察者模式(Observer)是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;其他所有依…

【C++】二叉搜索树的应用

前言 二叉搜索树本质也是二叉树&#xff0c;但因为其数据存储的特殊 — 左子树的值都更小&#xff0c;右子树的值都更大&#xff0c;所以在大部分情况下&#xff0c;查找更为高效。本篇博客将讲述二叉搜索树两个应用搜索的场景 那么话不多说&#xff0c;马上开始今天的学习。 文…

linux运维必了解的日志文件系统

目录 一、inode与block1.1inode和block概述1.1.1inode和block的关系 1.2inode的内容1.2.1inode包含文件的元信息1.2.2linux文件系统的三个时间戳1.2.3目录文件结构 1.3inode的号码1.3.1 硬盘分区后的结构 1.4inode的大小1.5恢复误删除的xfs文件1.6EXT类型文件恢复误删除 二、分…

亿发软件:玩具批发行业需要怎样的进销存开单软件

中国玩具市场的发展潜力十分巨大&#xff0c;近五年来中国玩具行业的批发零售企业都保持着良好的发展态势。近年来&#xff0c;在数字化转型的时代浪潮下&#xff0c;玩具批发零售市场想实现进一步的高质量发展&#xff0c;充分满足客户多元化的供货需求&#xff0c;需要向数据…

Qt5 和 OpenCV4 计算机视觉项目:6~9

原文&#xff1a;Qt 5 and OpenCV 4 Computer Vision Projects 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#x…

OpenCV 图像处理学习手册:6~7

原文&#xff1a;Learning Image Processing with OpenCV 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;…

javascript之数组

创建 有以下几种方式 1.构造函数 在使用构造函数时&#xff0c;可以不带new 创建空数组 let color new Array() 或者let color Array() 创建指定个数元素的数组 let color new Array(2) 或者let color Array(2) 创建指定元素的数组 let color new Array("bl…

atio函数和宏offset的介绍

目录 前言atoi函数宏offsetof总结 前言 本章带大家一起认识一些在我们C语言标准库中的函数 atoi函数 int atio(const char* str);头文件&#xff1a; #include<stdlib.h>参数&#xff1a; str指向常量字符串起始位置的指针 函数介绍&#xff1a; ①解析C语言字符串str,…

2023软件测试工程师必备技能?要卷,谁还不会了......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试岗位是怎…

FPGA基于Tri Mode Ethernet MAC实现UDP通信 提供3套工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、米联客UDP协议栈4、详细设计方案5、Tri Mode Ethernet MAC的使用6、vivado工程1详解7、vivado工程2详解8、vivado工程3详解9、上板调试验证并演示10、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下&#x…

Spring Security实战(五)—— 密码加密

一、密码加密的演进 MD5 (Message-Digest Algorithm 5) 和 SHA (Secure Hash Algorithm) 是两种常见的消息摘要算法&#xff0c;它们都被用于加密和数据完整性验证等领域。 MD5 是一种 128 位的哈希函数&#xff0c;常用于数据完整性校验和数字签名等方面。它将任意长度的信息…

WebServer项目(四)->(基于Proactor的c++)Web服务器简介及简单实现

基于Proactor的cWeb服务器项目 WebServer项目(四)-&#xff1e;(基于Proactor的c)Web服务器简介及简单实现1.Web Server&#xff08;网页服务器&#xff09;2.HTTP协议(应用层的协议)3.HTTP 请求报文格式4.HTTP响应报文格式5.HTTP请求方法6.HTTP状态码7.服务器编程基本框架8.两…

分布式搜索技术elasticsearch概念篇

文章目录 一、分布式搜索技术二、elasticsearch2.1 初识elasticsearch2.2 正向索引和倒排索引2.2.1 介绍2.2.2 优缺点 2.3 elasticsearch和mysql的对比 一、分布式搜索技术 分布式搜索技术是一种基于分布式计算的搜索引擎技术&#xff0c;它使用多台计算机协同工作来处理大规模…

ElementUI登陆表单中常用的标签属性

ElementUI官网 为登陆框添加一个边角弧度 <style> .className{/*设置div边边框角的弧度*/border-radius: 10px; } </style><el–input>标签常用属性 <!--使用prefix属性添加一个前缀图标--> <el-input prefix-icon"el-icon-user-solid"&g…

深度学习第J6周:ResNeXt-50实战解析

目录 一、模型结构介绍 二、前期准备 三、模型 三、训练运行 3.1训练 3.2指定图片进行预测 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] &#x1f4cc; …

大数据技术之集群数据迁移

在大数据集群数据迁移的项目中涉及到很多技术细节&#xff0c;本博客记录了迁移的大致的操作步骤。 迁移借用Hadoop自带的插件&#xff1a;distcp。 一、Hadoop集群数据迁移 **DistCp&#xff08;分布式拷贝&#xff09;**是用于大规模集群内部和集群之间拷贝的工具。它使用M…

Meson构建系统的使用

一、前言 Meson 是用于自动化构建的自由软件&#xff0c;使用Python语言编写&#xff0c;在 Apache 许可证 2.0版本下发布&#xff0c;主要目标是为了让开发者节约用于配置构建系统的时间。 特点如下&#xff1a; 多平台支持&#xff0c;包括 GNU/Linux、Windows、MacOS、GCC、…

A_A01_008 STM32F103系列标准库移植经验分享

A_A01_008 STM32F103系列标准库移植经验分享 一、所需材料二、移植步骤三、注意事项四、参考资料与友情链接 一、所需材料 1.MDK开发环境 此处版本V5.15 2.相关启动文件 此处用野火点灯例程 因为启动文件完整 方便更换 其它工程没有的可以直接复制这些启动文件过去 3.相关开…

Java版工程管理系统源代码-软件自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…