1#ifndef NEFORCE_NETWORK_HTTP_RATE_LIMITER_HPP__
2#define NEFORCE_NETWORK_HTTP_RATE_LIMITER_HPP__
18NEFORCE_BEGIN_NAMESPACE__
32struct NEFORCE_API token_bucket {
39 token_bucket() =
default;
40 ~token_bucket() =
default;
42 token_bucket(
double rate,
double burst) :
50 last_refill_ms(other.last_refill_ms),
51 refill_rate(other.refill_rate),
52 capacity(other.capacity) {}
54 token_bucket& operator=(
const token_bucket& other) {
56 tokens = other.tokens;
57 last_refill_ms = other.last_refill_ms;
58 refill_rate = other.refill_rate;
59 capacity = other.capacity;
86class NEFORCE_API token_bucket_limiter {
93 double default_rate_{10.0};
94 double default_burst_{20.0};
99 static constexpr size_t MAX_BUCKETS_COUNT{10000};
102 token_bucket_limiter() =
default;
111 bool allow(
const string& key,
double rate = 0.0,
double burst = 0.0);
118 NEFORCE_NODISCARD
size_t size()
const;
149 default_burst(burst) {}
156 NEFORCE_NODISCARD
string name()
const override {
return "token_bucket_filter"; }
166NEFORCE_END_NAMESPACE__
string name() const override
获取过滤器名称
double default_rate
默认每秒请求数(每IP)
double default_burst
默认突发容量(每IP)
bool per_route
是否对每个路由单独限流
bool pre_filter(http_request &request, http_response &response) override
预处理方法
void do_filter(http_request &request, http_response &response) override
核心过滤方法
void set_default_rate(double rate)
设置默认的令牌补充速率
bool allow(const string &key, double rate=0.0, double burst=0.0)
检查并消耗令牌
void set_default_burst(double burst)
设置默认的桶容量
void cleanup_expired(seconds max_age=seconds{300})
清理过期的桶
unsigned long uint64_t
64位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
duration< int64_t > seconds
秒持续时间
http_server_response http_response
HTTP响应类型别名
http_server_request http_request
HTTP请求类型别名
void refill(uint64_t now_ms)
补充令牌(基于时间差)
bool try_consume(uint64_t now_ms)
尝试消耗一个令牌
double refill_rate
每秒补充令牌数
uint64_t last_refill_ms
上次补充时间(毫秒时间戳)