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

commit 24090b009fbf843c73c134f21785d1c5226b6ace
Author: liubao <[email protected]>
AuthorDate: Fri Jan 8 09:35:56 2021 +0800

    [SCB-2116]fix specification change
---
 .../src/main/resources/application.yml             | 32 ++-----
 governance/README.md                               |  2 +-
 .../servicecomb/governance/MatchersManager.java    | 43 ++--------
 .../PolicyService.java => MicroserviceMeta.java}   | 10 +--
 .../governance/entity/Configurable.java            | 24 +++++-
 .../governance/handler/BulkheadHandler.java        |  5 +-
 .../governance/handler/CircuitBreakerHandler.java  |  4 +-
 .../governance/handler/RateLimitingHandler.java    |  4 +-
 .../governance/handler/RetryHandler.java           |  4 +-
 ...{GovHttpRequest.java => GovernanceRequest.java} | 23 +----
 .../servicecomb/governance/marker/Matcher.java     | 18 ----
 .../governance/marker/RequestProcessor.java        |  2 +-
 .../governance/marker/TrafficMarker.java           | 53 +++---------
 .../governance/policy/AbstractPolicy.java          | 53 +-----------
 .../governance/policy/GovernanceRule.java          | 88 -------------------
 .../servicecomb/governance/policy/Policy.java      | 11 ---
 .../governance/policy/RateLimitingPolicy.java      |  9 --
 .../properties/GovernanceProperties.java           | 31 ++++++-
 .../governance/properties/MatchProperties.java     |  5 --
 .../governance/properties/PolicyProperties.java    |  4 -
 .../governance/service/MatchersService.java        |  4 +-
 .../governance/service/MatchersServiceImpl.java    | 13 +--
 .../governance/service/PolicyServiceImpl.java      | 83 ------------------
 .../servicecomb/governance/FlowControlTest.java    |  4 +-
 .../governance/GovernancePropertiesTest.java       | 31 ++-----
 .../governance/MockMicroserviceMeta.java}          | 23 ++---
 .../servicecomb/governance/OperatorTest.java       | 98 ++++++++++++++++++++--
 governance/src/test/resources/application.yaml     | 35 ++++----
 .../governance/ConsumerGovernanceHandler.java      | 12 ++-
 .../governance/ProviderGovernanceHandler.java      | 15 ++--
 .../governance/ServiceCombMicroserviceMeta.java    | 22 ++---
 31 files changed, 247 insertions(+), 518 deletions(-)

diff --git 
a/demo/demo-zeroconfig-schemadiscovery-registry/demo-zeroconfig-schemadiscovery-registry-client/src/main/resources/application.yml
 
b/demo/demo-zeroconfig-schemadiscovery-registry/demo-zeroconfig-schemadiscovery-registry-client/src/main/resources/application.yml
index 87df014..c43c4ce 100644
--- 
a/demo/demo-zeroconfig-schemadiscovery-registry/demo-zeroconfig-schemadiscovery-registry-client/src/main/resources/application.yml
+++ 
b/demo/demo-zeroconfig-schemadiscovery-registry/demo-zeroconfig-schemadiscovery-registry-client/src/main/resources/application.yml
@@ -46,53 +46,37 @@ servicecomb:
       matches:
         - apiPath:
             exact: "GovernanceEndpoint.hello"
-          name: xx
-      ## services is optional in configuration file
-      services: demo-zeroconfig-schemadiscovery-registry-client
     demo-retry: |
       matches:
         - apiPath:
             exact: "GovernanceEndpoint.retry"
-          name: xx
-      ## services is optional in configuration file
-      services: demo-zeroconfig-schemadiscovery-registry-client
     demo-circuitBreaker: |
       matches:
         - apiPath:
             exact: "GovernanceEndpoint.circuitBreaker"
-          name: xx
-      ## services is optional in configuration file
-      services: demo-zeroconfig-schemadiscovery-registry-client
     demo-bulkhead: |
       matches:
         - apiPath:
             exact: "GovernanceEndpoint.bulkhead"
-          name: xx
-      ## services is optional in configuration file
-      services: demo-zeroconfig-schemadiscovery-registry-client
   rateLimiting:
     demo-rateLimiting: |
-      rules:
-        match: demo-rateLimiting.xx
       rate: 10
-      name: xx
+      ## services is optional in configuration file
+      services: demo-zeroconfig-schemadiscovery-registry-client
   retry:
     demo-retry: |
-      rules:
-        match: demo-retry.xx
       maxAttempts: 3
-      name: xx
+      ## services is optional in configuration file
+      services: demo-zeroconfig-schemadiscovery-registry-client
   circuitBreaker:
     demo-circuitBreaker: |
-      rules:
-        match: demo-circuitBreaker.xx
       minimumNumberOfCalls: 10
       slidingWindowSize: 10
       failureRateThreshold: 20
-      name: xx
+      ## services is optional in configuration file
+      services: demo-zeroconfig-schemadiscovery-registry-client
   bulkhead:
     demo-bulkhead: |
-      rules:
-        match: demo-bulkhead.xx
       maxConcurrentCalls: 5
-      name: xx
\ No newline at end of file
+      ## services is optional in configuration file
+      services: demo-zeroconfig-schemadiscovery-registry-client
\ No newline at end of file
diff --git a/governance/README.md b/governance/README.md
index 8680692..bc6f83e 100644
--- a/governance/README.md
+++ b/governance/README.md
@@ -1,4 +1,4 @@
-# About Deployment Module
+# About Governance Module
 
 Governance module provides an abstraction on how to describe governance 
instructions for commonly used
 different microservice frameworks, like Java Chassis, Go Chassis, Spring 
Cloud, Dubbo, etc. 
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
index 6a7ec0e..821a65e 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/MatchersManager.java
@@ -16,15 +16,12 @@
  */
 package org.apache.servicecomb.governance;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.policy.AbstractPolicy;
 import org.apache.servicecomb.governance.service.MatchersService;
