返回顶部
首页 > 资讯 > 后端开发 > GO >go实现限流功能示例
  • 910
分享到

go实现限流功能示例

2024-04-02 19:04:59 910人浏览 八月长安
摘要

目录引言需求背景WEB demo搭建限制访问次数编写功能测试总结引言 在我们日常维护中,经常有爬虫进行爬取网页,少则1秒钟请求数十次,多则达百次,严重消耗了服务器带宽,且影响正常使用

引言

在我们日常维护中,经常有爬虫进行爬取网页,少则1秒钟请求数十次,多则达百次,严重消耗了服务器带宽,且影响正常使用者,好在Nginx可以配合lua可以完成类似的需求,本次我们将使用Go来完成本需求。

需求背景

在我们日常维护中,可能需要这样一种工具,来对某些路由,对特定IP或者用户ID,在特定时间内,限制最大访问次数,这样有效的避免服务器带宽资源的浪费的同时也能接入更多用户请求,本次使用go来做一个类似的。

web demo搭建

我们先来使用SampleHttp编写一个最简单的web服务器,定义路由queryAll,收到后,假设将返回客户端1w字节的数据信息。

在启动web服务器后,我们使用curl进行测试

命令:

curl 127.0.0.1:8083/queryAll

限制访问次数编写

在上述整体需求的情况下,我们需要编写在规定时间限制访问次数的需求,这里我们为了方便,使用ip来作为限制条件,其核心功能分类大致分为:

  • 从未访问过web服务器
  • 访问过web服务器,在规定时间内没有超出限制
  • 访问过web服务器,在在规定时间内超出了限制
  • 访问过web服务器,时间间隔超过了规定时间

如上分类,除了第三种需要限流外,其他则视为正常访问即可。

核心存储,我们可以选择go map,其中keyipvalue为结构体,该结构体包含访问次数创建间戳。

其定义如下

我们来根据如上定义的核心功能来编写程序

从未访问过服务器

我们根据map中是否存在这个key来判断,如

_, ok := visitHashMap[ip]; if !ok {
    // 如果没有该ip的访问次数,则新增记录
}

访问过服务器,在规定时间超过了限制

if time.Now().Unix()-visit.createUnixTime >= interval*60 {
    // 在规定时间超过了限制,需要重新计算阈值
}

超过最大允许访问数

if visitHashMap[ip].number >= maxNum {
    // 超过允许最大访问次数
}

整理为其核心函数如下

功能测试

我们在定义路由地方,将来访者IP传入,就可以根据其返回的bool值来判断是否需要限制访问了。

main函数定义如下:

func main() {
	SampleHttp.Route("get","/queryAll", func(info *SampleHttp.HttpInfo) {
		ip := strings.Split(info.RemoteIP,":")[0]
		if ! limits(ip) {
			info.Write([]byte(fmt.Sprintf("%s 已经被限制访问,在%d分钟内,访问达到%d次",time.Now(),interval,visitHashMap[ip].number)))
			return
		}
		info.Write([]byte(fmt.Sprintf("%s 收到queryAll请求,开始查询,返回1W字节数据信息...,统计信息: 在%d分钟内,访问达到%d次",time.Now(),interval,visitHashMap[ip].number)))
	})
	visitHashMap = make(map[string]visitInfo,0)
	SampleHttp.StartServer("0.0.0.0:8083")
}

我们将开启服务器来测试一下

通过上述执行结果图,可以看到,当1分钟内访问次数超过10次后,就被限制访问了,而从第一次访问时间到目前访问时间间隔达到1分钟以上后,限制就被解除了,可见功能已经完成了。

总结

如上只是实现了这种方法而已,在实际项目中,还需要详细的打磨才行,不然执行效率肯定堪忧,怎么样,限制这个看着好玩吧,快来试试吧,相关代码已经放置到了gitee上。

以上就是go实现限流功能示例的详细内容,更多关于go限流功能的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: go实现限流功能示例

