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