This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 829448f [type:refactor] rateLimiterAlgorithm use lua script not
thredsafe when init the script (#2440)
829448f is described below
commit 829448f50b97b77d98d87edcadb4276acd83e3d5
Author: SaberSola <[email protected]>
AuthorDate: Wed Nov 24 10:48:54 2021 +0800
[type:refactor] rateLimiterAlgorithm use lua script not thredsafe when init
the script (#2440)
* fix ShenyuClientRegisterService buildHandle method
* fix init ratelimiter redis script thread safe
Co-authored-by: zhanglei06469 <[email protected]>
---
.../apache/shenyu/common/constant/Constants.java | 5 +++
.../algorithm/AbstractRateLimiterAlgorithm.java | 44 +++++++++++-----------
.../algorithm/ConcurrentRateLimiterAlgorithm.java | 5 +--
.../algorithm/LeakyBucketRateLimiterAlgorithm.java | 5 +--
.../algorithm/RateLimiterAlgorithm.java | 17 ++++++---
.../SlidingWindowRateLimiterAlgorithm.java | 5 +--
.../algorithm/TokenBucketRateLimiterAlgorithm.java | 7 ++--
.../AbstractRateLimiterAlgorithmTest.java | 9 +----
8 files changed, 49 insertions(+), 48 deletions(-)
diff --git
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
index 8e58e9b..d9299f4 100644
---
a/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
+++
b/shenyu-common/src/main/java/org/apache/shenyu/common/constant/Constants.java
@@ -459,6 +459,11 @@ public interface Constants {
String GROUP = "group";
/**
+ * redis script path.
+ */
+ String SCRIPT_PATH = "/META-INF/scripts/";
+
+ /**
* cache max count.
*/
int CACHE_MAX_COUNT = 1000;
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithm.java
index 22cb97f..2ecf3c3 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithm.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.ratelimiter.algorithm;
+import org.apache.shenyu.common.constant.Constants;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
@@ -24,46 +25,43 @@ import
org.springframework.scripting.support.ResourceScriptSource;
import java.util.Arrays;
import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
/**
* The type Abstract rate limiter algorithm.
*/
public abstract class AbstractRateLimiterAlgorithm implements
RateLimiterAlgorithm<List<Long>> {
-
- private final AtomicBoolean initialized = new AtomicBoolean(false);
-
+
+ private String scriptName;
+
private RedisScript<List<Long>> script;
-
- /**
- * Gets script name.
- *
- * @return the script name
- */
- protected abstract String getScriptName();
-
+
+ public AbstractRateLimiterAlgorithm(final String scriptName) {
+ DefaultRedisScript redisScript = new DefaultRedisScript<>();
+ String scriptPath = Constants.SCRIPT_PATH + scriptName;
+ redisScript.setScriptSource(new ResourceScriptSource(new
ClassPathResource(scriptPath)));
+ redisScript.setResultType(List.class);
+ this.script = redisScript;
+ this.scriptName = scriptName;
+ }
+
+ @Override
+ public String getScriptName() {
+ return scriptName;
+ }
+
/**
* Gets key name.
*
* @return the key name
*/
protected abstract String getKeyName();
-
+
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public RedisScript<List<Long>> getScript() {
- if (!this.initialized.get()) {
- DefaultRedisScript redisScript = new DefaultRedisScript<>();
- String scriptPath = "/META-INF/scripts/" + getScriptName();
- redisScript.setScriptSource(new ResourceScriptSource(new
ClassPathResource(scriptPath)));
- redisScript.setResultType(List.class);
- this.script = redisScript;
- initialized.compareAndSet(false, true);
- return redisScript;
- }
return script;
}
-
+
@Override
public List<String> getKeys(final String id) {
String prefix = getKeyName() + ".{" + id;
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/ConcurrentRateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/ConcurrentRateLimiterAlgorithm.java
index 7393dec..71e2031 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/ConcurrentRateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/ConcurrentRateLimiterAlgorithm.java
@@ -36,9 +36,8 @@ import java.util.List;
@Join
public class ConcurrentRateLimiterAlgorithm extends
AbstractRateLimiterAlgorithm {
- @Override
- protected String getScriptName() {
- return RateLimitEnum.CONCURRENT.getScriptName();
+ public ConcurrentRateLimiterAlgorithm() {
+ super(RateLimitEnum.CONCURRENT.getScriptName());
}
@Override
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/LeakyBucketRateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/LeakyBucketRateLimiterAlgorithm.java
index afb8976..795638e 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/LeakyBucketRateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/LeakyBucketRateLimiterAlgorithm.java
@@ -26,9 +26,8 @@ import org.apache.shenyu.spi.Join;
@Join
public class LeakyBucketRateLimiterAlgorithm extends
AbstractRateLimiterAlgorithm {
- @Override
- protected String getScriptName() {
- return RateLimitEnum.LEAKY_BUCKET.getScriptName();
+ public LeakyBucketRateLimiterAlgorithm() {
+ super(RateLimitEnum.LEAKY_BUCKET.getScriptName());
}
@Override
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/RateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/RateLimiterAlgorithm.java
index 9a8c2a9..19fe5a5 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/RateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/RateLimiterAlgorithm.java
@@ -29,14 +29,21 @@ import java.util.List;
*/
@SPI
public interface RateLimiterAlgorithm<T> {
-
+
+ /**
+ * Gets script name.
+ *
+ * @return the script name
+ */
+ String getScriptName();
+
/**
* Gets script.
*
* @return the script
*/
RedisScript<T> getScript();
-
+
/**
* Gets keys.
*
@@ -44,12 +51,12 @@ public interface RateLimiterAlgorithm<T> {
* @return the keys
*/
List<String> getKeys(String id);
-
+
/**
* Callback string.
*
- * @param script the script
- * @param keys the keys
+ * @param script the script
+ * @param keys the keys
* @param scriptArgs the script args
*/
default void callback(final RedisScript<?> script, final List<String>
keys, final List<String> scriptArgs) {
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/SlidingWindowRateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/SlidingWindowRateLimiterAlgorithm.java
index 4ecfe2e..2b659ea 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/SlidingWindowRateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/SlidingWindowRateLimiterAlgorithm.java
@@ -30,9 +30,8 @@ import java.util.List;
@Join
public class SlidingWindowRateLimiterAlgorithm extends
AbstractRateLimiterAlgorithm {
- @Override
- protected String getScriptName() {
- return RateLimitEnum.SLIDING_WINDOW.getScriptName();
+ public SlidingWindowRateLimiterAlgorithm() {
+ super(RateLimitEnum.SLIDING_WINDOW.getScriptName());
}
@Override
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/TokenBucketRateLimiterAlgorithm.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/TokenBucketRateLimiterAlgorithm.java
index 3eb9c08..62f03fb 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/TokenBucketRateLimiterAlgorithm.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/main/java/org/apache/shenyu/plugin/ratelimiter/algorithm/TokenBucketRateLimiterAlgorithm.java
@@ -29,11 +29,10 @@ import org.apache.shenyu.spi.Join;
@Join
public class TokenBucketRateLimiterAlgorithm extends
AbstractRateLimiterAlgorithm {
- @Override
- protected String getScriptName() {
- return RateLimitEnum.TOKEN_BUCKET.getScriptName();
+ public TokenBucketRateLimiterAlgorithm() {
+ super(RateLimitEnum.TOKEN_BUCKET.getScriptName());
}
-
+
@Override
protected String getKeyName() {
return RateLimitEnum.TOKEN_BUCKET.getKeyName();
diff --git
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/test/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithmTest.java
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/test/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithmTest.java
index 1e37ed5..d585578 100644
---
a/shenyu-plugin/shenyu-plugin-ratelimiter/src/test/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithmTest.java
+++
b/shenyu-plugin/shenyu-plugin-ratelimiter/src/test/java/org/apache/shenyu/plugin/ratelimiter/algorithm/AbstractRateLimiterAlgorithmTest.java
@@ -46,14 +46,9 @@ public final class AbstractRateLimiterAlgorithmTest {
@Before
public void startup() {
- abstractRateLimiterAlgorithm = new AbstractRateLimiterAlgorithm() {
+ abstractRateLimiterAlgorithm = new
AbstractRateLimiterAlgorithm(RATE_ALGORITHM_SCRIPT_NAME) {
@Override
- protected String getScriptName() {
- return RATE_ALGORITHM_SCRIPT_NAME;
- }
-
- @Override
- protected String getKeyName() {
+ public String getKeyName() {
return KEY_NAME;
}
};