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;
             }
         };

Reply via email to