diff --git a/pom.xml b/pom.xml
index 2bf73728..1e856638 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,14 +5,13 @@
io.revolver
dropwizard-revolver
- 2.0.1
+ 2.0.3-SNAPSHOT
revolver-model
resilience4j
- sentinel
revolver-core
revolver-server
- revolver-hystrix
+ revolver-vertx
pom
diff --git a/resilience4j/pom.xml b/resilience4j/pom.xml
index 6588c8f0..38802a37 100644
--- a/resilience4j/pom.xml
+++ b/resilience4j/pom.xml
@@ -5,7 +5,7 @@
dropwizard-revolver
io.revolver
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
4.0.0
@@ -23,12 +23,12 @@
io.revolver
revolver-model
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
io.revolver
revolver-core
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/revolver-core/pom.xml b/revolver-core/pom.xml
index 9cc05638..27bee2f6 100644
--- a/revolver-core/pom.xml
+++ b/revolver-core/pom.xml
@@ -5,7 +5,7 @@
dropwizard-revolver
io.revolver
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
4.0.0
@@ -15,7 +15,7 @@
io.revolver
revolver-model
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
io.appform.commonutils
diff --git a/revolver-core/src/main/java/io/dropwizard/revolver/core/RevolverCommand.java b/revolver-core/src/main/java/io/dropwizard/revolver/core/RevolverCommand.java
index ebc0381e..51a6d577 100644
--- a/revolver-core/src/main/java/io/dropwizard/revolver/core/RevolverCommand.java
+++ b/revolver-core/src/main/java/io/dropwizard/revolver/core/RevolverCommand.java
@@ -79,6 +79,7 @@ public ResponseType execute(RequestType request)
.getHandler(revolverExecutorType);
response = (ResponseType) revolverCommandHandler.executeSync(this, normalizedRequest);
+ log.info("RevolverResponse : {}", response);
if (log.isDebugEnabled()) {
log.debug("Command response: " + response);
}
diff --git a/revolver-hystrix/pom.xml b/revolver-hystrix/pom.xml
index f272aab5..8ac0dc18 100644
--- a/revolver-hystrix/pom.xml
+++ b/revolver-hystrix/pom.xml
@@ -5,7 +5,7 @@
dropwizard-revolver
io.revolver
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
4.0.0
@@ -20,12 +20,12 @@
io.revolver
revolver-model
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
io.revolver
revolver-core
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
diff --git a/revolver-model/pom.xml b/revolver-model/pom.xml
index cb167c66..591bb0e9 100644
--- a/revolver-model/pom.xml
+++ b/revolver-model/pom.xml
@@ -5,11 +5,23 @@
dropwizard-revolver
io.revolver
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
4.0.0
revolver-model
+
+ 3.8.4
+
+
+
+
+ io.vertx
+ vertx-web
+ ${vertex.version}
+
+
+
\ No newline at end of file
diff --git a/revolver-model/src/main/java/io/dropwizard/revolver/http/model/RevolverHttpRequest.java b/revolver-model/src/main/java/io/dropwizard/revolver/http/model/RevolverHttpRequest.java
index 8401662b..dbeda986 100644
--- a/revolver-model/src/main/java/io/dropwizard/revolver/http/model/RevolverHttpRequest.java
+++ b/revolver-model/src/main/java/io/dropwizard/revolver/http/model/RevolverHttpRequest.java
@@ -22,6 +22,7 @@
import io.dropwizard.revolver.core.model.RevolverRequest;
import io.dropwizard.revolver.core.tracing.TraceInfo;
import io.dropwizard.revolver.http.config.RevolverHttpApiConfig;
+import io.vertx.ext.web.RoutingContext;
import java.util.Map;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
@@ -42,6 +43,7 @@ public class RevolverHttpRequest extends RevolverRequest {
private String path;
private RevolverHttpApiConfig.RequestMethod method;
private byte[] body;
+ private RoutingContext routingContext;
public RevolverHttpRequest() {
this.headers = new MultivaluedHashMap<>();
@@ -55,7 +57,8 @@ public RevolverHttpRequest() {
public RevolverHttpRequest(String service, String api,
RevolverHttpApiConfig.RequestMethod method, TraceInfo traceInfo,
MultivaluedMap headers, MultivaluedMap queryParams,
- Map pathParams, String path, byte[] body, RevolverExecutorType revolverExecutorType) {
+ Map pathParams, String path, byte[] body, RevolverExecutorType revolverExecutorType,
+ RoutingContext routingContext) {
super("http", service, api, traceInfo, revolverExecutorType);
this.headers = new MultivaluedHashMap<>();
this.queryParams = new MultivaluedHashMap<>();
@@ -66,5 +69,6 @@ public RevolverHttpRequest(String service, String api,
this.body = body;
this.path = path;
this.method = method;
+ this.routingContext = routingContext;
}
}
diff --git a/revolver-server/pom.xml b/revolver-server/pom.xml
index d781aaf5..6f66521b 100644
--- a/revolver-server/pom.xml
+++ b/revolver-server/pom.xml
@@ -5,7 +5,7 @@
dropwizard-revolver
io.revolver
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
4.0.0
@@ -16,29 +16,35 @@
io.revolver
revolver-model
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
io.revolver
revolver-core
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
io.revolver
revolver-resilience4j
- 2.0.1-SNAPSHOT
+ 2.0.3-SNAPSHOT
+
+ io.revolver
+ revolver-vertx
+ 2.0.3-SNAPSHOT
+
+
diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/RevolverBundle.java b/revolver-server/src/main/java/io/dropwizard/revolver/RevolverBundle.java
index 6d832be5..c4124e5e 100644
--- a/revolver-server/src/main/java/io/dropwizard/revolver/RevolverBundle.java
+++ b/revolver-server/src/main/java/io/dropwizard/revolver/RevolverBundle.java
@@ -71,10 +71,18 @@
import io.dropwizard.revolver.resource.RevolverRequestResource;
import io.dropwizard.revolver.splitting.PathExpressionSplitConfig;
import io.dropwizard.revolver.splitting.SplitConfig;
+import io.dropwizard.revolver.vertx.RevolverVerticle;
+import io.dropwizard.revolver.vertx.routes.RouterRegistry;
import io.dropwizard.riemann.RiemannBundle;
import io.dropwizard.riemann.RiemannConfig;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
+import io.vertx.circuitbreaker.CircuitBreaker;
+import io.vertx.circuitbreaker.CircuitBreakerOptions;
+import io.vertx.core.DeploymentOptions;
+import io.vertx.core.Vertx;
+import io.vertx.core.VertxOptions;
+import io.vertx.ext.web.Router;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -101,6 +109,21 @@ public abstract class RevolverBundle implements Configu
public static final ObjectMapper MSG_PACK_OBJECT_MAPPER = new ObjectMapper(
new MessagePackFactory());
public static final Map apiStatus = new ConcurrentHashMap<>();
+ public static final Vertx vertx = Vertx.vertx(new VertxOptions());
+ public static final Router router = Router.router(vertx);
+
+ public static final CircuitBreaker cb = CircuitBreaker.create("my-circuit-breaker", vertx,
+ new CircuitBreakerOptions().setMaxFailures(2)
+ .setTimeout(20000)
+ .setFallbackOnFailure(false)
+ .setFailuresRollingWindow(30000)
+ .setResetTimeout(30000))
+ .openHandler(event -> {
+ System.out.println("Circuit opened");
+ })
+ .closeHandler(event -> {
+ System.out.println("Circuit closed");
+ });
public static RevolverServiceResolver serviceNameResolver = null;
public static ConcurrentHashMap apiConfig = new ConcurrentHashMap<>();
@@ -374,11 +397,27 @@ public void run(T configuration, Environment environment) {
InlineCallbackHandler callbackHandler = InlineCallbackHandler.builder()
.persistenceProvider(persistenceProvider).revolverConfig(revolverConfig).build();
+ initializeVertx(environment, persistenceProvider, callbackHandler, metrics);
registerResources(environment, metrics, persistenceProvider, callbackHandler);
registerMappers(environment);
registerFilters(environment);
}
+ private void initializeVertx(Environment environment, PersistenceProvider persistenceProvider,
+ InlineCallbackHandler callbackHandler, MetricRegistry metrics) {
+
+ RevolverRequestResource revolverRequestResource = new RevolverRequestResource(environment.getObjectMapper(),
+ environment.getObjectMapper(), persistenceProvider, callbackHandler, metrics, revolverConfig);
+ RouterRegistry.builder()
+ .router(router)
+ .revolverRequestResource(revolverRequestResource)
+ .build();
+
+ DeploymentOptions deploymentOptions = new DeploymentOptions();
+ deploymentOptions.setInstances(5);
+ vertx.deployVerticle(RevolverVerticle.class.getName(), deploymentOptions);
+ }
+
public abstract CuratorFramework getCurator();
public abstract RevolverConfig getRevolverConfig(T configuration);
diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/http/RevolverHttpCommand.java b/revolver-server/src/main/java/io/dropwizard/revolver/http/RevolverHttpCommand.java
index 93b65599..8fe7c5bf 100644
--- a/revolver-server/src/main/java/io/dropwizard/revolver/http/RevolverHttpCommand.java
+++ b/revolver-server/src/main/java/io/dropwizard/revolver/http/RevolverHttpCommand.java
@@ -36,6 +36,11 @@
import io.dropwizard.revolver.splitting.RevolverSplitServiceConfig;
import io.dropwizard.revolver.splitting.SplitConfig;
import io.dropwizard.revolver.splitting.SplitStrategy;
+import io.vertx.core.http.HttpClient;
+import io.vertx.core.http.HttpClientRequest;
+import io.vertx.core.http.HttpClientResponse;
+import io.vertx.core.http.HttpServerResponse;
+import io.vertx.ext.web.RoutingContext;
import java.util.List;
import java.util.stream.Collectors;
import javax.ws.rs.core.HttpHeaders;
@@ -67,15 +72,15 @@ public class RevolverHttpCommand extends
private final OkHttpClient client;
+ private final HttpClient vertxClient;
+
@Builder
- public RevolverHttpCommand(RuntimeConfig runtimeConfig,
- ClientConfig clientConfiguration,
- RevolverHttpServiceConfig serviceConfiguration,
- RevolverHttpApiConfig apiConfiguration,
+ public RevolverHttpCommand(RuntimeConfig runtimeConfig, ClientConfig clientConfiguration,
+ RevolverHttpServiceConfig serviceConfiguration, RevolverHttpApiConfig apiConfiguration,
RevolverHttpContext revolverContext) {
- super(revolverContext, clientConfiguration, runtimeConfig, serviceConfiguration,
- apiConfiguration);
+ super(revolverContext, clientConfiguration, runtimeConfig, serviceConfiguration, apiConfiguration);
this.client = RevolverHttpClientFactory.buildClient(serviceConfiguration);
+ this.vertxClient = RevolverBundle.vertx.createHttpClient();
}
@Override
@@ -84,11 +89,11 @@ public boolean isFallbackEnabled() {
}
@Override
- public RevolverHttpResponse execute(RevolverHttpContext context,
- RevolverHttpRequest request) throws Exception {
+ public RevolverHttpResponse execute(RevolverHttpContext context, RevolverHttpRequest request) throws Exception {
Preconditions.checkNotNull(client);
RevolverHttpApiConfig apiConfig = getApiConfiguration();
- if (apiConfig.getMethods().contains(request.getMethod())) {
+ if (apiConfig.getMethods()
+ .contains(request.getMethod())) {
switch (request.getMethod()) {
case GET: {
return doGet(request);
@@ -115,36 +120,44 @@ public RevolverHttpResponse execute(RevolverHttpContext context,
}
MultivaluedMap headers = new MultivaluedHashMap<>();
headers.putSingle("X-REQUEST-PATH", request.getPath());
- headers.putSingle("X-REQUEST-METHOD", request.getMethod().name());
+ headers.putSingle("X-REQUEST-METHOD", request.getMethod()
+ .name());
headers.putSingle("X-REQUEST-API", getApiConfiguration().getApi());
- return RevolverHttpResponse.builder().headers(headers)
- .statusCode(javax.ws.rs.core.Response.Status.BAD_REQUEST.getStatusCode()).build();
+ return RevolverHttpResponse.builder()
+ .headers(headers)
+ .statusCode(javax.ws.rs.core.Response.Status.BAD_REQUEST.getStatusCode())
+ .build();
}
@Override
- public RevolverHttpResponse fallback(RevolverHttpContext context,
- RevolverHttpRequest requestType) {
+ public RevolverHttpResponse fallback(RevolverHttpContext context, RevolverHttpRequest requestType) {
log.error("Fallback triggered for command: " + RevolverCommandHelper.getName(requestType));
return null;
}
- private HttpUrl getServiceUrl(RevolverHttpRequest request,
- RevolverHttpApiConfig apiConfiguration) throws RevolverException {
+ private HttpUrl getServiceUrl(RevolverHttpRequest request, RevolverHttpApiConfig apiConfiguration)
+ throws RevolverException {
EndpointSpec endpointSpec = generateEndPoint(apiConfiguration);
if (endpointSpec == null) {
- endpointSpec = this.getServiceConfiguration().getEndpoint();
+ endpointSpec = this.getServiceConfiguration()
+ .getEndpoint();
}
Endpoint endpoint = RevolverBundle.serviceNameResolver.resolve(endpointSpec);
if (endpoint == null) {
if (Strings.isNullOrEmpty(getServiceConfiguration().getFallbackAddress())) {
- throw new RevolverException(503, "R999",
- "Service [" + request.getPath() + "] Unavailable");
+ throw new RevolverException(503, "R999", "Service [" + request.getPath() + "] Unavailable");
}
- String[] address = getServiceConfiguration().getFallbackAddress().split(":");
+ String[] address = getServiceConfiguration().getFallbackAddress()
+ .split(":");
if (address.length == 1) {
- endpoint = Endpoint.builder().host(address[0]).port(80).build();
+ endpoint = Endpoint.builder()
+ .host(address[0])
+ .port(80)
+ .build();
} else {
- endpoint = Endpoint.builder().host(address[0]).port(Integer.parseInt(address[1]))
+ endpoint = Endpoint.builder()
+ .host(address[0])
+ .port(Integer.parseInt(address[1]))
.build();
}
}
@@ -156,48 +169,54 @@ private EndpointSpec generateEndPoint(RevolverHttpApiConfig apiConfiguration) {
.isEnabled()) {
return getFromSplitConfig(apiConfiguration);
} else {
- return this.getServiceConfiguration().getEndpoint();
+ return this.getServiceConfiguration()
+ .getEndpoint();
}
}
private EndpointSpec getFromSplitConfig(RevolverHttpApiConfig apiConfiguration) {
String serviceEndPoint = getSplitService(apiConfiguration);
RevolverHttpServiceConfig serviceConfig = this.getServiceConfiguration();
- if (serviceConfig == null || null == serviceConfig.getServiceSplitConfig()
- || apiConfiguration.getSplitConfig().getSplitStrategy() != SplitStrategy.SERVICE
- || StringUtils.isEmpty(serviceEndPoint)) {
+ if (serviceConfig == null || null == serviceConfig.getServiceSplitConfig() || apiConfiguration.getSplitConfig()
+ .getSplitStrategy() != SplitStrategy.SERVICE || StringUtils.isEmpty(serviceEndPoint)) {
return null;
}
for (RevolverSplitServiceConfig splitServiceConfig : serviceConfig.getServiceSplitConfig()
.getConfigs()) {
- if (splitServiceConfig.getName().equals(serviceEndPoint)) {
+ if (splitServiceConfig.getName()
+ .equals(serviceEndPoint)) {
return splitServiceConfig.getEndpoint();
}
}
return null;
}
- private RevolverHttpResponse executeRequest(RevolverHttpApiConfig apiConfiguration,
- Request request, boolean readBody,
- RevolverHttpRequest originalRequest) throws Exception {
+ private RevolverHttpResponse executeRequest(RevolverHttpApiConfig apiConfiguration, Request request,
+ boolean readBody, RevolverHttpRequest originalRequest) throws Exception {
Response response = null;
try {
long start = System.currentTimeMillis();
if (null != apiConfiguration.getRetryConfig() && apiConfiguration.getRetryConfig()
.isEnabled()) {
- response = RetryUtils.getRetryer(apiConfiguration).call(() -> {
- val url = getServiceUrl(originalRequest, getApiConfiguration());
- return client.newCall(request.newBuilder().url(url).build()).execute();
- });
+ response = RetryUtils.getRetryer(apiConfiguration)
+ .call(() -> {
+ val url = getServiceUrl(originalRequest, getApiConfiguration());
+ return client.newCall(request.newBuilder()
+ .url(url)
+ .build())
+ .execute();
+ });
} else {
- response = client.newCall(request).execute();
+ response = client.newCall(request)
+ .execute();
}
long end = System.currentTimeMillis();
val httpResponse = getHttpResponse(apiConfiguration, response, readBody);
- log.info("[{}/{}] {} {}:{}{} {} {}ms", apiConfiguration.getApi(),
- apiConfiguration.getPath(), request.method(), request.url().host(),
- request.url().port(), request.url().encodedPath(), httpResponse.getStatusCode(),
- (end - start));
+ log.info("[{}/{}] {} {}:{}{} {} {}ms", apiConfiguration.getApi(), apiConfiguration.getPath(),
+ request.method(), request.url()
+ .host(), request.url()
+ .port(), request.url()
+ .encodedPath(), httpResponse.getStatusCode(), (end - start));
return httpResponse;
} catch (Exception e) {
log.error("Error executing service request for service : " + request.url(), e);
@@ -212,11 +231,35 @@ private RevolverHttpResponse executeRequest(RevolverHttpApiConfig apiConfigurati
private RevolverHttpResponse doGet(RevolverHttpRequest request) throws Exception {
Request.Builder httpRequest = initializeRequest(request);
httpRequest.get();
+ if (request.getRoutingContext() != null) {
+ return executeGetByVertx(request);
+ }
return executeRequest(getApiConfiguration(), httpRequest.build(), true, request);
}
- private Request.Builder initializeRequest(RevolverHttpRequest request)
- throws RevolverException {
+ private RevolverHttpResponse executeGetByVertx(RevolverHttpRequest request) throws Exception {
+ RoutingContext routingContext = request.getRoutingContext();
+ HttpUrl url = getServiceUrl(request, getApiConfiguration());
+ RevolverHttpResponse revolverHttpResponse = RevolverHttpResponse.builder()
+ .build();
+ log.info("Request Port : {}, Host : {}, Path : {}", url.port(), url.host(), url.encodedPath());
+ RevolverBundle.cb.execute(future -> {
+ vertxClient.getNow(url.port(), url.host(), url.encodedPath(), response -> {
+ log.info("Status : {}", response.statusCode());
+ try {
+ getHttpResponse(routingContext, revolverHttpResponse, getApiConfiguration(), response, true);
+ log.info("Revolver Response Body : {}", revolverHttpResponse.getBody());
+ } catch (Exception e) {
+ log.info("Exception : ", e);
+ }
+ });
+ future.complete();
+ });
+
+ return revolverHttpResponse;
+ }
+
+ private Request.Builder initializeRequest(RevolverHttpRequest request) throws RevolverException {
val url = getServiceUrl(request, getApiConfiguration());
val httpRequest = new Request.Builder().url(url);
addHeaders(request, httpRequest);
@@ -245,11 +288,10 @@ private RevolverHttpResponse doDelete(RevolverHttpRequest request) throws Except
private RevolverHttpResponse doPatch(RevolverHttpRequest request) throws Exception {
Request.Builder httpRequest = initializeRequest(request);
if (request.getBody() != null) {
- if (null != request.getHeaders() && StringUtils
- .isNotBlank(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE))) {
- httpRequest.patch(RequestBody.create(MediaType
- .parse(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)),
- request.getBody()));
+ if (null != request.getHeaders() && StringUtils.isNotBlank(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE))) {
+ httpRequest.patch(RequestBody.create(MediaType.parse(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE)), request.getBody()));
} else {
httpRequest.patch(RequestBody.create(MediaType.parse("*/*"), request.getBody()));
}
@@ -260,13 +302,15 @@ private RevolverHttpResponse doPatch(RevolverHttpRequest request) throws Excepti
}
private RevolverHttpResponse doPost(RevolverHttpRequest request) throws Exception {
+ if (request.getRoutingContext() != null) {
+ return executePostByVertx(request);
+ }
Request.Builder httpRequest = initializeRequest(request);
if (request.getBody() != null) {
- if (null != request.getHeaders() && StringUtils
- .isNotBlank(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE))) {
- httpRequest.post(RequestBody.create(MediaType
- .parse(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)),
- request.getBody()));
+ if (null != request.getHeaders() && StringUtils.isNotBlank(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE))) {
+ httpRequest.post(RequestBody.create(MediaType.parse(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE)), request.getBody()));
} else {
httpRequest.post(RequestBody.create(MediaType.parse("*/*"), request.getBody()));
}
@@ -276,14 +320,28 @@ private RevolverHttpResponse doPost(RevolverHttpRequest request) throws Exceptio
return executeRequest(getApiConfiguration(), httpRequest.build(), true, request);
}
+ private RevolverHttpResponse executePostByVertx(RevolverHttpRequest request) throws Exception {
+ RoutingContext routingContext = request.getRoutingContext();
+ HttpUrl url = getServiceUrl(request, getApiConfiguration());
+ RevolverHttpResponse revolverHttpResponse = RevolverHttpResponse.builder()
+ .build();
+ log.info("Request Port : {}, Host : {}, Path : {}", url.port(), url.host(), url.encodedPath());
+ RevolverBundle.cb.execute(future -> {
+ HttpClientRequest httpClientRequest = vertxClient.post(url.port(), url.host(), url.encodedPath());
+ httpClientRequest.write(routingContext.getBody());
+ future.complete();
+ });
+
+ return revolverHttpResponse;
+ }
+
private RevolverHttpResponse doPut(RevolverHttpRequest request) throws Exception {
Request.Builder httpRequest = initializeRequest(request);
if (request.getBody() != null) {
- if (null != request.getHeaders() && StringUtils
- .isNotBlank(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE))) {
- httpRequest.put(RequestBody.create(MediaType
- .parse(request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)),
- request.getBody()));
+ if (null != request.getHeaders() && StringUtils.isNotBlank(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE))) {
+ httpRequest.put(RequestBody.create(MediaType.parse(request.getHeaders()
+ .getFirst(HttpHeaders.CONTENT_TYPE)), request.getBody()));
} else {
httpRequest.put(RequestBody.create(MediaType.parse("*/*"), request.getBody()));
}
@@ -293,8 +351,8 @@ private RevolverHttpResponse doPut(RevolverHttpRequest request) throws Exception
return executeRequest(getApiConfiguration(), httpRequest.build(), true, request);
}
- private HttpUrl generateURI(RevolverHttpRequest request,
- RevolverHttpApiConfig apiConfiguration, Endpoint endpoint) {
+ private HttpUrl generateURI(RevolverHttpRequest request, RevolverHttpApiConfig apiConfiguration,
+ Endpoint endpoint) {
val builder = new HttpUrl.Builder();
addQueryParams(request, builder);
if (getServiceConfiguration().isSecured()) {
@@ -302,40 +360,71 @@ private HttpUrl generateURI(RevolverHttpRequest request,
} else {
builder.scheme("http");
}
- builder.host(endpoint.getHost()).port(endpoint.getPort())
+ builder.host(endpoint.getHost())
+ .port(endpoint.getPort())
.encodedPath(resolvePath(apiConfiguration, request));
return builder.build();
}
- private RevolverHttpResponse getHttpResponse(RevolverHttpApiConfig apiConfiguration,
- Response response, boolean readBody) throws Exception {
- if (apiConfiguration.getAcceptableResponseCodes() != null && !apiConfiguration
- .getAcceptableResponseCodes().isEmpty() && !apiConfiguration
- .getAcceptableResponseCodes().contains(response.code())) {
+ private RevolverHttpResponse getHttpResponse(RevolverHttpApiConfig apiConfiguration, Response response,
+ boolean readBody) throws Exception {
+ if (apiConfiguration.getAcceptableResponseCodes() != null && !apiConfiguration.getAcceptableResponseCodes()
+ .isEmpty() && !apiConfiguration.getAcceptableResponseCodes()
+ .contains(response.code())) {
if (response.body() != null) {
- log.error("Response: " + response.body().string());
+ log.error("Response: " + response.body()
+ .string());
}
- throw new Exception(
- String.format("HTTP %s %s failed with [%d - %s]", apiConfiguration.getMethods(),
- apiConfiguration.getApi(), response.code(), response.message()));
+ throw new Exception(String.format("HTTP %s %s failed with [%d - %s]", apiConfiguration.getMethods(),
+ apiConfiguration.getApi(), response.code(), response.message()));
}
val headers = new MultivaluedHashMap();
- response.headers().names().forEach(h -> headers.putSingle(h, response.header(h)));
- val revolverResponse = RevolverHttpResponse.builder().statusCode(response.code())
+ response.headers()
+ .names()
+ .forEach(h -> headers.putSingle(h, response.header(h)));
+ val revolverResponse = RevolverHttpResponse.builder()
+ .statusCode(response.code())
.headers(headers);
if (readBody && response.body() != null) {
- revolverResponse.body(response.body().bytes());
+ revolverResponse.body(response.body()
+ .bytes());
}
return revolverResponse.build();
}
- private String resolvePath(RevolverHttpApiConfig httpApiConfiguration,
- RevolverHttpRequest request) {
+ private RevolverHttpResponse getHttpResponse(RoutingContext routingContext, RevolverHttpResponse revolverResponse,
+ RevolverHttpApiConfig apiConfiguration, HttpClientResponse response, boolean readBody) throws Exception {
+ revolverResponse.setStatusCode(response.statusCode());
+ response.bodyHandler(buffer -> {
+ val headers = new MultivaluedHashMap();
+ HttpServerResponse toRsp = routingContext.response()
+ .setStatusCode(response.statusCode());
+ response.headers()
+ .names()
+ .forEach(h -> headers.putSingle(h, response.getHeader(h)));
+ revolverResponse.setHeaders(headers);
+ if (readBody && buffer != null) {
+ log.info("Body : {}", buffer.toString());
+ toRsp.end(buffer);
+ revolverResponse.setBody(buffer.getBytes());
+ }
+ });
+ if (apiConfiguration.getAcceptableResponseCodes() != null && !apiConfiguration.getAcceptableResponseCodes()
+ .isEmpty() && !apiConfiguration.getAcceptableResponseCodes()
+ .contains(response.statusCode())) {
+
+ throw new Exception(String.format("HTTP %s %s failed with [%d - %s]", apiConfiguration.getMethods(),
+ apiConfiguration.getApi(), response.statusCode(), response.statusCode()));
+ }
+ return revolverResponse;
+ }
+
+
+ private String resolvePath(RevolverHttpApiConfig httpApiConfiguration, RevolverHttpRequest request) {
String uri = null;
if (Strings.isNullOrEmpty(request.getPath())) {
if (null != request.getPathParams()) {
- uri = StringSubstitutor
- .replace(httpApiConfiguration.getPath(), request.getPathParams());
+ uri = StringSubstitutor.replace(httpApiConfiguration.getPath(), request.getPathParams());
}
} else {
uri = request.getPath();
@@ -348,8 +437,8 @@ private String resolvePath(RevolverHttpApiConfig httpApiConfiguration,
private String getSplitService(RevolverHttpApiConfig httpApiConfiguration) {
double random = Math.random();
- for (SplitConfig splitConfig : CollectionUtils
- .nullSafeList(httpApiConfiguration.getSplitConfig().getSplits())) {
+ for (SplitConfig splitConfig : CollectionUtils.nullSafeList(httpApiConfiguration.getSplitConfig()
+ .getSplits())) {
if (splitConfig.getFrom() <= random && splitConfig.getTo() > random) {
return splitConfig.getService();
}
@@ -361,8 +450,7 @@ private String getUri(RevolverHttpApiConfig httpApiConfiguration, RevolverHttpRe
String uri = StringUtils.EMPTY;
if (Strings.isNullOrEmpty(request.getPath())) {
if (null != request.getPathParams()) {
- uri = StringSubstitutor
- .replace(httpApiConfiguration.getPath(), request.getPathParams());
+ uri = StringSubstitutor.replace(httpApiConfiguration.getPath(), request.getPathParams());
}
} else {
uri = request.getPath();
@@ -372,13 +460,12 @@ private String getUri(RevolverHttpApiConfig httpApiConfiguration, RevolverHttpRe
private void addQueryParams(RevolverHttpRequest request, HttpUrl.Builder builder) {
if (null != request.getQueryParams()) {
- request.getQueryParams().forEach((key, values) -> values
- .forEach(value -> builder.addQueryParameter(key, value)));
+ request.getQueryParams()
+ .forEach((key, values) -> values.forEach(value -> builder.addQueryParameter(key, value)));
}
}
- private void trackingHeaders(RevolverHttpRequest request,
- Request.Builder requestBuilder) {
+ private void trackingHeaders(RevolverHttpRequest request, Request.Builder requestBuilder) {
if (!getServiceConfiguration().isTrackingHeaders()) {
return;
}
@@ -386,35 +473,33 @@ private void trackingHeaders(RevolverHttpRequest request,
if (request.getHeaders() == null) {
request.setHeaders(new MultivaluedHashMap<>());
}
- List existing = request.getHeaders().keySet().stream().map(String::toLowerCase)
+ List existing = request.getHeaders()
+ .keySet()
+ .stream()
+ .map(String::toLowerCase)
.collect(Collectors.toList());
if (!existing.contains(RevolversHttpHeaders.TXN_ID_HEADER.toLowerCase())) {
- requestBuilder
- .addHeader(RevolversHttpHeaders.TXN_ID_HEADER, spanInfo.getTransactionId());
+ requestBuilder.addHeader(RevolversHttpHeaders.TXN_ID_HEADER, spanInfo.getTransactionId());
}
if (!existing.contains(RevolversHttpHeaders.REQUEST_ID_HEADER.toLowerCase())) {
- requestBuilder
- .addHeader(RevolversHttpHeaders.REQUEST_ID_HEADER, spanInfo.getRequestId());
+ requestBuilder.addHeader(RevolversHttpHeaders.REQUEST_ID_HEADER, spanInfo.getRequestId());
}
if (!existing.contains(RevolversHttpHeaders.PARENT_REQUEST_ID_HEADER.toLowerCase())) {
- requestBuilder.addHeader(RevolversHttpHeaders.PARENT_REQUEST_ID_HEADER,
- spanInfo.getParentRequestId());
+ requestBuilder.addHeader(RevolversHttpHeaders.PARENT_REQUEST_ID_HEADER, spanInfo.getParentRequestId());
}
if (!existing.contains(RevolversHttpHeaders.TIMESTAMP_HEADER.toLowerCase())) {
- requestBuilder.addHeader(RevolversHttpHeaders.TIMESTAMP_HEADER,
- Long.toString(spanInfo.getTimestamp()));
+ requestBuilder.addHeader(RevolversHttpHeaders.TIMESTAMP_HEADER, Long.toString(spanInfo.getTimestamp()));
}
if (!existing.contains(RevolversHttpHeaders.CLIENT_HEADER.toLowerCase())) {
- requestBuilder.addHeader(RevolversHttpHeaders.CLIENT_HEADER,
- this.getClientConfiguration().getClientName());
+ requestBuilder.addHeader(RevolversHttpHeaders.CLIENT_HEADER, this.getClientConfiguration()
+ .getClientName());
}
}
- private void addHeaders(RevolverHttpRequest request,
- Request.Builder requestBuilder) {
+ private void addHeaders(RevolverHttpRequest request, Request.Builder requestBuilder) {
if (null != request.getHeaders()) {
- request.getHeaders().forEach(
- (key, values) -> values.forEach(value -> requestBuilder.addHeader(key, value)));
+ request.getHeaders()
+ .forEach((key, values) -> values.forEach(value -> requestBuilder.addHeader(key, value)));
}
}
}
diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/resource/RevolverRequestResource.java b/revolver-server/src/main/java/io/dropwizard/revolver/resource/RevolverRequestResource.java
index b4c47666..6f96b670 100644
--- a/revolver-server/src/main/java/io/dropwizard/revolver/resource/RevolverRequestResource.java
+++ b/revolver-server/src/main/java/io/dropwizard/revolver/resource/RevolverRequestResource.java
@@ -37,6 +37,7 @@
import io.dropwizard.revolver.http.RevolverHttpCommand;
import io.dropwizard.revolver.http.RevolversHttpHeaders;
import io.dropwizard.revolver.http.config.RevolverHttpApiConfig;
+import io.dropwizard.revolver.http.config.RevolverHttpApiConfig.RequestMethod;
import io.dropwizard.revolver.http.model.ApiPathMap;
import io.dropwizard.revolver.http.model.RevolverHttpRequest;
import io.dropwizard.revolver.http.model.RevolverHttpResponse;
@@ -51,6 +52,7 @@
import io.dropwizard.revolver.util.ResponseTransformationUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import io.vertx.ext.web.RoutingContext;
import java.io.IOException;
import java.time.Instant;
import java.util.Collections;
@@ -62,7 +64,6 @@
import java.util.regex.Pattern;
import javax.inject.Singleton;
import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.POST;
@@ -112,17 +113,17 @@ public RevolverRequestResource(ObjectMapper jsonObjectMapper, ObjectMapper msgPa
this.revolverConfig = revolverConfig;
}
- @GET
+ /*@GET
@Path(value = "/{service}/{path: .*}")
@Metered
@ApiOperation(value = "Revolver GET api endpoint")
public Response get(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.GET, path,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.GET, path,
headers, uriInfo, null);
pushMetrics(response, service, path);
return response;
- }
+ }*/
@HEAD
@Path(value = "/{service}/{path: .*}")
@@ -130,7 +131,7 @@ public Response get(@PathParam("service") String service, @PathParam("path") Str
@ApiOperation(value = "Revolver HEAD api endpoint")
public Response head(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.HEAD, path,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.HEAD, path,
headers, uriInfo, null);
pushMetrics(response, service, path);
return response;
@@ -142,7 +143,7 @@ public Response head(@PathParam("service") String service, @PathParam("path") St
@ApiOperation(value = "Revolver POST api endpoint")
public Response post(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo, byte[] body) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.POST, path,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.POST, path,
headers, uriInfo, body);
pushMetrics(response, service, path);
return response;
@@ -154,7 +155,7 @@ public Response post(@PathParam("service") String service, @PathParam("path") St
@ApiOperation(value = "Revolver PUT api endpoint")
public Response put(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo, byte[] body) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.PUT, path,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.PUT, path,
headers, uriInfo, body);
pushMetrics(response, service, path);
return response;
@@ -166,7 +167,7 @@ public Response put(@PathParam("service") String service, @PathParam("path") Str
@ApiOperation(value = "Revolver DELETE api endpoint")
public Response delete(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.DELETE,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.DELETE,
path, headers, uriInfo, null);
pushMetrics(response, service, path);
return response;
@@ -178,7 +179,7 @@ public Response delete(@PathParam("service") String service, @PathParam("path")
@ApiOperation(value = "Revolver PATCH api endpoint")
public Response patch(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo, byte[] body) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.PATCH, path,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.PATCH, path,
headers, uriInfo, body);
pushMetrics(response, service, path);
return response;
@@ -190,15 +191,15 @@ public Response patch(@PathParam("service") String service, @PathParam("path") S
@ApiOperation(value = "Revolver OPTIONS api endpoint")
public Response options(@PathParam("service") String service, @PathParam("path") String path,
@Context HttpHeaders headers, @Context UriInfo uriInfo, byte[] body) throws Exception {
- Response response = processRequest(service, RevolverHttpApiConfig.RequestMethod.OPTIONS,
+ Response response = processRequest(null, service, RevolverHttpApiConfig.RequestMethod.OPTIONS,
path, headers, uriInfo, body);
pushMetrics(response, service, path);
return response;
}
- private Response processRequest(String service, RevolverHttpApiConfig.RequestMethod method,
- String path, HttpHeaders headers, UriInfo uriInfo, byte[] body) throws Exception {
+ public Response processRequest(RoutingContext routingContext, String service, RequestMethod method, String path,
+ HttpHeaders headers, UriInfo uriInfo, byte[] body) throws Exception {
val apiMap = resolvePath(service, path, headers);
if (apiMap == null) {
return Response.status(Response.Status.BAD_REQUEST).entity(ResponseTransformationUtil
@@ -219,7 +220,7 @@ private Response processRequest(String service, RevolverHttpApiConfig.RequestMet
val callMode = getCallMode(apiMap, headers);
if (Strings.isNullOrEmpty(callMode)) {
- return executeInline(service, apiMap.getApi(), method, path, headers, uriInfo, body);
+ return executeInline(service, apiMap.getApi(), method, path, headers, uriInfo, body, routingContext);
}
switch (callMode.toUpperCase()) {
case RevolverHttpCommand.CALL_MODE_POLLING:
@@ -360,28 +361,31 @@ private String getCallMode(ApiPathMap apiMap, HttpHeaders headers) {
return callMode;
}
- private Response executeInline(String service, RevolverHttpApiConfig api,
- RevolverHttpApiConfig.RequestMethod method, String path, HttpHeaders headers,
- UriInfo uriInfo, byte[] body) throws IOException, TimeoutException {
+ private Response executeInline(String service, RevolverHttpApiConfig api, RequestMethod method, String path,
+ HttpHeaders headers, UriInfo uriInfo, byte[] body, RoutingContext routingContext)
+ throws IOException, TimeoutException {
val sanatizedHeaders = new MultivaluedHashMap();
headers.getRequestHeaders().forEach(sanatizedHeaders::put);
cleanHeaders(sanatizedHeaders, api);
val httpCommand = RevolverBundle.getHttpCommand(service, api.getApi());
- RevolverHttpResponse revolverHttpResponse = execute(httpCommand, service, api, method, path,
- headers, uriInfo, body, sanatizedHeaders);
+ RevolverHttpResponse revolverHttpResponse = execute(httpCommand, service, api, method, path, headers, uriInfo,
+ body, sanatizedHeaders, routingContext);
return transform(headers, revolverHttpResponse, api.getApi(), path, method);
}
- private RevolverHttpResponse execute(RevolverHttpCommand httpCommand, String service,
- RevolverHttpApiConfig api, RevolverHttpApiConfig.RequestMethod method, String path,
- HttpHeaders headers, UriInfo uriInfo, byte[] body,
- MultivaluedHashMap sanatizedHeaders) throws TimeoutException {
+ private RevolverHttpResponse execute(RevolverHttpCommand httpCommand, String service, RevolverHttpApiConfig api,
+ RequestMethod method, String path, HttpHeaders headers, UriInfo uriInfo, byte[] body,
+ MultivaluedHashMap sanatizedHeaders, RoutingContext routingContext)
+ throws TimeoutException {
return httpCommand.execute(RevolverHttpRequest.builder().traceInfo(TraceInfo.builder()
.requestId(headers.getHeaderString(RevolversHttpHeaders.REQUEST_ID_HEADER))
.transactionId(headers.getHeaderString(RevolversHttpHeaders.TXN_ID_HEADER))
.timestamp(System.currentTimeMillis()).build()).api(api.getApi()).service(service)
.path(path).method(method).headers(sanatizedHeaders)
- .queryParams(uriInfo.getQueryParameters()).body(body).build());
+ .queryParams(uriInfo.getQueryParameters())
+ .routingContext(routingContext)
+ .body(body)
+ .build());
}
private Response transform(HttpHeaders headers, RevolverHttpResponse response, String api,
diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RequestUtil.java b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RequestUtil.java
new file mode 100644
index 00000000..a7c5e16e
--- /dev/null
+++ b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RequestUtil.java
@@ -0,0 +1,177 @@
+package io.dropwizard.revolver.vertx;
+
+import io.dropwizard.revolver.http.RevolversHttpHeaders;
+import io.dropwizard.revolver.http.config.RevolverHttpApiConfig.RequestMethod;
+import io.vertx.ext.web.RoutingContext;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.UUID;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.glassfish.jersey.internal.MapPropertiesDelegate;
+import org.glassfish.jersey.server.ContainerRequest;
+
+/***
+ Created by nitish.goyal on 16/03/20
+ ***/
+@Slf4j
+public class RequestUtil {
+
+
+ public static UriInfo getUriInfo(RoutingContext routingContext) {
+
+ return new UriInfo() {
+ @Override
+ public String getPath() {
+ return routingContext.normalisedPath();
+ }
+
+ @Override
+ public String getPath(boolean decode) {
+ return routingContext.normalisedPath();
+ }
+
+ @Override
+ public List getPathSegments() {
+ return null;
+ }
+
+ @Override
+ public List getPathSegments(boolean decode) {
+ return null;
+ }
+
+ @Override
+ public URI getRequestUri() {
+ return null;
+ }
+
+ @Override
+ public UriBuilder getRequestUriBuilder() {
+ return null;
+ }
+
+ @Override
+ public URI getAbsolutePath() {
+ return null;
+ }
+
+ @Override
+ public UriBuilder getAbsolutePathBuilder() {
+ return null;
+ }
+
+ @Override
+ public URI getBaseUri() {
+ return null;
+ }
+
+ @Override
+ public UriBuilder getBaseUriBuilder() {
+ return null;
+ }
+
+ @Override
+ public MultivaluedMap getPathParameters() {
+ return null;
+ }
+
+ @Override
+ public MultivaluedMap getPathParameters(boolean decode) {
+ return null;
+ }
+
+ @Override
+ public MultivaluedMap getQueryParameters() {
+ return null;
+ }
+
+ @Override
+ public MultivaluedMap getQueryParameters(boolean decode) {
+ return null;
+ }
+
+ @Override
+ public List getMatchedURIs() {
+ return null;
+ }
+
+ @Override
+ public List getMatchedURIs(boolean decode) {
+ return null;
+ }
+
+ @Override
+ public List