use of org.apache.servicecomb.governance.marker.GovernanceRequest in project java-chassis by ServiceComb.
the class MatchType method createGovHttpRequest.
public static GovernanceRequest createGovHttpRequest(Invocation invocation) {
GovernanceRequest request = new GovernanceRequest();
if (MatchType.REST.equalsIgnoreCase(invocation.getOperationMeta().getConfig().getGovernanceMatchType())) {
if (invocation.isConsumer()) {
request.setUri(invocation.getSchemaMeta().getSwagger().getBasePath() + invocation.getOperationMeta().getOperationPath());
request.setMethod(invocation.getOperationMeta().getHttpMethod());
request.setHeaders(getHeaderMap(invocation, true));
return request;
}
request.setUri(invocation.getRequestEx().getRequestURI());
request.setMethod(invocation.getRequestEx().getMethod());
request.setHeaders(getHeaderMap(invocation, false));
return request;
}
if (invocation.isConsumer()) {
request.setUri(invocation.getOperationMeta().getMicroserviceQualifiedName());
} else {
request.setUri(invocation.getOperationMeta().getSchemaQualifiedName());
}
request.setMethod(invocation.getOperationMeta().getHttpMethod());
request.setHeaders(getHeaderMap(invocation, true));
return request;
}
use of org.apache.servicecomb.governance.marker.GovernanceRequest in project java-chassis by ServiceComb.
the class OperatorTest method test_exact_api_path_match_header_not_match.
@Test
public void test_exact_api_path_match_header_not_match() {
GovernanceRequest request = new GovernanceRequest();
request.setUri("/bulkhead");
request.setMethod("GET");
Map<String, String> reqHeaders = new HashMap<>();
reqHeaders.put("header1", "value2");
request.setHeaders(reqHeaders);
Matcher matcher = new Matcher();
RawOperator apiPath = new RawOperator();
apiPath.put("exact", "/bulkhead");
matcher.setApiPath(apiPath);
matcher.setMethod(Arrays.asList("GET"));
Map<String, RawOperator> headers = new HashMap<>();
RawOperator header1 = new RawOperator();
header1.put("exact", "value1");
headers.put("header1", header1);
matcher.setHeaders(headers);
Assert.assertFalse(requestProcessor.match(request, matcher));
reqHeaders.clear();
request.setHeaders(reqHeaders);
Assert.assertFalse(requestProcessor.match(request, matcher));
}
use of org.apache.servicecomb.governance.marker.GovernanceRequest in project java-chassis by ServiceComb.
the class OperatorTest method test_exact_api_path_match.
@Test
public void test_exact_api_path_match() {
GovernanceRequest request = new GovernanceRequest();
request.setUri("/bulkhead");
Matcher matcher = new Matcher();
RawOperator apiPath = new RawOperator();
apiPath.put("exact", "/bulkhead");
matcher.setApiPath(apiPath);
Assert.assertTrue(requestProcessor.match(request, matcher));
}
use of org.apache.servicecomb.governance.marker.GovernanceRequest in project java-chassis by ServiceComb.
the class OperatorTest method test_unknown_operator.
@Test
public void test_unknown_operator() {
GovernanceRequest request = new GovernanceRequest();
request.setUri("/test");
Matcher matcher = new Matcher();
RawOperator apiPath = new RawOperator();
apiPath.put("unknown", "/test");
matcher.setApiPath(apiPath);
Assert.assertFalse(requestProcessor.match(request, matcher));
}
use of org.apache.servicecomb.governance.marker.GovernanceRequest in project java-chassis by ServiceComb.
the class ProviderGovernanceHandler method handle.
@Override
public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
Supplier<CompletionStage<Response>> next = createBusinessCompletionStageSupplier(invocation);
DecorateCompletionStage<Response> dcs = Decorators.ofCompletionStage(next);
GovernanceRequest request = MatchType.createGovHttpRequest(invocation);
try {
ServiceCombInvocationContext.setInvocationContext(invocation);
addRateLimiting(dcs, request);
addCircuitBreaker(dcs, request);
addBulkhead(dcs, request);
} finally {
ServiceCombInvocationContext.removeInvocationContext();
}
dcs.get().whenComplete((r, e) -> {
if (e == null) {
asyncResp.complete(r);
return;
}
if (e instanceof RequestNotPermitted) {
asyncResp.complete(Response.failResp(new InvocationException(429, "rate limited.", new CommonExceptionData("rate limited."))));
LOGGER.warn("the request is rate limit by policy : {}", e.getMessage());
} else if (e instanceof CallNotPermittedException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "circuitBreaker is open.", new CommonExceptionData("circuitBreaker is open."))));
LOGGER.warn("circuitBreaker is open by policy : {}", e.getMessage());
} else if (e instanceof BulkheadFullException) {
asyncResp.complete(Response.failResp(new InvocationException(429, "bulkhead is full and does not permit further calls.", new CommonExceptionData("bulkhead is full and does not permit further calls."))));
LOGGER.warn("bulkhead is full and does not permit further calls by policy : {}", e.getMessage());
} else {
asyncResp.complete(Response.createProducerFail(e));
}
});
}
Aggregations