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