You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/12/14 03:45:03 UTC

[dubbo] branch 3.1 updated: Fix timeout being cached in InstanceAddressURL (#11041)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.1 by this push:
     new 0108dd5e69 Fix timeout being cached in InstanceAddressURL (#11041)
0108dd5e69 is described below

commit 0108dd5e69046b9908984cf4f3616a5fe41a0bda
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Dec 14 11:44:18 2022 +0800

    Fix timeout being cached in InstanceAddressURL (#11041)
---
 .../src/main/java/org/apache/dubbo/common/URL.java | 243 ++----------
 .../common/url/component/ServiceConfigURL.java     | 413 +++++++++++++++++++++
 .../dubbo/registry/client/InstanceAddressURL.java  |  40 --
 .../client/OverrideInstanceAddressURL.java         |  32 --
 4 files changed, 438 insertions(+), 290 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
index ca028aed06..f689cf25b9 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
@@ -54,7 +54,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
 
 import static org.apache.dubbo.common.BaseServiceMetadata.COLON_SEPARATOR;
@@ -123,12 +122,6 @@ class URL implements Serializable {
 
     // ==== cache ====
 
-    private volatile transient Map<String, Number> numbers;
-
-    private volatile transient Map<String, Map<String, Number>> methodNumbers;
-
-    private volatile transient Map<String, URL> urls;
-
     private transient String serviceKey;
     private transient String protocolServiceKey;
     protected volatile Map<String, Object> attributes;
@@ -663,125 +656,62 @@ class URL implements Serializable {
         return (ServiceModel) getAttribute(CommonConstants.SERVICE_MODEL);
     }
 
-    protected Map<String, Number> getNumbers() {
-        // concurrent initialization is tolerant
-        if (numbers == null) {
-            numbers = new ConcurrentHashMap<>();
-        }
-        return numbers;
-    }
 
-    protected Map<String, Map<String, Number>> getMethodNumbers() {
-        if (methodNumbers == null) { // concurrent initialization is tolerant
-            methodNumbers = new ConcurrentHashMap<>();
-        }
-        return methodNumbers;
-    }
-
-    private Map<String, URL> getUrls() {
-        // concurrent initialization is tolerant
-        if (urls == null) {
-            urls = new ConcurrentHashMap<>();
-        }
-        return urls;
-    }
 
     public URL getUrlParameter(String key) {
-        URL u = getUrls().get(key);
-        if (u != null) {
-            return u;
-        }
         String value = getParameterAndDecoded(key);
         if (StringUtils.isEmpty(value)) {
             return null;
         }
-        u = URL.valueOf(value);
-        getUrls().put(key, u);
-        return u;
+        return URL.valueOf(value);
     }
 
     public double getParameter(String key, double defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.doubleValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        double d = Double.parseDouble(value);
-        getNumbers().put(key, d);
-        return d;
+        return Double.parseDouble(value);
     }
 
     public float getParameter(String key, float defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.floatValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        float f = Float.parseFloat(value);
-        getNumbers().put(key, f);
-        return f;
+        return Float.parseFloat(value);
     }
 
     public long getParameter(String key, long defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.longValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        long l = Long.parseLong(value);
-        getNumbers().put(key, l);
-        return l;
+        return Long.parseLong(value);
     }
 
     public int getParameter(String key, int defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.intValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        int i = Integer.parseInt(value);
-        getNumbers().put(key, i);
-        return i;
+        return Integer.parseInt(value);
     }
 
     public short getParameter(String key, short defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.shortValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        short s = Short.parseShort(value);
-        getNumbers().put(key, s);
-        return s;
+        return Short.parseShort(value);
     }
 
     public byte getParameter(String key, byte defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.byteValue();
-        }
         String value = getParameter(key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        byte b = Byte.parseByte(value);
-        getNumbers().put(key, b);
-        return b;
+        return Byte.parseByte(value);
     }
 
     public float getPositiveParameter(String key, float defaultValue) {
@@ -869,100 +799,51 @@ class URL implements Serializable {
     }
 
     public double getMethodParameter(String method, String key, double defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.doubleValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        double d = Double.parseDouble(value);
-        updateCachedNumber(method, key, d);
-        return d;
+        return Double.parseDouble(value);
     }
 
     public float getMethodParameter(String method, String key, float defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.floatValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        float f = Float.parseFloat(value);
-        updateCachedNumber(method, key, f);
-        return f;
+        return Float.parseFloat(value);
     }
 
     public long getMethodParameter(String method, String key, long defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.longValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        long l = Long.parseLong(value);
-        updateCachedNumber(method, key, l);
-        return l;
+        return Long.parseLong(value);
     }
 
     public int getMethodParameter(String method, String key, int defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.intValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        int i = Integer.parseInt(value);
-        updateCachedNumber(method, key, i);
-        return i;
+        return Integer.parseInt(value);
     }
 
     public short getMethodParameter(String method, String key, short defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.shortValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        short s = Short.parseShort(value);
-        updateCachedNumber(method, key, s);
-        return s;
+        return Short.parseShort(value);
     }
 
     public byte getMethodParameter(String method, String key, byte defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.byteValue();
-        }
         String value = getMethodParameter(method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        byte b = Byte.parseByte(value);
-        updateCachedNumber(method, key, b);
-        return b;
-    }
-
-    private Number getCachedNumber(String method, String key) {
-        Map<String, Number> keyNumber = getMethodNumbers().get(method);
-        if (keyNumber != null) {
-            return keyNumber.get(key);
-        }
-        return null;
-    }
-
-    private void updateCachedNumber(String method, String key, Number n) {
-        Map<String, Number> keyNumber = getMethodNumbers().computeIfAbsent(method, m -> new HashMap<>());
-        keyNumber.put(key, n);
+        return Byte.parseByte(value);
     }
 
     public double getMethodPositiveParameter(String method, String key, double defaultValue) {
@@ -1733,73 +1614,43 @@ class URL implements Serializable {
     }
 
     public double getServiceParameter(String service, String key, double defaultValue) {
-        Number n = getServiceNumbers(service).get(key);
-        if (n != null) {
-            return n.doubleValue();
-        }
         String value = getServiceParameter(service, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        double d = Double.parseDouble(value);
-        getNumbers().put(key, d);
-        return d;
+        return Double.parseDouble(value);
     }
 
     public float getServiceParameter(String service, String key, float defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.floatValue();
-        }
         String value = getServiceParameter(service, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        float f = Float.parseFloat(value);
-        getNumbers().put(key, f);
-        return f;
+        return Float.parseFloat(value);
     }
 
     public long getServiceParameter(String service, String key, long defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.longValue();
-        }
         String value = getServiceParameter(service, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        long l = Long.parseLong(value);
-        getNumbers().put(key, l);
-        return l;
+        return Long.parseLong(value);
     }
 
     public short getServiceParameter(String service, String key, short defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.shortValue();
-        }
         String value = getServiceParameter(service, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        short s = Short.parseShort(value);
-        getNumbers().put(key, s);
-        return s;
+        return Short.parseShort(value);
     }
 
     public byte getServiceParameter(String service, String key, byte defaultValue) {
-        Number n = getNumbers().get(key);
-        if (n != null) {
-            return n.byteValue();
-        }
         String value = getServiceParameter(service, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        byte b = Byte.parseByte(value);
-        getNumbers().put(key, b);
-        return b;
+        return Byte.parseByte(value);
     }
 
     public char getServiceParameter(String service, String key, char defaultValue) {
@@ -1887,87 +1738,51 @@ class URL implements Serializable {
     }
 
     public double getServiceMethodParameter(String service, String method, String key, double defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.doubleValue();
-        }
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        double d = Double.parseDouble(value);
-        updateCachedNumber(method, key, d);
-        return d;
+        return Double.parseDouble(value);
     }
 
     public float getServiceMethodParameter(String service, String method, String key, float defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.floatValue();
-        }
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        float f = Float.parseFloat(value);
-        updateCachedNumber(method, key, f);
-        return f;
+        return Float.parseFloat(value);
     }
 
     public long getServiceMethodParameter(String service, String method, String key, long defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.longValue();
-        }
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        long l = Long.parseLong(value);
-        updateCachedNumber(method, key, l);
-        return l;
+        return Long.parseLong(value);
     }
 
     public int getServiceMethodParameter(String service, String method, String key, int defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.intValue();
-        }
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        int i = Integer.parseInt(value);
-        updateCachedNumber(method, key, i);
-        return i;
+        return Integer.parseInt(value);
     }
 
-    public short getMethodParameter(String service, String method, String key, short defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.shortValue();
-        }
+    public short getServiceMethodParameter(String service, String method, String key, short defaultValue) {
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        short s = Short.parseShort(value);
-        updateCachedNumber(method, key, s);
-        return s;
+        return Short.parseShort(value);
     }
 
     public byte getServiceMethodParameter(String service, String method, String key, byte defaultValue) {
-        Number n = getCachedNumber(method, key);
-        if (n != null) {
-            return n.byteValue();
-        }
         String value = getServiceMethodParameter(service, method, key);
         if (StringUtils.isEmpty(value)) {
             return defaultValue;
         }
-        byte b = Byte.parseByte(value);
-        updateCachedNumber(method, key, b);
-        return b;
+        return Byte.parseByte(value);
     }
 
     public boolean hasServiceMethodParameter(String service, String method, String key) {
@@ -1978,14 +1793,6 @@ class URL implements Serializable {
         return hasMethodParameter(method);
     }
 
-    protected Map<String, Number> getServiceNumbers(String service) {
-        return getNumbers();
-    }
-
-    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String service) {
-        return getMethodNumbers();
-    }
-
     public URL toSerializableURL() {
         return returnURL(URLPlainParam.toURLPlainParam(urlParam));
     }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
index fc67804b9a..95bdb75110 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
@@ -18,12 +18,18 @@ package org.apache.dubbo.common.url.component;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.StringUtils;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class ServiceConfigURL extends URL {
 
+
+    private volatile transient Map<String, URL> urls;
+    private volatile transient Map<String, Number> numbers;
+    private volatile transient Map<String, Map<String, Number>> methodNumbers;
     private volatile transient String full;
     private volatile transient String string;
     private volatile transient String identity;
@@ -157,4 +163,411 @@ public class ServiceConfigURL extends URL {
         }
         return parameter = super.toParameterString();
     }
+
+
+    @Override
+    public URL getUrlParameter(String key) {
+        URL u = getUrls().get(key);
+        if (u != null) {
+            return u;
+        }
+        String value = getParameterAndDecoded(key);
+        if (StringUtils.isEmpty(value)) {
+            return null;
+        }
+        u = URL.valueOf(value);
+        getUrls().put(key, u);
+        return u;
+    }
+
+    @Override
+    public double getParameter(String key, double defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.doubleValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        double d = Double.parseDouble(value);
+        getNumbers().put(key, d);
+        return d;
+    }
+
+    @Override
+    public float getParameter(String key, float defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.floatValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        float f = Float.parseFloat(value);
+        getNumbers().put(key, f);
+        return f;
+    }
+
+    @Override
+    public long getParameter(String key, long defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.longValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        long l = Long.parseLong(value);
+        getNumbers().put(key, l);
+        return l;
+    }
+
+    @Override
+    public int getParameter(String key, int defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.intValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        int i = Integer.parseInt(value);
+        getNumbers().put(key, i);
+        return i;
+    }
+
+    @Override
+    public short getParameter(String key, short defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.shortValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        short s = Short.parseShort(value);
+        getNumbers().put(key, s);
+        return s;
+    }
+
+    @Override
+    public byte getParameter(String key, byte defaultValue) {
+        Number n = getNumbers().get(key);
+        if (n != null) {
+            return n.byteValue();
+        }
+        String value = getParameter(key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        byte b = Byte.parseByte(value);
+        getNumbers().put(key, b);
+        return b;
+    }
+
+    @Override
+    public double getMethodParameter(String method, String key, double defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.doubleValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        double d = Double.parseDouble(value);
+        updateCachedNumber(method, key, d);
+        return d;
+    }
+
+    @Override
+    public float getMethodParameter(String method, String key, float defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.floatValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        float f = Float.parseFloat(value);
+        updateCachedNumber(method, key, f);
+        return f;
+    }
+
+    @Override
+    public long getMethodParameter(String method, String key, long defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.longValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        long l = Long.parseLong(value);
+        updateCachedNumber(method, key, l);
+        return l;
+    }
+
+    @Override
+    public int getMethodParameter(String method, String key, int defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.intValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        int i = Integer.parseInt(value);
+        updateCachedNumber(method, key, i);
+        return i;
+    }
+
+    @Override
+    public short getMethodParameter(String method, String key, short defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.shortValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        short s = Short.parseShort(value);
+        updateCachedNumber(method, key, s);
+        return s;
+    }
+
+    @Override
+    public byte getMethodParameter(String method, String key, byte defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.byteValue();
+        }
+        String value = getMethodParameter(method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        byte b = Byte.parseByte(value);
+        updateCachedNumber(method, key, b);
+        return b;
+    }
+
+    @Override
+    public double getServiceParameter(String service, String key, double defaultValue) {
+        Number n = getServiceNumbers(service).get(key);
+        if (n != null) {
+            return n.doubleValue();
+        }
+        String value = getServiceParameter(service, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        double d = Double.parseDouble(value);
+        getNumbers().put(key, d);
+        return d;
+    }
+
+    @Override
+    public float getServiceParameter(String service, String key, float defaultValue) {
+        Number n = getServiceNumbers(service).get(key);
+        if (n != null) {
+            return n.floatValue();
+        }
+        String value = getServiceParameter(service, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        float f = Float.parseFloat(value);
+        getNumbers().put(key, f);
+        return f;
+    }
+
+    @Override
+    public long getServiceParameter(String service, String key, long defaultValue) {
+        Number n = getServiceNumbers(service).get(key);
+        if (n != null) {
+            return n.longValue();
+        }
+        String value = getServiceParameter(service, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        long l = Long.parseLong(value);
+        getNumbers().put(key, l);
+        return l;
+    }
+
+    @Override
+    public short getServiceParameter(String service, String key, short defaultValue) {
+        Number n = getServiceNumbers(service).get(key);
+        if (n != null) {
+            return n.shortValue();
+        }
+        String value = getServiceParameter(service, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        short s = Short.parseShort(value);
+        getNumbers().put(key, s);
+        return s;
+    }
+
+    @Override
+    public byte getServiceParameter(String service, String key, byte defaultValue) {
+        Number n = getServiceNumbers(service).get(key);
+        if (n != null) {
+            return n.byteValue();
+        }
+        String value = getServiceParameter(service, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        byte b = Byte.parseByte(value);
+        getNumbers().put(key, b);
+        return b;
+    }
+
+    @Override
+    public double getServiceMethodParameter(String service, String method, String key, double defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.doubleValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        double d = Double.parseDouble(value);
+        updateCachedNumber(method, key, d);
+        return d;
+    }
+
+    @Override
+    public float getServiceMethodParameter(String service, String method, String key, float defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.floatValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        float f = Float.parseFloat(value);
+        updateCachedNumber(method, key, f);
+        return f;
+    }
+
+    @Override
+    public long getServiceMethodParameter(String service, String method, String key, long defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.longValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        long l = Long.parseLong(value);
+        updateCachedNumber(method, key, l);
+        return l;
+    }
+
+    @Override
+    public int getServiceMethodParameter(String service, String method, String key, int defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.intValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        int i = Integer.parseInt(value);
+        updateCachedNumber(method, key, i);
+        return i;
+    }
+
+    @Override
+    public short getServiceMethodParameter(String service, String method, String key, short defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.shortValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        short s = Short.parseShort(value);
+        updateCachedNumber(method, key, s);
+        return s;
+    }
+
+    @Override
+    public byte getServiceMethodParameter(String service, String method, String key, byte defaultValue) {
+        Number n = getCachedNumber(method, key);
+        if (n != null) {
+            return n.byteValue();
+        }
+        String value = getServiceMethodParameter(service, method, key);
+        if (StringUtils.isEmpty(value)) {
+            return defaultValue;
+        }
+        byte b = Byte.parseByte(value);
+        updateCachedNumber(method, key, b);
+        return b;
+    }
+
+
+    private Map<String, URL> getUrls() {
+        // concurrent initialization is tolerant
+        if (urls == null) {
+            urls = new ConcurrentHashMap<>();
+        }
+        return urls;
+    }
+
+    protected Map<String, Number> getNumbers() {
+        // concurrent initialization is tolerant
+        if (numbers == null) {
+            numbers = new ConcurrentHashMap<>();
+        }
+        return numbers;
+    }
+
+    private Number getCachedNumber(String method, String key) {
+        Map<String, Number> keyNumber = getMethodNumbers().get(method);
+        if (keyNumber != null) {
+            return keyNumber.get(key);
+        }
+        return null;
+    }
+
+    private void updateCachedNumber(String method, String key, Number n) {
+        Map<String, Number> keyNumber = getMethodNumbers().computeIfAbsent(method, m -> new HashMap<>());
+        keyNumber.put(key, n);
+    }
+
+    protected Map<String, Map<String, Number>> getMethodNumbers() {
+        if (methodNumbers == null) { // concurrent initialization is tolerant
+            methodNumbers = new ConcurrentHashMap<>();
+        }
+        return methodNumbers;
+    }
+
+    protected Map<String, Number> getServiceNumbers(String service) {
+        return getNumbers();
+    }
+
+    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String service) {
+        return getMethodNumbers();
+    }
+
 }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
index 225b6e6e2e..3708991dc2 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
@@ -33,7 +33,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
@@ -51,8 +50,6 @@ public class InstanceAddressURL extends URL {
     private final MetadataInfo metadataInfo;
 
     // cached numbers
-    private volatile transient Map<String, Number> numbers;
-    private volatile transient Map<String, Map<String, Number>> methodNumbers;
     private volatile transient Set<String> providerFirstParams;
     // one instance address url serves only one protocol.
     private final transient String protocol;
@@ -525,43 +522,6 @@ public class InstanceAddressURL extends URL {
         throw new UnsupportedOperationException("URLAddress is replaced with ServiceInstance in instance url");
     }
 
-    @Override
-    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {
-        MetadataInfo.ServiceInfo serviceInfo = getServiceInfo(protocolServiceKey);
-
-        return null == serviceInfo ? new ConcurrentHashMap<>() : serviceInfo.getNumbers();
-    }
-
-    @Override
-    protected Map<String, Number> getNumbers() {
-        String protocolServiceKey = getProtocolServiceKey();
-        if (isEmpty(protocolServiceKey)) {
-            if (numbers == null) { // concurrent initialization is tolerant
-                numbers = new ConcurrentHashMap<>();
-            }
-            return numbers;
-        }
-        return getServiceNumbers(protocolServiceKey);
-    }
-
-    @Override
-    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {
-        MetadataInfo.ServiceInfo serviceInfo = getServiceInfo(protocolServiceKey);
-        return null == serviceInfo ? new ConcurrentHashMap<>() : serviceInfo.getMethodNumbers();
-    }
-
-    @Override
-    protected Map<String, Map<String, Number>> getMethodNumbers() {
-        String protocolServiceKey = getProtocolServiceKey();
-        if (isEmpty(protocolServiceKey)) {
-            if (methodNumbers == null) { // concurrent initialization is tolerant
-                methodNumbers = new ConcurrentHashMap<>();
-            }
-            return methodNumbers;
-        }
-        return getServiceMethodNumbers(protocolServiceKey);
-    }
-
     private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {
         return metadataInfo.getValidServiceInfo(protocolServiceKey);
     }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
index c02ef138e3..4791dceab4 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
@@ -31,7 +31,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 
 public class OverrideInstanceAddressURL extends InstanceAddressURL {
     private static final long serialVersionUID = 1373220432794558426L;
@@ -39,11 +38,6 @@ public class OverrideInstanceAddressURL extends InstanceAddressURL {
     private final URLParam overrideParams;
     private final InstanceAddressURL originUrl;
 
-    private final transient Map<String, Map<String, Map<String, Number>>> methodNumberCache = new ConcurrentHashMap<>();
-    private volatile transient Map<String, Map<String, Number>> methodNumbers;
-    private final transient Map<String, Map<String, Number>> serviceNumberCache = new ConcurrentHashMap<>();
-    private volatile transient Map<String, Number> numbers;
-
     public OverrideInstanceAddressURL(InstanceAddressURL originUrl) {
         this.originUrl = originUrl;
         this.overrideParams = URLParam.parse("");
@@ -240,32 +234,6 @@ public class OverrideInstanceAddressURL extends InstanceAddressURL {
         return originUrl.getUrlAddress();
     }
 
-    @Override
-    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {
-        return serviceNumberCache.computeIfAbsent(protocolServiceKey, (k) -> new ConcurrentHashMap<>());
-    }
-
-    @Override
-    protected Map<String, Number> getNumbers() {
-        if (numbers == null) { // concurrent initialization is tolerant
-            numbers = new ConcurrentHashMap<>();
-        }
-        return numbers;
-    }
-
-    @Override
-    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {
-        return methodNumberCache.computeIfAbsent(protocolServiceKey, (k) -> new ConcurrentHashMap<>());
-    }
-
-    @Override
-    protected Map<String, Map<String, Number>> getMethodNumbers() {
-        if (methodNumbers == null) { // concurrent initialization is tolerant
-            methodNumbers = new ConcurrentHashMap<>();
-        }
-        return methodNumbers;
-    }
-
     public URLParam getOverrideParams() {
         return overrideParams;
     }