我是靠谱客的博主 耍酷蜻蜓,最近开发中收集的这篇文章主要介绍APISIX源码解析-插件-漏桶算法限速【limit-req】limit-req 漏桶算法限速插件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

limit-req 漏桶算法限速插件

关键属性

在这里插入图片描述

源码实现

local function create_limit_obj(conf)
    core.log.info("create new limit-req plugin instance")
    return limit_req_new("plugin-limit-req", conf.rate, conf.burst)
end


function _M.access(conf, ctx)
    local lim, err = core.lrucache.plugin_ctx(lrucache, ctx, nil,
                                              create_limit_obj, conf)
    if not lim then
        core.log.error("failed to instantiate a resty.limit.req object: ", err)
        if conf.allow_degradation then
            return
        end
        return 500
    end

    local key
    if conf.key == "consumer_name" then
        if not ctx.consumer_name then
            core.log.error("consumer not found.")
            return 500, { message = "Consumer not found."}
        end
        key = ctx.consumer_name .. ctx.conf_type .. ctx.conf_version

    else
        key = (ctx.var[conf.key] or "") .. ctx.conf_type .. ctx.conf_version
    end
    core.log.info("limit key: ", key)

    local delay, err = lim:incoming(key, true)
    if not delay then
        if err == "rejected" then
            if conf.rejected_msg then
                return conf.rejected_code, { error_msg = conf.rejected_msg }
            end
            return conf.rejected_code
        end

        core.log.error("failed to limit req: ", err)
        if conf.allow_degradation then
            return
        end
        return 500
    end

    if delay >= 0.001 and not conf.nodelay then
        sleep(delay)
    end
end

使用Openresty中的resty.limit.req模块

静态拦截就是限流某一个接口在一定时间单位的请求数。一般就是单位1s内的客户端的请求数。

平滑限制请求数

limit_req_new("plugin-limit-req", 10, 0)

– 这里设置rate=10/s,漏桶桶容量设置为0,(也就是来多少水就留多少水)
– 因为resty.limit.req代码中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理

漏桶算法限流

limit_req_new("plugin-limit-req", 10, 10)
...
-- 超过20的部分直接拒接
-- 超过10,低于20的部分,放入桶中进行延时处理,让其排队等待,就是应用了漏桶算法
    if delay >= 0.001 and not conf.nodelay then
        sleep(delay)
    end

令牌桶算法限流

limit_req_new("plugin-limit-req", 10, 10)
...
-- 如果 nodelay 为 true, 请求速率超过 rate 但没有超过 
--(rate + burst)的请求不会加上延迟, 如果是 false,则
-- 会加上延迟。
    if delay >= 0.001 and not conf.nodelay then
        -- 若忽略,桶中剩余请求所需要的延时处理,让其直接发送到后端服务器,
        -- 其实这就是允许桶中请求作为突发流量直接到后端,这也就是令牌桶的原理所在
        sleep(delay)
    end

最后

以上就是耍酷蜻蜓为你收集整理的APISIX源码解析-插件-漏桶算法限速【limit-req】limit-req 漏桶算法限速插件的全部内容,希望文章能够帮你解决APISIX源码解析-插件-漏桶算法限速【limit-req】limit-req 漏桶算法限速插件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部