[SCB-2670] support CSE instance-level configuration query (#3288)

diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
index dd766aa..4f2b432 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/ConfigurationsRequestFactory.java
@@ -30,6 +30,10 @@
 
   private static final String KEY_SERVICE = "service";
 
+  private static final String KEY_VERSION = "version";
+
+  private static final int VERSION_ORDER = 50;
+
   private static final int SERVICE_ORDER = 100;
 
   private static final int APP_ORDER = 200;
@@ -44,6 +48,9 @@
     if (configuration.isEnableServiceConfig()) {
       result.add(createServiceConfigurationsRequest(configuration));
     }
+    if (configuration.isEnableVersionConfig()) {
+      result.add(createVersionConfigurationsRequest(configuration));
+    }
     if (configuration.isEnableCustomConfig()) {
       result.add(createCustomConfigurationsRequest(configuration));
     }
@@ -67,6 +74,16 @@
             buildLabelQueryItem(KEY_ENVIRONMENT, configuration.getEnvironment())));
   }
 
+  private static ConfigurationsRequest createVersionConfigurationsRequest(KieConfiguration configuration) {
+    return new ConfigurationsRequest()
+        .setOrder(VERSION_ORDER)
+        .setWithExact(true)
+        .setLabelsQuery(buildLabelQuery(buildLabelQueryItem(KEY_APP, configuration.getAppName()),
+            buildLabelQueryItem(KEY_SERVICE, configuration.getServiceName()),
+            buildLabelQueryItem(KEY_ENVIRONMENT, configuration.getEnvironment()),
+            buildLabelQueryItem(KEY_VERSION, configuration.getVersion())));
+  }
+
   private static ConfigurationsRequest createCustomConfigurationsRequest(KieConfiguration configuration) {
     return new ConfigurationsRequest()
         .setOrder(CUSTOM_ORDER)
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieConfiguration.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieConfiguration.java
index 2a8bf4d..9c75f2d 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieConfiguration.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieConfiguration.java
@@ -32,10 +32,14 @@
 
   private String environment;
 
+  private String version;
+
   private boolean enableAppConfig;
 
   private boolean enableServiceConfig;
 
+  private boolean enableVersionConfig;
+
   private boolean enableCustomConfig;
 
   private String customLabelValue;
@@ -125,6 +129,15 @@
     return this;
   }
 
+  public boolean isEnableVersionConfig() {
+    return enableVersionConfig;
+  }
+
+  public KieConfiguration setEnableVersionConfig(boolean enableVersionConfig) {
+    this.enableVersionConfig = enableVersionConfig;
+    return this;
+  }
+
   public int getPollingWaitInSeconds() {
     return pollingWaitInSeconds;
   }
@@ -160,4 +173,13 @@
     this.refreshIntervalInMillis = refreshIntervallnMillis;
     return this;
   }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public KieConfiguration setVersion(String version) {
+    this.version = version;
+    return this;
+  }
 }
diff --git a/demo/demo-cse-v2/README.md b/demo/demo-cse-v2/README.md
index b5c4890..a9936ec 100644
--- a/demo/demo-cse-v2/README.md
+++ b/demo/demo-cse-v2/README.md
@@ -9,7 +9,7 @@
 * 依次启动 provider、consumer、gateway
 
 * 在配置中心增加如下配置:
-  * 应用级配置:consumer.yaml。类型为 yaml。 
+* 应用级配置:consumer.yaml。类型为 yaml。 
 
 ```yaml
 cse:
@@ -59,6 +59,27 @@
     test:
       priority: v4
 ```
+* 应用级配置:consumerApp.yaml,应用选择demo-java-chassis-cse-v2。类型为 yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v1
+```
+* 服务级配置:consumerSer.yaml,微服务性选择consumer。类型为 yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v2
+```
+* 版本级配置:consumerIns.yaml,labels: app=demo-java-chassis-cse-v2,environment=,service=consumer,version = 0.0.1。类型为 yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v3
+```
 
   * 应用级配置: cse.v2.test.bar: bar 。 类型为 text。 
   
@@ -95,4 +116,35 @@
       priority: v3
 ```
 
-* 执行 tests-client 里面的集成测试用例 (成功) 
\ No newline at end of file
+* 执行 tests-client 里面的集成测试用例 (成功) 
+* 修改
+  * 应用级consumerApp.yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v10
+```
+
+* 执行 tests-client 里面的集成测试用例 (成功) 
+* 修改
+  * 服务级配置:consumerSer.yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v20
+```
+
+* 执行 tests-client 里面的集成测试用例 (成功)
+
+* 修改
+  * 版本级配置:consumerIns.yaml。
+```yaml
+cse:
+  v2:
+    test:
+      priority1: v30
+```
+
+* 执行 tests-client 里面的集成测试用例 (失败)
\ No newline at end of file
diff --git a/demo/demo-cse-v2/test-client/src/main/java/org/apache/servicecomb/samples/ConsumerConfigIT.java b/demo/demo-cse-v2/test-client/src/main/java/org/apache/servicecomb/samples/ConsumerConfigIT.java
index 18011c4..8d783d6 100644
--- a/demo/demo-cse-v2/test-client/src/main/java/org/apache/servicecomb/samples/ConsumerConfigIT.java
+++ b/demo/demo-cse-v2/test-client/src/main/java/org/apache/servicecomb/samples/ConsumerConfigIT.java
@@ -43,6 +43,8 @@
     TestMgr.check("\"common\"", result);
     result = template.getForObject(Config.GATEWAY_URL + "/config?key=cse.v2.test.extra", String.class);
     TestMgr.check("\"common\"", result);
+    result = template.getForObject(Config.GATEWAY_URL + "/config?key=cse.v2.test.priority1", String.class);
+    TestMgr.check("\"v3\"", result);
   }
 
   private void testFooBar() {
diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java
index 31371cd..f0d1171 100644
--- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java
+++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java
@@ -57,6 +57,8 @@
 
   private static final String ENABLE_SERVICE_CONFIG = "servicecomb.kie.enableServiceConfig";
 
+  private static final String ENABLE_VERSION_CONFIG = "servicecomb.kie.enableVersionConfig";
+
   private static final String ENABLE_CUSTOM_CONFIG = "servicecomb.kie.enableCustomConfig";
 
   public static final String FILE_SOURCE = "servicecomb.config.client.fileSource";
@@ -140,6 +142,10 @@
     return finalConfig.getBoolean(ENABLE_SERVICE_CONFIG, true);
   }
 
+  public boolean enableVersionConfig() {
+    return finalConfig.getBoolean(ENABLE_VERSION_CONFIG, true);
+  }
+
   public boolean enableCustomConfig() {
     return finalConfig.getBoolean(ENABLE_CUSTOM_CONFIG, true);
   }
diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java
index 1c0de54..fbf700e 100644
--- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java
+++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java
@@ -117,7 +117,9 @@
         .setEnableCustomConfig(KieConfig.INSTANCE.enableCustomConfig())
         .setEnableLongPolling(KieConfig.INSTANCE.enableLongPolling())
         .setEnableServiceConfig(KieConfig.INSTANCE.enableServiceConfig())
+        .setEnableVersionConfig(KieConfig.INSTANCE.enableVersionConfig())
         .setEnvironment(KieConfig.INSTANCE.getEnvironment())
+        .setVersion(KieConfig.INSTANCE.getVersion())
         .setPollingWaitInSeconds(KieConfig.INSTANCE.getPollingWaitTime())
         .setProject(KieConfig.INSTANCE.getDomainName())
         .setRefreshIntervalInMillis(KieConfig.INSTANCE.getRefreshInterval())