dragon-zhang commented on code in PR #3418:
URL: https://github.com/apache/incubator-shenyu/pull/3418#discussion_r881754284


##########
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java:
##########
@@ -63,38 +73,133 @@ public abstract class AbstractShenyuPlugin implements 
ShenyuPlugin {
      */
     @Override
     public Mono<Void> execute(final ServerWebExchange exchange, final 
ShenyuPluginChain chain) {
+        initMatchCacheConfig();
         String pluginName = named();
         PluginData pluginData = 
BaseDataCache.getInstance().obtainPluginData(pluginName);
         if (pluginData != null && pluginData.getEnabled()) {
-            final Collection<SelectorData> selectors = 
BaseDataCache.getInstance().obtainSelectorData(pluginName);
-            if (CollectionUtils.isEmpty(selectors)) {
-                return handleSelectorIfNull(pluginName, exchange, chain);
+            final String path = exchange.getRequest().getURI().getPath();
+
+            Pair<Boolean, SelectorData> resultSelectorData = 
obtainSelectorDataCacheIfEnabled(exchange);
+            SelectorData selectorData = resultSelectorData.getRight();
+            if (Boolean.TRUE.equals(resultSelectorData.getLeft())) {
+                List<SelectorData> selectors = 
BaseDataCache.getInstance().obtainSelectorData(pluginName);
+                if (CollectionUtils.isEmpty(selectors)) {
+                    return handleSelectorIfNull(pluginName, exchange, chain);
+                }
+                selectorData = matchSelector(exchange, selectors);
+                cacheSelectorDataIfEnabled(path, selectorData);
             }
-            SelectorData selectorData = matchSelector(exchange, selectors);
             if (Objects.isNull(selectorData)) {
                 return handleSelectorIfNull(pluginName, exchange, chain);
             }
             selectorLog(selectorData, pluginName);
-            List<RuleData> rules = 
BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
-            if (CollectionUtils.isEmpty(rules)) {
-                return handleRuleIfNull(pluginName, exchange, chain);
-            }
-            RuleData rule;
-            if (selectorData.getType() == 
SelectorTypeEnum.FULL_FLOW.getCode()) {
-                //get last
-                rule = rules.get(rules.size() - 1);
-            } else {
-                rule = matchRule(exchange, rules);
+
+            Pair<Boolean, RuleData> resultRuleData = 
obtainRuleDataCacheIfEnabled(exchange);
+            RuleData rule = resultRuleData.getRight();
+            if (Boolean.TRUE.equals(resultRuleData.getLeft())) {
+                List<RuleData> rules = 
BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
+                if (CollectionUtils.isEmpty(rules)) {
+                    return handleRuleIfNull(pluginName, exchange, chain);
+                }
+                if (selectorData.getType() == 
SelectorTypeEnum.FULL_FLOW.getCode()) {
+                    //get last
+                    rule = rules.get(rules.size() - 1);
+                } else {
+                    rule = matchRule(exchange, rules);
+                    cacheRuleDataIfEnabled(path, rule);
+                }
             }
             if (Objects.isNull(rule)) {
                 return handleRuleIfNull(pluginName, exchange, chain);
             }
             ruleLog(rule, pluginName);
+
             return doExecute(exchange, chain, selectorData, rule);
         }
         return chain.execute(exchange);
     }
 
+    private void initMatchCacheConfig() {
+        if (Objects.isNull(matchCacheConfig)) {
+            matchCacheConfig = 
SpringBeanUtils.getInstance().getBean(ShenyuConfig.class).getMatchCache();
+        }
+    }
+
+    private void cacheRuleDataIfEnabled(final String path, final RuleData 
rule) {
+        if (matchCacheConfig.getEnabled()) {
+            if (Objects.isNull(rule)) {
+                nullRuleData.setPluginName(named());
+                MatchDataCache.getInstance().cacheRuleData(path, nullRuleData, 
matchCacheConfig.getMaxFreeMemory());
+            } else {
+                MatchDataCache.getInstance().cacheRuleData(path, rule, 
matchCacheConfig.getMaxFreeMemory());
+            }
+        }
+    }
+
+    private Pair<Boolean, RuleData> obtainRuleDataCacheIfEnabled(final 
ServerWebExchange exchange) {
+        if (matchCacheConfig.getEnabled()) {
+            List<RuleData> rules = 
MatchDataCache.getInstance().obtainRuleData(named(), 
exchange.getRequest().getURI().getPath());
+
+            if (Objects.isNull(rules)) {
+                return Pair.of(Boolean.TRUE, null);
+            }
+
+            if (rules.size() == 0) {
+                return Pair.of(Boolean.FALSE, null);
+            }
+
+            RuleData rule;
+            if (rules.size() == 1) {
+                rule = rules.get(0);
+            } else {
+                rule = matchRule(exchange, rules);
+            }
+
+            if (Objects.nonNull(rule)) {
+                return Pair.of(Boolean.FALSE, rule);
+            }
+
+        }
+        return Pair.of(Boolean.TRUE, null);
+    }
+
+    private void cacheSelectorDataIfEnabled(final String path, final 
SelectorData selectorData) {
+        if (matchCacheConfig.getEnabled()) {
+            if (Objects.isNull(selectorData)) {
+                nullSelectorData.setPluginName(named());

Review Comment:
   Can we extract it into {} code blocks? Such as below:
   ```java
   {
       nullSelectorData.setPluginName(named());
       //......
   }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to