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 2021/11/28 15:43:41 UTC

[dubbo] branch 3.0 updated: Reduce memory allocation in ServiceDiscovery (#9328)

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

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


The following commit(s) were added to refs/heads/3.0 by this push:
     new 5349c13  Reduce memory allocation in ServiceDiscovery (#9328)
5349c13 is described below

commit 5349c13a36d277a090e1dc68fbe7c3b46d78fc90
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Sun Nov 28 23:43:29 2021 +0800

    Reduce memory allocation in ServiceDiscovery (#9328)
---
 .../main/java/org/apache/dubbo/metadata/MetadataInfo.java  |  4 ++++
 .../dubbo/registry/client/DefaultServiceInstance.java      | 14 ++++++++++----
 .../event/listener/ServiceInstancesChangedListener.java    |  5 ++++-
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
index 4f0cecb..3c3a614 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
@@ -102,6 +102,10 @@ public class MetadataInfo implements Serializable {
         markChanged();
     }
 
+    public String getRevision() {
+        return revision;
+    }
+
     /**
      * Reported status and metadata modification must be synchronized if used in multiple threads.
      */
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
index 9211990..a3e5fc9 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
@@ -24,6 +24,7 @@ import com.alibaba.fastjson.JSON;
 import java.beans.Transient;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -71,6 +72,7 @@ public class DefaultServiceInstance implements ServiceInstance {
     private transient Map<String, String> extendParams;
     private transient List<Endpoint> endpoints;
     private transient Map<String, Object> attributes = new HashMap<>();
+    private transient InstanceAddressURL instanceAddressURL = null;
 
     public DefaultServiceInstance() {
     }
@@ -196,10 +198,10 @@ public class DefaultServiceInstance implements ServiceInstance {
     }
 
     public List<Endpoint> getEndpoints() {
-        if (endpoints != null) {
-            return endpoints;
+        if (endpoints == null) {
+            endpoints = new LinkedList<>(JSON.parseArray(metadata.get(ENDPOINTS), Endpoint.class));
         }
-        return JSON.parseArray(metadata.get(ENDPOINTS), Endpoint.class);
+        return endpoints;
     }
 
     public DefaultServiceInstance copyFrom(Endpoint endpoint) {
@@ -247,11 +249,15 @@ public class DefaultServiceInstance implements ServiceInstance {
 
     public void setServiceMetadata(MetadataInfo serviceMetadata) {
         this.serviceMetadata = serviceMetadata;
+        this.instanceAddressURL = null;
     }
 
     @Override
     public InstanceAddressURL toURL() {
-        return new InstanceAddressURL(this, serviceMetadata);
+        if (instanceAddressURL == null) {
+            instanceAddressURL = new InstanceAddressURL(this, serviceMetadata);
+        }
+        return instanceAddressURL;
     }
 
     @Override
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
index a41f537..25f480b 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
@@ -143,7 +143,10 @@ public class ServiceInstancesChangedListener {
             MetadataInfo metadata = getRemoteMetadata(revision, localServiceToRevisions, instance);
             // update metadata into each instance, in case new instance created.
             for (ServiceInstance tmpInstance : subInstances) {
-                ((DefaultServiceInstance) tmpInstance).setServiceMetadata(metadata);
+                MetadataInfo originMetadata = ((DefaultServiceInstance) tmpInstance).getServiceMetadata();
+                if (originMetadata == null || !Objects.equals(originMetadata.getRevision(), metadata.getRevision())) {
+                    ((DefaultServiceInstance) tmpInstance).setServiceMetadata(metadata);
+                }
             }
 //            ((DefaultServiceInstance) instance).setServiceMetadata(metadata);
             newRevisionToMetadata.putIfAbsent(revision, metadata);