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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 91af6cf  [SCB-2118]servicecomb.references.version-rule not work (#2052)
91af6cf is described below

commit 91af6cf2e0b7c65ece69b77f52329e5f7f80ce73
Author: bao liu <[email protected]>
AuthorDate: Fri Nov 13 09:10:44 2020 +0800

    [SCB-2118]servicecomb.references.version-rule not work (#2052)
---
 .../core/definition/MicroserviceConfig.java        |  6 ++---
 .../OperationInstancesDiscoveryFilter.java         | 27 ++++++++++++++++++----
 .../servicecomb/demo/edge/business/Impl.java       |  3 +--
 .../servicecomb/demo/edge/business/Impl.java       |  3 +--
 .../servicecomb/demo/edge/business/Impl.java       |  3 +--
 .../servicecomb/demo/edge/consumer/Consumer.java   | 16 ++++++-------
 .../consumer/src/main/resources/microservice.yaml  |  4 +++-
 7 files changed, 39 insertions(+), 23 deletions(-)

diff --git 
a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceConfig.java
 
b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceConfig.java
index 82a675e..68f58b6 100644
--- 
a/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceConfig.java
+++ 
b/core/src/main/java/org/apache/servicecomb/core/definition/MicroserviceConfig.java
@@ -23,9 +23,9 @@ import 
org.apache.servicecomb.registry.version.VersionRuleUtils;
 @InjectProperties(prefix = "servicecomb")
 public class MicroserviceConfig {
   @InjectProperty(keys = {
-      "servicecomb.references.version-rule.${service}",
-      "servicecomb.references.${service}.version-rule", // Deprecated
-      "servicecomb.references.version-rule"
+      "references.version-rule.${service}",
+      "references.${service}.version-rule", // Deprecated
+      "references.version-rule"
   }, defaultValue = "0.0.0.0+")
   private String versionRule;
 
diff --git 
a/core/src/main/java/org/apache/servicecomb/core/registry/discovery/OperationInstancesDiscoveryFilter.java
 
b/core/src/main/java/org/apache/servicecomb/core/registry/discovery/OperationInstancesDiscoveryFilter.java
index 7dea7de..a61b353 100644
--- 
a/core/src/main/java/org/apache/servicecomb/core/registry/discovery/OperationInstancesDiscoveryFilter.java
+++ 
b/core/src/main/java/org/apache/servicecomb/core/registry/discovery/OperationInstancesDiscoveryFilter.java
@@ -29,8 +29,11 @@ import org.apache.servicecomb.core.definition.CoreMetaUtils;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
+import org.apache.servicecomb.registry.DiscoveryManager;
 import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.registry.consumer.AppManager;
 import org.apache.servicecomb.registry.consumer.MicroserviceVersion;
+import org.apache.servicecomb.registry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.registry.discovery.AbstractDiscoveryFilter;
 import org.apache.servicecomb.registry.discovery.DiscoveryContext;
 import org.apache.servicecomb.registry.discovery.DiscoveryTreeNode;
@@ -65,7 +68,6 @@ import com.netflix.config.DynamicPropertyFactory;
  *         {"i3": instance-i3}, {"i4": instance-i4}, {"i5": instance-i5}
  *       },
  *     }
- *     ms1.s1.o1 and ms1.s1.o2 should share the same map instance
  *
  *     that means, if invoke o1 or o2, can use 5 instances, but if invoke o3, 
can only use 3 instances
  *     by this filter, we can make sure that new operations will not route to 
old instances
@@ -98,10 +100,7 @@ public class OperationInstancesDiscoveryFilter extends 
AbstractDiscoveryFilter {
   public void init(DiscoveryContext context, DiscoveryTreeNode parent) {
     Invocation invocation = context.getInputParameters();
     // sort versions
-    List<MicroserviceVersion> microserviceVersions = 
CoreMetaUtils.getMicroserviceVersions(invocation)
-        .getVersions().values().stream()
-        .sorted(Comparator.comparing(MicroserviceVersion::getVersion))
-        .collect(Collectors.toList());
+    List<MicroserviceVersion> microserviceVersions = 
sortedMicroserviceVersion(invocation, parent.data());
 
     Map<String, DiscoveryTreeNode> operationNodes = new 
ConcurrentHashMapEx<>();
     for (MicroserviceVersion microserviceVersion : microserviceVersions) {
@@ -126,6 +125,24 @@ public class OperationInstancesDiscoveryFilter extends 
AbstractDiscoveryFilter {
     parent.children(operationNodes);
   }
 
+  protected List<MicroserviceVersion> sortedMicroserviceVersion(Invocation 
invocation,
+      Map<String, MicroserviceInstance> instances) {
+    OperationMeta latestOperationMeta = invocation.getOperationMeta();
+    MicroserviceMeta latestMicroserviceMeta = 
latestOperationMeta.getSchemaMeta().getMicroserviceMeta();
+    AppManager appManager = DiscoveryManager.INSTANCE.getAppManager();
+    MicroserviceVersions microserviceVersions =
+        
appManager.getOrCreateMicroserviceVersions(latestMicroserviceMeta.getAppId(),
+            latestMicroserviceMeta.getMicroserviceName());
+
+    Map<String, MicroserviceVersion> uniqueMicroserviceVersion = new 
HashMap<>();
+    for (MicroserviceInstance instance : instances.values()) {
+      MicroserviceVersion microserviceVersion = 
microserviceVersions.getVersion(instance.getServiceId());
+      uniqueMicroserviceVersion.put(instance.getServiceId(), 
microserviceVersion);
+    }
+    return 
uniqueMicroserviceVersion.values().stream().sorted(Comparator.comparing(MicroserviceVersion::getVersion))
+        .collect(Collectors.toList());
+  }
+
   private DiscoveryTreeNode createOperationNode(DiscoveryTreeNode parent, 
MicroserviceVersion microserviceVersion) {
     VersionRule versionRule = 
VersionRuleUtils.getOrCreate(microserviceVersion.getVersion().getVersion() + 
"+");
     return new DiscoveryTreeNode()
diff --git 
a/demo/demo-edge/business-1-1-0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
 
b/demo/demo-edge/business-1-1-0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
index 3ff5cd1..0c5c18e 100644
--- 
a/demo/demo-edge/business-1-1-0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
+++ 
b/demo/demo-edge/business-1-1-0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
@@ -17,7 +17,6 @@
 
 package org.apache.servicecomb.demo.edge.business;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.servicecomb.demo.edge.model.AppClientDataRsp;
 import org.apache.servicecomb.demo.edge.model.ChannelRequestBase;
 import org.apache.servicecomb.demo.edge.model.ResultWithInstance;
@@ -32,7 +31,7 @@ public class Impl {
   @RequestMapping(path = "/channel/news/subscribe", method = 
RequestMethod.POST)
   public AppClientDataRsp subscribeNewsColumn(@RequestBody ChannelRequestBase 
request) {
     AppClientDataRsp response = new AppClientDataRsp();
-    String rsp = StringUtils.rightPad("edge test", 1024, "*");
+    String rsp = "result from 1.1.0";
     response.setRsp(rsp);
     return response;
   }
diff --git 
a/demo/demo-edge/business-1.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
 
b/demo/demo-edge/business-1.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
index 1322db0..9ce3869 100644
--- 
a/demo/demo-edge/business-1.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
+++ 
b/demo/demo-edge/business-1.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
@@ -17,7 +17,6 @@
 
 package org.apache.servicecomb.demo.edge.business;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.servicecomb.demo.edge.model.AppClientDataRsp;
 import org.apache.servicecomb.demo.edge.model.ChannelRequestBase;
 import org.apache.servicecomb.demo.edge.model.ResultWithInstance;
@@ -32,7 +31,7 @@ public class Impl {
   @RequestMapping(path = "/channel/news/subscribe", method = 
RequestMethod.POST)
   public AppClientDataRsp subscribeNewsColumn(@RequestBody ChannelRequestBase 
request) {
     AppClientDataRsp response = new AppClientDataRsp();
-    String rsp = StringUtils.rightPad("edge test", 1024, "*");
+    String rsp = "result from 1.0.0";
     response.setRsp(rsp);
     return response;
   }
diff --git 
a/demo/demo-edge/business-2.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
 
b/demo/demo-edge/business-2.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
index 335d368..0462597 100644
--- 
a/demo/demo-edge/business-2.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
+++ 
b/demo/demo-edge/business-2.0.0/src/main/java/org/apache/servicecomb/demo/edge/business/Impl.java
@@ -25,7 +25,6 @@ import java.io.RandomAccessFile;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
 import org.apache.servicecomb.demo.edge.model.AppClientDataRsp;
 import org.apache.servicecomb.demo.edge.model.ChannelRequestBase;
 import org.apache.servicecomb.demo.edge.model.DependTypeA;
@@ -57,7 +56,7 @@ public class Impl {
   @RequestMapping(path = "/channel/news/subscribe", method = 
RequestMethod.POST)
   public AppClientDataRsp subscribeNewsColumn(@RequestBody ChannelRequestBase 
request) {
     AppClientDataRsp response = new AppClientDataRsp();
-    String rsp = StringUtils.rightPad("edge test", 1024, "*");
+    String rsp = "result from 2.0.0";
     response.setRsp(rsp);
     return response;
   }
diff --git 
a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
 
b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
index fa43ba9..6d00edb 100644
--- 
a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
+++ 
b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
@@ -284,16 +284,16 @@ public class Consumer {
   }
 
   protected void invokeBusiness(String urlPrefix, ChannelRequestBase request) {
-    String url = urlPrefix + "/channel/news/subscribe";
+    for (int i = 0; i < 3; i++) {
+      String url = urlPrefix + "/channel/news/subscribe";
 
-    HttpHeaders headers = new HttpHeaders();
-    headers.setContentType(MediaType.APPLICATION_JSON);
+      HttpHeaders headers = new HttpHeaders();
+      headers.setContentType(MediaType.APPLICATION_JSON);
 
-    HttpEntity<ChannelRequestBase> entity = new HttpEntity<>(request, headers);
+      HttpEntity<ChannelRequestBase> entity = new HttpEntity<>(request, 
headers);
 
-    ResponseEntity<AppClientDataRsp> response = template.postForEntity(url, 
entity, AppClientDataRsp.class);
-    System.out.println("urlPrefix: " + urlPrefix);
-    System.out.println(response.getHeaders());
-    System.out.println(response.getBody().toString());
+      ResponseEntity<AppClientDataRsp> response = template.postForEntity(url, 
entity, AppClientDataRsp.class);
+      Assert.isTrue(response.getBody().getRsp().equals("result from 1.1.0"), 
response.getBody().getRsp());
+    }
   }
 }
diff --git a/demo/demo-edge/consumer/src/main/resources/microservice.yaml 
b/demo/demo-edge/consumer/src/main/resources/microservice.yaml
index 6a0fc8d..660dfbf 100644
--- a/demo/demo-edge/consumer/src/main/resources/microservice.yaml
+++ b/demo/demo-edge/consumer/src/main/resources/microservice.yaml
@@ -28,4 +28,6 @@ servicecomb:
   handler:
     chain:
       Consumer:
-        default: loadbalance
\ No newline at end of file
+        default: loadbalance
+  references:
+    version-rule: 1.1.0
\ No newline at end of file

Reply via email to