用nginx实现分布式限流

1.前言

通常对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就须要限流 . linux

本文主要阐述如何用nginx 来实现限流. 据说 Hystrix 也能够, 各位有兴趣能够去研究哈 .nginx

2.首先部署一个对外暴露接口的程序

我这里部署的是一个spring boot 项目 里面暴露了以下接口, 很简单spring

clipboard.png

暴露了一个 get 请求返回 hello world 的restful 接口.docker

将此程序部署到 linux 服务器上. 部署步奏再也不赘述, 自行百度 spring boot 部署 便可. 性能优化

在此我向你们推荐一个架构学习交流群。交流学习群号:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多服务器

clipboard.png

3.建立一个名称为 nginx.conf 的 nginx 配置文件

建立一个 名叫 nginx.conf 的配置文件, 完整内容以下restful

clipboard.png

配置文件中限流部分解释:

如上, nginx 的限流配置 , 只有两行代码.架构

第一行: 并发

clipboard.png

limit_req_zone : 是限流声明.负载均衡

$binary_remote_addr: 表示根据客户端 ip 来 限流, 好比 上面的限流配置 限制每一个客户端ip的请求频率为一秒一次, 你若是耍流氓一秒两次, 就会被限流 会返回一个http 503 错误给你.

zone=perip: 表示 用 perip 这个 名称 来标识 这行限流配置, 待会 会经过 perip 这个名称来引用这行限流配置(也就是说限流配置是能够定义为多个的)

10m: 表示存储客户端ip的空间为10MB, 1MB 大概存储1万多ip , 10 MB 大概 10多万Ip , 参考解释: http://www.ttlsa.com/nginx/ng... 在这篇文章中搜索 binary_remote_addr 便可定位相关解释.

rate=1r/s: 表示频率是 一秒一个请求.

第二行:

clipboard.png

表示在 myserver 这个集群上, 使用 名称为 perip 的限流配置

4.用docker 部署 nginx

将上一步建立的 nginx.conf 配置文件, 拷贝到linux 目录 , /root/nginx/ 下 (目录能够任意), 而后 一个docker 命令部署好 nginx 环境

clipboard.png

这里暴露的是 8080 端口, 经过 8080 端口能够访问到 nginx 配置中的负载均衡节点, 即 192.168.10.253:8090 ip端口, 这个 ip端口对应的就是 , 第一步建立部署的 hello world 程序.

  1. 用代码访问 第一步定义的 helloworld 接口

clipboard.png

我这里是 一秒 执行 10次 get 请求, 已经大于了 nginx中配置的 rate=1r/s 一秒一次的请求, 因此会看到 503 报错, 以下.

clipboard.png

若是改哈代码, 改成一秒执行一次get 请求, 就不会报错, 各位能够去试一下

至此 nginx 的限流 已实现.

相关文章
相关标签/搜索