package com.iailab.framework.ratelimiter.core.annotation; import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; import com.iailab.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; import com.iailab.framework.ratelimiter.core.keyresolver.RateLimiterKeyResolver; import com.iailab.framework.ratelimiter.core.keyresolver.impl.ClientIpRateLimiterKeyResolver; import com.iailab.framework.ratelimiter.core.keyresolver.impl.DefaultRateLimiterKeyResolver; import com.iailab.framework.ratelimiter.core.keyresolver.impl.ServerNodeRateLimiterKeyResolver; import com.iailab.framework.ratelimiter.core.keyresolver.impl.UserRateLimiterKeyResolver; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; /** * é™æµæ³¨è§£ * * @author iailab */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RateLimiter { /** * é™æµçš„时间,默认为 1 秒 */ int time() default 1; /** * 时间å•ä½ï¼Œé»˜è®¤ä¸º SECONDS 秒 */ TimeUnit timeUnit() default TimeUnit.SECONDS; /** * é™æµæ¬¡æ•° */ int count() default 100; /** * æ示信æ¯ï¼Œè¯·æ±‚过快的æ示 * * @see GlobalErrorCodeConstants#TOO_MANY_REQUESTS */ String message() default ""; // 为空时,使用 TOO_MANY_REQUESTS 错误æ示 /** * 使用的 Key 解æžå™¨ * * @see DefaultRateLimiterKeyResolver 全局级别 * @see UserRateLimiterKeyResolver 用户 ID 级别 * @see ClientIpRateLimiterKeyResolver 用户 IP 级别 * @see ServerNodeRateLimiterKeyResolver æœåŠ¡å™¨ Node 级别 * @see ExpressionIdempotentKeyResolver 自定义表达å¼ï¼Œé€šè¿‡ {@link #keyArg()} 计算 */ Class<? extends RateLimiterKeyResolver> keyResolver() default DefaultRateLimiterKeyResolver.class; /** * 使用的 Key å‚æ•° */ String keyArg() default ""; }