IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Nginx&SpringCloudGateway进行请求限流 -> 正文阅读

[系统运维]Nginx&SpringCloudGateway进行请求限流


一、Nginx限流

1、请求数进行限流

http {
    limit_req_zone $server_name zone=mylimit:10m rate=1000r/s;
    server {
        listen       8881;
        server_name  localhost;
        limit_req zone=mylimit burst=500 nodelay; 
        location /mytest/ {
            proxy_pass http://localhost:8080/mytest/;
            proxy_connect_timeout 30;
            proxy_http_version 1.1;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
            proxy_set_header 		Host $host:$server_port;
            proxy_redirect      off;
            proxy_set_header    X-Real-IP        $remote_addr;
            proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

说明

####limit_req_zone $server_name zone=mylimit:10m rate=1000r/s; 
zone=mylimit: zone的名称,随便流,后面的引用会用到。
$server_name:服务器级别的限流,可替换成IP级别的限流
$binary_remote_addr zone: ip级别的限流
rate=1000r/s:  1秒1000次


####limit_req zone=mylimit burst=2 nodelay; 
zone后面的mylimit引用前面的配置的名称
burst: 突发的大量请求到来时的缓存处理大小,比如500
nodelay: 缓存的请求是否直接能处理,还是等下一轮,比如1r/m,一分钟执行一次,设置了burst=2,那burst中的记录,如果没有设置nodelay,则会在一分钟后才会进行处理。

##配置可以放在http, server,也可以放location部分

2、连接数进行限流

http {
    limit_conn_zone $binary_remote_addr zone=myip:10m;
    limit_conn_zone $server_name zone=myserver:10m;
    server {
        listen       8881;
        server_name  localhost;
        limit_conn myserver 100;
        limit_conn myip 1;
        location /mytest/ {
            proxy_pass http://localhost:8080/mytest/;
            proxy_connect_timeout 30;
            proxy_http_version 1.1;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
            proxy_set_header 		Host $host:$server_port;
            proxy_redirect      off;
            proxy_set_header    X-Real-IP        $remote_addr;
            proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

说明

limit_conn myserver 100; 每个服务器最多保持100个连接
limit_conn perip 1; ##每个Ip至多保持1个连接

##配置可以放http, server,也可以放location

二、Spring cloud Gateway限流

1.redis引入

redis引入,spring-boot-starter-data-redis或spring-boot-starter-data-redis-reactive,我用的是spring-boot-starter-data-redis,网上大部分资料是另一个,这个无关紧要

		<!-- redis start-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!-- redis依赖commons-pool 这个依赖一定要添加 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
		<!-- redis end-->

2. 网关加上配置

全局配置的话直接default-filters中配置

spring:
  cloud:
    gateway:
      default-filters: 
        - name: RequestRateLimiter
          args: 
            key-resolver: "#{@myResolver}"
            redis-rate-limiter:
              replenishRate: 1
              burstCapacity: 1
              requestedTokens: 1

也可针对对应的router进行配置

spring:
  cloud:
    gateway:
      routes:
        - id: mytest
          uri: "http://localhost:8080"
          predicates: 
            - Path=${server.context-path}/**
          filters: 
          - name: RequestRateLimiter
            args: 
              key-resolver: "#{@myResolver}"
              redis-rate-limiter:
                replenishRate: 1
                burstCapacity: 1
                requestedTokens: 1
name:  必须是RequestRateLimiter。
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求。
redis-rate-limiter.burstCapacity:令牌桶的容量,replenishRate使用完后的缓冲量请求数。
key-resolver:SpEL引用 bean的名称。
requestedTokens: 每个请求需要多少个令牌

3.Bean的配置

	@Bean
	KeyResolver myResolver() {
		return exchange -> Mono.just(exchange.getRequest().getPath().value());//URL接口限流
		//return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));//用户限流
		//return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());//IP限流
	}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:31:28  更:2022-04-29 12:32:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:03:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码