-import org.apache.servicecomb.governance.service.PolicyService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -35,51 +32,27 @@ public class MatchersManager {
   private MatchersService matchersService;
 
   @Autowired
-  private PolicyService policyService;
-
-  @Autowired
   private InvocationContext invocationContext;
 
   public MatchersManager() {
   }
 
-  public <T extends AbstractPolicy> T match(GovHttpRequest request, 
Map<String, T> policies) {
-    List<T> matchedPolicy = new ArrayList<>();
-    List<String> matchedKeys = new ArrayList<>();
-
+  public <T extends AbstractPolicy> T match(GovernanceRequest request, 
Map<String, T> policies) {
     Map<String, Boolean> calculatedMatches = 
invocationContext.getCalculatedMatches();
-    calculatedMatches.forEach((k, v) -> {
-      if (v) {
-        matchedKeys.add(k);
-      }
-    });
 
     for (Entry<String, T> entry : policies.entrySet()) {
       T policy = entry.getValue();
 
-      if (policy.match(matchedKeys)) {
-        matchedPolicy.add(policy);
-        continue;
+      if (calculatedMatches.containsKey(entry.getKey())) {
+        return policy;
       }
 
-      List<String> parsedMatches = policy.getParsedMatch();
-      if (parsedMatches != null) {
-        parsedMatches.stream().forEach(key -> {
-          if (!calculatedMatches.containsKey(key)) {
-            boolean keyMatch = matchersService.checkMatch(request, key);
-            invocationContext.addMatch(key, keyMatch);
-            if (keyMatch) {
-              matchedPolicy.add(policy);
-            }
-          }
-        });
+      boolean keyMatch = matchersService.checkMatch(request, entry.getKey());
+      invocationContext.addMatch(entry.getKey(), keyMatch);
+      if (keyMatch) {
+        return policy;
       }
     }
-
-    if (matchedPolicy.size() > 0) {
-      matchedPolicy.sort(AbstractPolicy::compare);
-      return matchedPolicy.get(0);
-    }
     return null;
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/service/PolicyService.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/MicroserviceMeta.java
similarity index 76%
rename from 
governance/src/main/java/org/apache/servicecomb/governance/service/PolicyService.java
rename to 
governance/src/main/java/org/apache/servicecomb/governance/MicroserviceMeta.java
index c1afeb3..4aac6e6 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/service/PolicyService.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/MicroserviceMeta.java
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.governance.service;
 
-import java.util.List;
-import java.util.Map;
+package org.apache.servicecomb.governance;
 
-import org.apache.servicecomb.governance.policy.Policy;
+public interface MicroserviceMeta {
+  String getName();
 
-public interface PolicyService {
-  Map<String, Policy> getAllPolicies(List<String> mark);
+  String getVersion();
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/entity/Configurable.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/entity/Configurable.java
index 987ddf0..ad15a84 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/entity/Configurable.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/entity/Configurable.java
@@ -20,6 +20,26 @@ package org.apache.servicecomb.governance.entity;
 /**
  * Indicates a object can be configure in configuration file or config center.
  */
-public interface Configurable {
-  boolean isValid();
+public abstract class Configurable {
+  protected String name;
+
+  protected String services;
+
+  public abstract boolean isValid();
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getServices() {
+    return this.services;
+  }
+
+  public void setServices(String services) {
+    this.services = services;
+  }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
index c5b2497..a954355 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Component;
 import io.github.resilience4j.bulkhead.Bulkhead;
 import io.github.resilience4j.bulkhead.BulkheadConfig;
 import io.github.resilience4j.bulkhead.BulkheadRegistry;
-import io.github.resilience4j.decorators.Decorators.DecorateCheckedSupplier;
 
 @Component("BulkheadHandler")
 public class BulkheadHandler extends AbstractGovernanceHandler<Bulkhead, 
BulkheadPolicy> {
@@ -35,7 +34,7 @@ public class BulkheadHandler extends 
AbstractGovernanceHandler<Bulkhead, Bulkhea
 
   @Override
   protected String createKey(BulkheadPolicy policy) {
-    return "servicecomb.bulkhead." + policy.name();
+    return "servicecomb.bulkhead." + policy.getName();
   }
 
   @Override
@@ -53,6 +52,6 @@ public class BulkheadHandler extends 
AbstractGovernanceHandler<Bulkhead, Bulkhea
 
     BulkheadRegistry registry = BulkheadRegistry.of(config);
 
-    return registry.bulkhead(policy.name());
+    return registry.bulkhead(policy.getName());
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
index d041edc..9c7442d 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
@@ -33,7 +33,7 @@ public class CircuitBreakerHandler extends 
AbstractGovernanceHandler<CircuitBrea
 
   @Override
   protected String createKey(CircuitBreakerPolicy policy) {
-    return "servicecomb.circuitBreaker." + policy.name();
+    return "servicecomb.circuitBreaker." + policy.getName();
   }
 
   @Override
@@ -63,6 +63,6 @@ public class CircuitBreakerHandler extends 
AbstractGovernanceHandler<CircuitBrea
         .slidingWindowSize(policy.getSlidingWindowSize())
         .build();
     CircuitBreakerRegistry circuitBreakerRegistry = 
CircuitBreakerRegistry.of(circuitBreakerConfig);
-    return circuitBreakerRegistry.circuitBreaker(policy.name(), 
circuitBreakerConfig);
+    return circuitBreakerRegistry.circuitBreaker(policy.getName(), 
circuitBreakerConfig);
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
index dcdb5d8..22b940e 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
@@ -33,7 +33,7 @@ public class RateLimitingHandler extends 
AbstractGovernanceHandler<RateLimiter,
 
   @Override
   protected String createKey(RateLimitingPolicy policy) {
-    return "servicecomb.rateLimiting." + policy.name();
+    return "servicecomb.rateLimiting." + policy.getName();
   }
 
   @Override
@@ -51,6 +51,6 @@ public class RateLimitingHandler extends 
AbstractGovernanceHandler<RateLimiter,
         .timeoutDuration(Duration.ofMillis(policy.getTimeoutDuration()))
         .build();
     RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config);
-    return rateLimiterRegistry.rateLimiter(policy.name());
+    return rateLimiterRegistry.rateLimiter(policy.getName());
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
index 068bb55..f700e95 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
@@ -43,7 +43,7 @@ public class RetryHandler extends 
AbstractGovernanceHandler<Retry, RetryPolicy>
 
   @Override
   protected String createKey(RetryPolicy policy) {
-    return "servicecomb.retry." + policy.name();
+    return "servicecomb.retry." + policy.getName();
   }
 
   @Override
@@ -65,7 +65,7 @@ public class RetryHandler extends 
AbstractGovernanceHandler<Retry, RetryPolicy>
         .build();
 
     RetryRegistry registry = RetryRegistry.of(config);
-    return registry.retry(retryPolicy.name());
+    return registry.retry(retryPolicy.getName());
   }
 
   private Predicate<Object> getPredicate(List<Integer> statusList) {
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/GovHttpRequest.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/GovernanceRequest.java
similarity index 72%
rename from 
governance/src/main/java/org/apache/servicecomb/governance/marker/GovHttpRequest.java
rename to 
governance/src/main/java/org/apache/servicecomb/governance/marker/GovernanceRequest.java
index 2176ef5..799dd99 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/GovHttpRequest.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/GovernanceRequest.java
@@ -18,34 +18,13 @@ package org.apache.servicecomb.governance.marker;
 
 import java.util.Map;
 
-import org.springframework.util.Assert;
-
-public class GovHttpRequest {
-  private final String serviceName;
-
-  private final String version;
-
+public class GovernanceRequest {
   private Map<String, String> headers;
 
   private String uri;
 
   private String method;
 
-  public GovHttpRequest(String serviceName, String version) {
-    Assert.notNull(serviceName, "serviceName should not be null");
-    Assert.notNull(version, "version should not be null");
-    this.serviceName = serviceName;
-    this.version = version;
-  }
-
-  public String getServiceName() {
-    return serviceName;
-  }
-
-  public String getVersion() {
-    return version;
-  }
-
   public Map<String, String> getHeaders() {
     return headers;
   }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/Matcher.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/Matcher.java
index 6b1b37a..7b4a6c8 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/Matcher.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/Matcher.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.governance.marker;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.governance.marker.operator.RawOperator;
 
 public class Matcher {
@@ -29,15 +28,6 @@ public class Matcher {
 
   private List<String> method;
 
-  private String name;
-
-  public boolean isValid() {
-    if (StringUtils.isEmpty(name)) {
-      return false;
-    }
-    return true;
-  }
-
   public Map<String, RawOperator> getHeaders() {
     return headers;
   }
@@ -61,12 +51,4 @@ public class Matcher {
   public void setMethod(List<String> method) {
     this.method = method;
   }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
index a086c4e..8cf7ddb 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java
@@ -32,7 +32,7 @@ public class RequestProcessor {
   @Autowired
   private Map<String, MatchOperator> operatorMap;
 
-  public boolean match(GovHttpRequest request, Matcher matcher) {
+  public boolean match(GovernanceRequest request, Matcher matcher) {
     if ((matcher.getMethod() != null && 
!matcher.getMethod().contains(request.getMethod())) ||
         (matcher.getApiPath() != null && !operatorMatch(request.getUri(), 
matcher.getApiPath()))) {
       return false;
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
index 90cb6e2..9dbaf4d 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/marker/TrafficMarker.java
@@ -16,39 +16,23 @@
  */
 package org.apache.servicecomb.governance.marker;
 
-import java.util.Arrays;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.governance.entity.Configurable;
 
-public class TrafficMarker implements Configurable {
-
-  private String services;
+public class TrafficMarker extends Configurable {
+  private String name;
 
   private List<Matcher> matches;
 
-  public String getServices() {
-    return services;
-  }
-
   @Override
   public boolean isValid() {
     if (matches == null || matches.isEmpty()) {
       return false;
     }
-    for (Matcher matcher : matches) {
-      if (!matcher.isValid()) {
-        return false;
-      }
-    }
     return true;
   }
 
-  public void setServices(String services) {
-    this.services = services;
-  }
-
   public List<Matcher> getMatches() {
     return matches;
   }
@@ -57,31 +41,18 @@ public class TrafficMarker implements Configurable {
     this.matches = matches;
   }
 
-  public boolean checkMatch(GovHttpRequest govHttpRequest, RequestProcessor 
requestProcessor, String name) {
-    if (!servicesMatch(govHttpRequest)) {
-      return false;
-    }
-
-    return this.matches.stream().anyMatch(match ->
-        match.getName().equals(name) && requestProcessor.match(govHttpRequest, 
match));
+  @Override
+  public String getName() {
+    return name;
   }
 
+  @Override
+  public void setName(String name) {
+    this.name = name;
+  }
 
-  private boolean servicesMatch(GovHttpRequest govHttpRequest) {
-    if (StringUtils.isEmpty(services)) {
-      return true;
-    }
-
-    return Arrays.stream(services.split(",")).anyMatch(ser -> {
-      String[] serviceAndVersion = ser.split(":");
-      if (serviceAndVersion.length == 1) {
-        return govHttpRequest.getServiceName().equals(serviceAndVersion[0]);
-      } else if (serviceAndVersion.length == 2) {
-        return govHttpRequest.getServiceName().equals(serviceAndVersion[0]) && 
govHttpRequest.getVersion()
-            .equals(serviceAndVersion[1]);
-      } else {
-        return false;
-      }
-    });
+  public boolean checkMatch(GovernanceRequest governanceRequest, 
RequestProcessor requestProcessor) {
+    return this.matches.stream().anyMatch(match ->
+        this.name.equals(name) && requestProcessor.match(governanceRequest, 
match));
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/AbstractPolicy.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/AbstractPolicy.java
index 2f2aad5..16f0981 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/AbstractPolicy.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/AbstractPolicy.java
@@ -16,64 +16,15 @@
  */
 package org.apache.servicecomb.governance.policy;
 
-import java.util.List;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.governance.entity.Configurable;
 
-public abstract class AbstractPolicy implements Policy, Configurable {
-
-  protected String name;
-
-  protected GovernanceRule rules;
-
-  public GovernanceRule getRules() {
-    return rules;
-  }
-
-  public void setRules(GovernanceRule rules) {
-    this.rules = rules;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
+public abstract class AbstractPolicy extends Configurable implements Policy {
   @Override
   public boolean isValid() {
     if (StringUtils.isEmpty(name)) {
       return false;
     }
-    if (rules == null) {
-      return false;
-    }
-    return rules.isValid();
-  }
-
-  @Override
-  public boolean match(List<String> items) {
-    if (rules == null) {
-      return false;
-    }
-    return items.stream().anyMatch(item -> rules.match(item));
-  }
-
-  public static int compare(AbstractPolicy policy1, AbstractPolicy policy2) {
-    int p1 = policy1.rules == null ? 0 : policy1.rules.getPrecedence();
-    int p2 = policy2.rules == null ? 0 : policy2.rules.getPrecedence();
-    return p1 - p2;
-  }
-
-  public List<String> getParsedMatch() {
-    if (rules == null) {
-      return null;
-    }
-
-    return rules.getParsedMatch();
-  }
-
-  @Override
-  public String name() {
-    return name;
+    return true;
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/GovernanceRule.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/GovernanceRule.java
deleted file mode 100644
index 480cf55..0000000
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/GovernanceRule.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.governance.policy;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
-public class GovernanceRule {
-  private static final String MATCH_NONE = "none";
-
-  private String match;
-
-  private List<String> parsedMatch;
-
-  private int precedence;
-
-  public String getMatch() {
-    return match;
-  }
-
-  public void setMatch(String match) {
-    this.match = match;
-  }
-
-  public int getPrecedence() {
-    return precedence;
-  }
-
-  public void setPrecedence(int precedence) {
-    this.precedence = precedence;
-  }
-
-  public boolean isValid() {
-    if (StringUtils.isEmpty(match)) {
-      return false;
-    }
-    return true;
-  }
-
-  public boolean match(String name) {
-    if (StringUtils.isEmpty(this.match)) {
-      return false;
-    }
-
-    if (MATCH_NONE.equals(this.match)) {
-      return true;
-    }
-
-    if (this.parsedMatch == null) {
-      this.parsedMatch = Arrays.asList(this.match.split(","));
-    }
-
-    return parsedMatch.contains(name);
-  }
-
-  public List<String> getParsedMatch() {
-    if (StringUtils.isEmpty(this.match)) {
-      return null;
-    }
-
-    if (MATCH_NONE.equals(this.match)) {
-      return null;
-    }
-
-    if (this.parsedMatch == null) {
-      this.parsedMatch = Arrays.asList(this.match.split(","));
-    }
-
-    return parsedMatch;
-  }
-}
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java
index 968312d..361c4b3 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java
@@ -16,17 +16,6 @@
  */
 package org.apache.servicecomb.governance.policy;
 
-import java.util.List;
-
-/**
- * @Author GuoYl123
- * @Date 2020/5/11
- **/
 public interface Policy {
-
-  boolean match(List<String> strings);
-
   String handler();
-
-  String name();
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/RateLimitingPolicy.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/RateLimitingPolicy.java
index 8bb312a..9561659 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/RateLimitingPolicy.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/policy/RateLimitingPolicy.java
@@ -18,15 +18,6 @@ package org.apache.servicecomb.governance.policy;
 
 import org.apache.servicecomb.governance.handler.RateLimitingHandler;
 
-/**
- * resilience4j 采用类似令牌桶的思想,其原理:
- * 每隔limitRefreshPeriod的时间会加入limitForPeriod个新许可
- * 如果获取不到新的许可(已经触发限流),当前线程会park,最多等待timeoutDuration的时间
- * 采用默认单位为ms
- *
- * @Author GuoYl123
- * @Date 2020/5/11
- **/
 public class RateLimitingPolicy extends AbstractPolicy {
 
   public static final int DEFAULT_TIMEOUT_DURATION = 0;
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/GovernanceProperties.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/GovernanceProperties.java
index 695adb6..1908ba0 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/GovernanceProperties.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/GovernanceProperties.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.governance.properties;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -23,6 +24,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.apache.servicecomb.governance.MicroserviceMeta;
 import org.apache.servicecomb.governance.entity.Configurable;
 import org.apache.servicecomb.governance.event.ConfigurationChangedEvent;
 import org.apache.servicecomb.governance.event.EventManager;
@@ -55,6 +57,9 @@ public abstract class GovernanceProperties<T extends 
Configurable> implements In
   @Autowired
   protected Environment environment;
 
+  @Autowired
+  private MicroserviceMeta microserviceMeta;
+
   protected Map<String, T> parsedEntity;
 
   protected Class<T> entityClass;
@@ -153,8 +158,6 @@ public abstract class GovernanceProperties<T extends 
Configurable> implements In
 
   protected abstract Class<T> getEntityClass();
 
-  protected abstract void setName(T value, String key);
-
   protected T parseEntityItem(String key, String value) {
     if (StringUtils.isEmpty(value)) {
       return null;
@@ -163,16 +166,38 @@ public abstract class GovernanceProperties<T extends 
Configurable> implements In
     try {
       Yaml entityParser = new Yaml(new Constructor(new 
TypeDescription(entityClass, entityClass)), representer);
       T result = entityParser.loadAs(value, entityClass);
-      setName(result, key);
+      result.setName(key);
 
       if (!result.isValid()) {
         LOGGER.warn("Entity configuration is not valid and ignored. Key [{}], 
value [{}]", key, value);
         return null;
       }
+      if (!servicesMatch(result.getServices())) {
+        LOGGER.info("Configuration belongs to other service is ignored. Key 
[{}]", key);
+        return null;
+      }
       return result;
     } catch (YAMLException e) {
       LOGGER.error("governance config yaml is illegal : {}", e.getMessage());
     }
     return null;
   }
+
+  private boolean servicesMatch(String services) {
+    if (StringUtils.isEmpty(services)) {
+      return true;
+    }
+
+    return Arrays.stream(services.split(",")).anyMatch(ser -> {
+      String[] serviceAndVersion = ser.split(":");
+      if (serviceAndVersion.length == 1) {
+        return microserviceMeta.getName().equals(serviceAndVersion[0]);
+      } else if (serviceAndVersion.length == 2) {
+        return microserviceMeta.getName().equals(serviceAndVersion[0]) && 
microserviceMeta.getVersion()
+            .equals(serviceAndVersion[1]);
+      } else {
+        return false;
+      }
+    });
+  }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
index 7a2a5ae..3188f90 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
@@ -31,9 +31,4 @@ public class MatchProperties extends 
GovernanceProperties<TrafficMarker> {
   public Class<TrafficMarker> getEntityClass() {
     return TrafficMarker.class;
   }
-
-  @Override
-  protected void setName(TrafficMarker value, String key) {
-    // do nothing
-  }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/PolicyProperties.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/PolicyProperties.java
index 73a3a07..4bd53d8 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/PolicyProperties.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/properties/PolicyProperties.java
@@ -23,8 +23,4 @@ public abstract class PolicyProperties<T extends 
AbstractPolicy> extends Governa
   protected PolicyProperties(String key) {
     super(key);
   }
-
-  protected void setName(T value, String key) {
-    value.setName(key);
-  }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersService.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersService.java
index bb01422..43d2756 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersService.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersService.java
@@ -16,8 +16,8 @@
  */
 package org.apache.servicecomb.governance.service;
 
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 
 public interface MatchersService {
-  boolean checkMatch(GovHttpRequest govHttpRequest, String key);
+  boolean checkMatch(GovernanceRequest governanceRequest, String key);
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
index 0df3159..5a6ca5b 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
+++ 
b/governance/src/main/java/org/apache/servicecomb/governance/service/MatchersServiceImpl.java
@@ -19,7 +19,7 @@ package org.apache.servicecomb.governance.service;
 
 import java.util.Map;
 
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.marker.RequestProcessor;
 import org.apache.servicecomb.governance.marker.TrafficMarker;
 import org.apache.servicecomb.governance.properties.MatchProperties;
@@ -35,20 +35,15 @@ public class MatchersServiceImpl implements MatchersService 
{
   private MatchProperties matchProperties;
 
   @Override
-  public boolean checkMatch(GovHttpRequest govHttpRequest, String key) {
+  public boolean checkMatch(GovernanceRequest governanceRequest, String key) {
     Map<String, TrafficMarker> parsedEntity = 
matchProperties.getParsedEntity();
 
-    String[] subKeys = key.split("\\.");
-    if (subKeys.length != 2) {
-      return false;
-    }
-
-    TrafficMarker trafficMarker = parsedEntity.get(subKeys[0]);
+    TrafficMarker trafficMarker = parsedEntity.get(key);
 
     if (trafficMarker == null) {
       return false;
     }
 
-    return trafficMarker.checkMatch(govHttpRequest, requestProcessor, 
subKeys[1]);
+    return trafficMarker.checkMatch(governanceRequest, requestProcessor);
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/service/PolicyServiceImpl.java
 
b/governance/src/main/java/org/apache/servicecomb/governance/service/PolicyServiceImpl.java
deleted file mode 100644
index 47fa0d6..0000000
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/service/PolicyServiceImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.governance.service;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.servicecomb.governance.policy.AbstractPolicy;
-import org.apache.servicecomb.governance.policy.Policy;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import org.apache.servicecomb.governance.properties.GovernanceProperties;
-
-@Component
-public class PolicyServiceImpl implements PolicyService {
-
-  private static final String MATCH_NONE = "none";
-
-  @Autowired
-  private List<GovernanceProperties<? extends AbstractPolicy>> propertiesList;
-
-  @Override
-  public Map<String, Policy> getAllPolicies(List<String> marks) {
-    Map<String, Policy> policies = new HashMap<>();
-
-    if (CollectionUtils.isEmpty(marks)) {
-      return policies;
-    }
-
-    for (GovernanceProperties<? extends AbstractPolicy> properties : 
propertiesList) {
-      Policy policy = match(properties.getParsedEntity(), marks);
-      if (policy != null) {
-        policies.put(properties.getClass().getName(), policy);
-      }
-    }
-    return policies;
-  }
-
-  private <T extends AbstractPolicy> Policy match(Map<String, T> policies, 
List<String> marks) {
-    List<AbstractPolicy> policyList = new ArrayList<>();
-    AbstractPolicy defaultPolicy = null;
-    for (Entry<String, T> entry : policies.entrySet()) {
-      T policy = entry.getValue();
-
-      if (policy.getRules() != null && 
MATCH_NONE.equals(policy.getRules().getMatch())) {
-        defaultPolicy = entry.getValue();
-        defaultPolicy.setName(entry.getKey());
-      }
-
-      if (policy.match(marks)) {
-        AbstractPolicy policyResult;
-        policyResult = entry.getValue();
-        policyResult.setName(entry.getKey());
-        policyList.add(policyResult);
-      }
-    }
-    if (!policyList.isEmpty()) {
-      policyList.sort(Comparator.comparingInt(p -> 
p.getRules().getPrecedence()));
-      return policyList.get(0);
-    }
-    return defaultPolicy;
-  }
-}
diff --git 
a/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
 
b/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
index e16dafa..7191c0f 100644
--- 
a/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
+++ 
b/governance/src/test/java/org/apache/servicecomb/governance/FlowControlTest.java
@@ -22,7 +22,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.servicecomb.governance.handler.RateLimitingHandler;
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.policy.RateLimitingPolicy;
 import org.apache.servicecomb.governance.properties.RateLimitProperties;
 import org.junit.Assert;
@@ -56,7 +56,7 @@ public class FlowControlTest {
       return "test";
     });
 
-    GovHttpRequest request = new GovHttpRequest("testService", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/hello");
     RateLimitingPolicy policy = matchersManager.match(request, 
rateLimitProperties.getParsedEntity());
     Assert.assertNotNull(policy);
diff --git 
a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
 
b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
index fd0569c..aa8a95e 100644
--- 
a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
+++ 
b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
@@ -120,7 +120,6 @@ public class GovernancePropertiesTest {
     List<Matcher> matchers = demoRateLimiting.getMatches();
     Assert.assertEquals(1, matchers.size());
     Matcher matcher = matchers.get(0);
-    Assert.assertEquals("match0", matcher.getName());
     Assert.assertEquals("/hello", matcher.getApiPath().get("exact"));
   }
 
@@ -143,27 +142,21 @@ public class GovernancePropertiesTest {
     List<Matcher> matchers = demoRateLimiting.getMatches();
     Assert.assertEquals(1, matchers.size());
     Matcher matcher = matchers.get(0);
-    Assert.assertEquals("match0", matcher.getName());
     Assert.assertEquals("/hello2", matcher.getApiPath().get("exact"));
 
     demoRateLimiting = markers.get("demo-rateLimiting2");
     matchers = demoRateLimiting.getMatches();
     Assert.assertEquals(1, matchers.size());
     matcher = matchers.get(0);
-    Assert.assertEquals("match0", matcher.getName());
     Assert.assertEquals("/hello2", matcher.getApiPath().get("exact"));
   }
 
   @Test
   public void test_bulkhead_properties_changed() {
-    dynamicValues.put("servicecomb.bulkhead.bulkhead0", "rules:\n"
-        + "  match: demo-bulkhead.xx\n"
-        + "  precedence: 100\n"
+    dynamicValues.put("servicecomb.bulkhead.demo-bulkhead", "rules:\n"
         + "maxConcurrentCalls: 2\n"
         + "maxWaitDuration: 2000");
     dynamicValues.put("servicecomb.bulkhead.bulkhead1", "rules:\n"
-        + "  match: demo-bulkhead.xx\n"
-        + "  precedence: 100\n"
         + "maxConcurrentCalls: 3\n"
         + "maxWaitDuration: 3000");
 
@@ -171,60 +164,48 @@ public class GovernancePropertiesTest {
 
     Map<String, BulkheadPolicy> policies = 
bulkheadProperties.getParsedEntity();
     Assert.assertEquals(2, policies.size());
-    BulkheadPolicy policy = policies.get("bulkhead0");
+    BulkheadPolicy policy = policies.get("demo-bulkhead");
     Assert.assertEquals(2, policy.getMaxConcurrentCalls());
     Assert.assertEquals(2000, policy.getMaxWaitDuration());
-    Assert.assertEquals("demo-bulkhead.xx", policy.getRules().getMatch());
-    Assert.assertEquals(100, policy.getRules().getPrecedence());
 
     policies = bulkheadProperties.getParsedEntity();
     Assert.assertEquals(2, policies.size());
     policy = policies.get("bulkhead1");
     Assert.assertEquals(3, policy.getMaxConcurrentCalls());
     Assert.assertEquals(3000, policy.getMaxWaitDuration());
-    Assert.assertEquals("demo-bulkhead.xx", policy.getRules().getMatch());
-    Assert.assertEquals(100, policy.getRules().getPrecedence());
   }
 
   @Test
   public void test_bulkhead_properties_successfully_loaded() {
     Map<String, BulkheadPolicy> policies = 
bulkheadProperties.getParsedEntity();
     Assert.assertEquals(1, policies.size());
-    BulkheadPolicy policy = policies.get("bulkhead0");
+    BulkheadPolicy policy = policies.get("demo-bulkhead");
     Assert.assertEquals(1, policy.getMaxConcurrentCalls());
     Assert.assertEquals(3000, policy.getMaxWaitDuration());
-    Assert.assertEquals("demo-bulkhead.xx", policy.getRules().getMatch());
-    Assert.assertEquals(100, policy.getRules().getPrecedence());
   }
 
   @Test
   public void test_circuit_breaker_properties_successfully_loaded() {
     Map<String, CircuitBreakerPolicy> policies = 
circuitBreakerProperties.getParsedEntity();
     Assert.assertEquals(1, policies.size());
-    CircuitBreakerPolicy policy = policies.get("circuitBreaker0");
+    CircuitBreakerPolicy policy = policies.get("demo-circuitBreaker");
     Assert.assertEquals(2, policy.getMinimumNumberOfCalls());
     Assert.assertEquals(2, policy.getSlidingWindowSize());
-    Assert.assertEquals("demo-circuitBreaker.xx", 
policy.getRules().getMatch());
-    Assert.assertEquals(0, policy.getRules().getPrecedence());
   }
 
   @Test
   public void test_rate_limit_properties_successfully_loaded() {
     Map<String, RateLimitingPolicy> policies = 
rateLimitProperties.getParsedEntity();
     Assert.assertEquals(1, policies.size());
-    RateLimitingPolicy policy = policies.get("rateLimiting0");
+    RateLimitingPolicy policy = policies.get("demo-rateLimiting");
     Assert.assertEquals(1, policy.getRate());
-    Assert.assertEquals("demo-rateLimiting.match0", 
policy.getRules().getMatch());
-    Assert.assertEquals(0, policy.getRules().getPrecedence());
   }
 
   @Test
   public void test_retry_properties_successfully_loaded() {
     Map<String, RetryPolicy> policies = retryProperties.getParsedEntity();
     Assert.assertEquals(1, policies.size());
-    RetryPolicy policy = policies.get("retry0");
+    RetryPolicy policy = policies.get("demo-retry");
     Assert.assertEquals(3, policy.getMaxAttempts());
-    Assert.assertEquals("demo-retry.xx", policy.getRules().getMatch());
-    Assert.assertEquals(0, policy.getRules().getPrecedence());
   }
 }
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java 
b/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
similarity index 73%
copy from 
governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java
copy to 
governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
index 968312d..552c520 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/policy/Policy.java
+++ 
b/governance/src/test/java/org/apache/servicecomb/governance/MockMicroserviceMeta.java
@@ -14,19 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.governance.policy;
 
-import java.util.List;
+package org.apache.servicecomb.governance;
 
-/**
- * @Author GuoYl123
- * @Date 2020/5/11
- **/
-public interface Policy {
+import org.springframework.stereotype.Component;
 
-  boolean match(List<String> strings);
+@Component
+public class MockMicroserviceMeta implements MicroserviceMeta {
+  @Override
+  public String getName() {
+    return "myself";
+  }
 
-  String handler();
-
-  String name();
+  @Override
+  public String getVersion() {
+    return "1.0";
+  }
 }
diff --git 
a/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java 
b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
index 40d27c9..63e65ed 100644
--- 
a/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
+++ 
b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java
@@ -21,7 +21,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.marker.Matcher;
 import org.apache.servicecomb.governance.marker.RequestProcessor;
 import org.apache.servicecomb.governance.marker.operator.RawOperator;
@@ -41,7 +41,7 @@ public class OperatorTest {
 
   @Test
   public void test_exact_api_path_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -52,7 +52,7 @@ public class OperatorTest {
 
   @Test
   public void test_prefix_api_path_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead/hello");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -63,7 +63,7 @@ public class OperatorTest {
 
   @Test
   public void test_prefix_api_path_not_match_null() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead/hello");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -74,7 +74,7 @@ public class OperatorTest {
 
   @Test
   public void test_suffix_api_path_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/api/bulkhead");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -85,7 +85,7 @@ public class OperatorTest {
 
   @Test
   public void test_suffix_api_path_not_match_null() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/api/bulkhead");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -96,7 +96,7 @@ public class OperatorTest {
 
   @Test
   public void test_exact_api_path_not_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead/");
     Matcher matcher = new Matcher();
     RawOperator apiPath = new RawOperator();
@@ -116,7 +116,7 @@ public class OperatorTest {
 
   @Test
   public void test_exact_api_path_match_header_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead");
     request.setMethod("GET");
     Map<String, String> reqHeaders = new HashMap<>();
@@ -137,7 +137,7 @@ public class OperatorTest {
 
   @Test
   public void test_exact_api_path_match_header_not_match() {
-    GovHttpRequest request = new GovHttpRequest("service", "1.0");
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri("/bulkhead");
     request.setMethod("GET");
     Map<String, String> reqHeaders = new HashMap<>();
@@ -159,4 +159,84 @@ public class OperatorTest {
     request.setHeaders(reqHeaders);
     Assert.assertFalse(requestProcessor.match(request, matcher));
   }
+
+  @Test
+  public void test_compare_header_match() {
+    GovernanceRequest request = new GovernanceRequest();
+    Map<String, String> reqHeaders = new HashMap<>();
+    reqHeaders.put("header1", "100");
+    request.setHeaders(reqHeaders);
+    Matcher matcher = new Matcher();
+    Map<String, RawOperator> headers = new HashMap<>();
+
+    RawOperator header1 = new RawOperator();
+    header1.put("compare", ">10");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertTrue(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", ">=10");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertTrue(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "<1000");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertTrue(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "<=1000");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertTrue(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "=100");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertTrue(requestProcessor.match(request, matcher));
+  }
+
+  @Test
+  public void test_compare_header_not_match() {
+    GovernanceRequest request = new GovernanceRequest();
+    Map<String, String> reqHeaders = new HashMap<>();
+    reqHeaders.put("header1", "100");
+    request.setHeaders(reqHeaders);
+    Matcher matcher = new Matcher();
+    Map<String, RawOperator> headers = new HashMap<>();
+
+    RawOperator header1 = new RawOperator();
+    header1.put("compare", ">1000");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertFalse(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", ">=1000");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertFalse(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "<10");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertFalse(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "<=10");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertFalse(requestProcessor.match(request, matcher));
+
+    header1 = new RawOperator();
+    header1.put("compare", "=200");
+    headers.put("header1", header1);
+    matcher.setHeaders(headers);
+    Assert.assertFalse(requestProcessor.match(request, matcher));
+  }
 }
diff --git a/governance/src/test/resources/application.yaml 
b/governance/src/test/resources/application.yaml
index db4ff33..9ac6a00 100644
--- a/governance/src/test/resources/application.yaml
+++ b/governance/src/test/resources/application.yaml
@@ -21,56 +21,53 @@ servicecomb:
       matches:
         - apiPath:
             exact: "/hello"
-          name: match0
     wrong-name-inogred: |
       wrong: some
     demo-retry: |
       matches:
         - apiPath:
             exact: "/retry"
-          name: xx
     demo-circuitBreaker: |
       matches:
         - apiPath:
             exact: "/circuitBreaker"
-          name: xx
     demo-bulkhead: |
       matches:
         - apiPath:
             exact: "/bulkhead"
-          name: xx
+    demo-bulkhead-other: |
+      matches:
+        - apiPath:
+          exact: "/bulkhead"
+      services: other:1.0
   rateLimiting:
-    rateLimiting0: |
-      rules:
-        match: demo-rateLimiting.match0
+    demo-rateLimiting: |
       rate: 1
     wrongIngored: |
       rate: 0
   retry:
-    retry0: |
-      rules:
-        match: demo-retry.xx
+    demo-retry: |
       maxAttempts: 3
     wrongIngored: |
-      rules:
-        wrong: 0
+      maxAttempts: -1
   circuitBreaker:
-    circuitBreaker0: |
-      rules:
-        match: demo-circuitBreaker.xx
+    demo-circuitBreaker: |
       minimumNumberOfCalls: 2
       slidingWindowSize: 2
+      services: myself:1.0,other
     wrongIngored: |
       rules:
         match: demo-circuitBreaker.xx
       minimumNumberOfCalls: -1
   bulkhead:
-    bulkhead0: |
-      rules:
-        match: demo-bulkhead.xx
-        precedence: 100
+    demo-bulkhead: |
+      maxConcurrentCalls: 1
+      maxWaitDuration: 3000
+      services: myself:1.0
+    demo-bulkhead-other: |
       maxConcurrentCalls: 1
       maxWaitDuration: 3000
+      services: other:1.0
     wrongIngored: |
       rules:
         match: demo-bulkhead.xx
diff --git 
a/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ConsumerGovernanceHandler.java
 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ConsumerGovernanceHandler.java
index 8443e73..bd9af9b 100644
--- 
a/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ConsumerGovernanceHandler.java
+++ 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ConsumerGovernanceHandler.java
@@ -33,10 +33,9 @@ import 
org.apache.servicecomb.core.provider.consumer.SyncResponseExecutor;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.governance.MatchersManager;
 import org.apache.servicecomb.governance.handler.RetryHandler;
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.policy.RetryPolicy;
 import org.apache.servicecomb.governance.properties.RetryProperties;
-import org.apache.servicecomb.registry.RegistrationManager;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.slf4j.Logger;
@@ -70,7 +69,7 @@ public class ConsumerGovernanceHandler implements Handler {
   public void handle(Invocation invocation, AsyncResponse asyncResp) throws 
Exception {
     Supplier<CompletionStage<Response>> next = 
createBusinessCompletionStageSupplier(invocation);
     DecorateCompletionStage<Response> dcs = Decorators.ofCompletionStage(next);
-    GovHttpRequest request = createGovHttpRequest(invocation);
+    GovernanceRequest request = createGovHttpRequest(invocation);
 
     try {
       ServiceCombInvocationContext.setInvocationContext(invocation);
@@ -117,7 +116,7 @@ public class ConsumerGovernanceHandler implements Handler {
     });
   }
 
-  private void addRetry(DecorateCompletionStage<Response> dcs, GovHttpRequest 
request) {
+  private void addRetry(DecorateCompletionStage<Response> dcs, 
GovernanceRequest request) {
     RetryPolicy retryPolicy = matchersManager.match(request, 
retryProperties.getParsedEntity());
     if (retryPolicy != null) {
       dcs.withRetry(retryHandler.getActuator(retryPolicy), RETRY_POOL);
@@ -146,9 +145,8 @@ public class ConsumerGovernanceHandler implements Handler {
     };
   }
 
-  private GovHttpRequest createGovHttpRequest(Invocation invocation) {
-    GovHttpRequest request = new 
GovHttpRequest(RegistrationManager.INSTANCE.getMicroservice().getServiceName(),
-        RegistrationManager.INSTANCE.getMicroservice().getVersion());
+  private GovernanceRequest createGovHttpRequest(Invocation invocation) {
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri(invocation.getSchemaId() + "." + 
invocation.getOperationName());
     request.setMethod(invocation.getOperationMeta().getHttpMethod());
     request.setHeaders(invocation.getContext());
diff --git 
a/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ProviderGovernanceHandler.java
 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ProviderGovernanceHandler.java
index b3623c3..87106b5 100644
--- 
a/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ProviderGovernanceHandler.java
+++ 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ProviderGovernanceHandler.java
@@ -28,7 +28,7 @@ import org.apache.servicecomb.governance.MatchersManager;
 import org.apache.servicecomb.governance.handler.BulkheadHandler;
 import org.apache.servicecomb.governance.handler.CircuitBreakerHandler;
 import org.apache.servicecomb.governance.handler.RateLimitingHandler;
-import org.apache.servicecomb.governance.marker.GovHttpRequest;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
 import org.apache.servicecomb.governance.policy.BulkheadPolicy;
 import org.apache.servicecomb.governance.policy.CircuitBreakerPolicy;
 import org.apache.servicecomb.governance.policy.RateLimitingPolicy;
@@ -71,7 +71,7 @@ public class ProviderGovernanceHandler implements Handler {
 
     Supplier<CompletionStage<Response>> next = 
createBusinessCompletionStageSupplier(invocation);
     DecorateCompletionStage<Response> dcs = Decorators.ofCompletionStage(next);
-    GovHttpRequest request = createGovHttpRequest(invocation);
+    GovernanceRequest request = createGovHttpRequest(invocation);
 
     try {
       ServiceCombInvocationContext.setInvocationContext(invocation);
@@ -108,14 +108,14 @@ public class ProviderGovernanceHandler implements Handler 
{
     });
   }
 
-  private void addBulkhead(DecorateCompletionStage<Response> dcs, 
GovHttpRequest request) {
+  private void addBulkhead(DecorateCompletionStage<Response> dcs, 
GovernanceRequest request) {
     BulkheadPolicy bulkheadPolicy = matchersManager.match(request, 
bulkheadProperties.getParsedEntity());
     if (bulkheadPolicy != null) {
       dcs.withBulkhead(bulkheadHandler.getActuator(bulkheadPolicy));
     }
   }
 
-  private void addCircuitBreaker(DecorateCompletionStage<Response> dcs, 
GovHttpRequest request) {
+  private void addCircuitBreaker(DecorateCompletionStage<Response> dcs, 
GovernanceRequest request) {
     CircuitBreakerPolicy circuitBreakerPolicy = matchersManager
         .match(request, circuitBreakerProperties.getParsedEntity());
     if (circuitBreakerPolicy != null) {
@@ -123,7 +123,7 @@ public class ProviderGovernanceHandler implements Handler {
     }
   }
 
-  private void addRateLimiting(DecorateCompletionStage<Response> dcs, 
GovHttpRequest request) {
+  private void addRateLimiting(DecorateCompletionStage<Response> dcs, 
GovernanceRequest request) {
     RateLimitingPolicy rateLimitingPolicy = matchersManager.match(request, 
rateLimitProperties.getParsedEntity());
     if (rateLimitingPolicy != null) {
       dcs.withRateLimiter(rateLimitingHandler.getActuator(rateLimitingPolicy));
@@ -151,9 +151,8 @@ public class ProviderGovernanceHandler implements Handler {
     };
   }
 
-  private GovHttpRequest createGovHttpRequest(Invocation invocation) {
-    GovHttpRequest request = new 
GovHttpRequest(RegistrationManager.INSTANCE.getMicroservice().getServiceName(),
-        RegistrationManager.INSTANCE.getMicroservice().getVersion());
+  private GovernanceRequest createGovHttpRequest(Invocation invocation) {
+    GovernanceRequest request = new GovernanceRequest();
     request.setUri(invocation.getSchemaId() + "." + 
invocation.getOperationName());
     request.setMethod(invocation.getOperationMeta().getHttpMethod());
     request.setHeaders(invocation.getContext());
diff --git 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ServiceCombMicroserviceMeta.java
similarity index 64%
copy from 
governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
copy to 
handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ServiceCombMicroserviceMeta.java
index 7a2a5ae..62a9b54 100644
--- 
a/governance/src/main/java/org/apache/servicecomb/governance/properties/MatchProperties.java
+++ 
b/handlers/handler-governance/src/main/java/org/apache/servicecomb/handler/governance/ServiceCombMicroserviceMeta.java
@@ -14,26 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.governance.properties;
 
-import org.apache.servicecomb.governance.marker.TrafficMarker;
+package org.apache.servicecomb.handler.governance;
+
+import org.apache.servicecomb.governance.MicroserviceMeta;
+import org.apache.servicecomb.registry.RegistrationManager;
 import org.springframework.stereotype.Component;
 
 @Component
-public class MatchProperties extends GovernanceProperties<TrafficMarker> {
-  public static final String MATCH_POLICY_KEY = "servicecomb.matchGroup";
-
-  public MatchProperties() {
-    super(MATCH_POLICY_KEY);
-  }
-
+public class ServiceCombMicroserviceMeta implements MicroserviceMeta {
   @Override
-  public Class<TrafficMarker> getEntityClass() {
-    return TrafficMarker.class;
+  public String getName() {
+    return RegistrationManager.INSTANCE.getMicroservice().getServiceName();
   }
 
   @Override
-  protected void setName(TrafficMarker value, String key) {
-    // do nothing
+  public String getVersion() {
+    return RegistrationManager.INSTANCE.getMicroservice().getVersion();
   }
 }

Reply via email to