本文链接: https://lsjlt.com/news/121028.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go实现限流功能示例
    目录引言需求背景web demo搭建限制访问次数编写功能测试总结引言 在我们日常维护中,经常有爬虫进行爬取网页,少则1秒钟请求数十次,多则达百次,严重消耗了服务器带宽,且影响正常使用...
    99+
    2024-04-02
  • Java限流功能怎么实现?
     在Java中,限流是一种常见的技术手段,用于控制系统的访问速率,以保护系统免受过载和滥用。以下是一些常见的Java限流实现方法:   1.计数器限流   这是一种简单而常见的限流方法。在该方法中,我们可以使用计数器来记录每个时间窗口内的请...
    99+
    2023-09-24
    算法
  • .Net Core限流的实现示例
    目录一、环境二、基础使用1.设置2.规则设置3.特殊规则的启用 三、请求返回头四、使用Redis存储1、访问计数 2、ip特殊规则3、客户端特殊规则 五...
    99+
    2024-04-02
  • Gin框架限流实现示例
    目录什么是限流为什么要进行限流Gin框架的限流实现测试总结完整代码什么是限流 限流是指通过一定的算法,对接口的请求进行限制,防止并发量过大,导致系统瘫痪或响应变慢的情况出现。 为什么...
    99+
    2023-03-19
    Gin框架限流
  • Go+Redis实现常见限流算法的示例代码
    目录固定窗口滑动窗口hash实现list实现漏桶算法令牌桶滑动日志总结限流是项目中经常需要使用到的一种工具,一般用于限制用户的请求的频率,也可以避免瞬间流量过大导致系统崩溃,或者稳定消息处理速率。并且有时候我们还需要使用...
    99+
    2023-04-02
    Go Redis实现限流算法 Go Redis限流算法 Go 限流算法
  • C++实现Go的defer功能(示例代码)
    在Go语言中有一个关键字:defer,它的作用就是延迟执行后面的函数,在资源释放方面特别有用,比如下面一段C/C++的示例代码: void test() { FILE* fp ...
    99+
    2024-04-02
  • Spring AOP实现功能权限校验功能的示例代码
    实现功能权限校验的功能有多种方法,其一使用拦截器拦截请求,其二是使用AOP抛异常。 首先用拦截器实现未登录时跳转到登录界面的功能。注意这里没有使用AOP切入,而是用拦截器拦截,因为AOP一般切入的是service层方法,而拦截器是拦截控制器...
    99+
    2023-05-30
    spring aop 权限
  • Golang官方限流器库实现限流示例详解
    目录前言例子实现小结前言 在翻Golang官方库的过程中,发现一个有趣的库golang.org/x/time ,里面只有一个类rate,研究了一下发现它是一个限流器,实现了很多的功能...
    99+
    2024-04-02
  • redis lua限流算法实现示例
    目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指在一定的时间窗口内允许的固定数量的请求...
    99+
    2022-07-15
    redis lua限流算法 redis lua算法
  • redis lua限流算法实现示例
    目录限流算法计数器算法场景分析算法实现漏铜算法令牌桶算法:算法实现限流算法 常见的限流算法 计数器算法漏桶算法令牌桶算法 计数器算法   顾名思义,计数器算法是指...
    99+
    2024-04-02
  • Redis Lua脚本实现ip限流示例
    目录引言相比Redis事务来说,Lua脚本有以下优点Lua脚本Java代码IP限流Lua脚本引言 分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或者nginx+lua技术进行实现,通过...
    99+
    2022-07-15
    Redis Lua ip限流 Redis Lua
  • spring 项目实现限流方法示例
    目录01、为什么AUSTIN项目需要限流02、如何实现限流?03、代码设计04、总结01、为什么AUSTIN项目需要限流 众所周知,服务器能处理的请求数是有限的,如果请求量特别大,我...
    99+
    2022-11-13
    spring 项目限流 项目限流
  • Redis Lua脚本实现ip限流示例
    目录引言相比Redis事务来说,Lua脚本有以下优点Lua脚本java代码IP限流Lua脚本引言 分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或...
    99+
    2024-04-02
  • C++实现Go的defer功能(示例代码)
    在Go语言中有一个关键字:defer,它的作用就是延迟执行后面的函数,在资源释放方面特别有用,比如下面一段C/C++的示例代码: void test() { FILE* fp...
    99+
    2022-06-07
    c+ GO defer 示例 C++
  • php实现站群软件权限管理功能示例
    1.管理员页面RBAC.php           权限管理                   用户与角色管理           请选择用户:           ...
    99+
    2023-08-31
    php okhttp android
  • Spring Cloud Alibaba之Sentinel实现熔断限流功能
    微服务中为了防止某个服务出现问题,导致影响整个服务集群无法提供服务的情况,我们在系统访问量和业务量高起来了后非常有必要对服务进行熔断限流处理。 其中熔断即服务发生异常时能够更好的处理...
    99+
    2024-04-02
  • 如何使用Redis实现分布式限流功能
    如何使用Redis实现分布式限流功能引言:随着互联网的快速发展,业务系统的访问量也日益增加。当流量集中到某一业务系统时,会给系统的稳定性和性能带来一定的威胁。为了保护业务系统,限流成为一种必不可少的手段。在分布式系统中,使用Redis可以方...
    99+
    2023-11-07
    分布式 redis 限流
  • Android实现登录功能demo示例
    本文实例讲述了Android实现登录功能的方法。分享给大家供大家参考,具体如下: 安卓,在小编实习之前的那段岁月里面,小编都没有玩儿过,如果说玩儿过,那就是安卓手机了,咳咳,敲...
    99+
    2022-06-06
    demo Android
  • Unity计时器功能实现示例
    目录Demo展示介绍计时器功能Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法; 一般实现有一下几种方式: 1.手动计时 ...
    99+
    2024-04-02
  • 基于Redis的限流器的实现(示例讲解)
    1 概述 系统中的接口通常都有限流,比如 70次/秒 ,如何保证我们的接口的调用次数在超过第三方接口限流的时候快速失败呢?这时候就需要限流器了。下面是笔者用redis实现限流器的流程图。 2 代码 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作