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 getMatchedResources() { + return null; + } + + @Override + public URI resolve(URI uri) { + return null; + } + + @Override + public URI relativize(URI uri) { + return null; + } + }; + } + + public static HttpHeaders getHeaders(RoutingContext routingContext) { + HttpHeaders headers = null; + try { + headers = new ContainerRequest(new URI(routingContext.normalisedPath()), + new URI(routingContext.normalisedPath()), RequestMethod.GET.name(), null, + new MapPropertiesDelegate()); + } catch (URISyntaxException e) { + log.error("Error while getting headers : ", e); + } + if (headers == null) { + return null; + } + if (headers.getRequestHeaders() + .getFirst(RevolversHttpHeaders.TXN_ID_HEADER) == null) { + headers.getRequestHeaders() + .putSingle(RevolversHttpHeaders.TXN_ID_HEADER, UUID.randomUUID() + .toString()); + } + + if (headers.getRequestHeaders() + .getFirst(RevolversHttpHeaders.REQUEST_ID_HEADER) == null) { + headers.getRequestHeaders() + .putSingle(RevolversHttpHeaders.REQUEST_ID_HEADER, UUID.randomUUID() + .toString()); + } + + return headers; + } + + public static String getServiceName(RoutingContext routingContext) { + String path = routingContext.normalisedPath(); + int length = "/apis/".length(); + String servicePath = path.substring(length); + int indexOfApiSlash = servicePath.indexOf('/'); + return servicePath.substring(0, indexOfApiSlash); + } + + public static String getApiPath(RoutingContext routingContext) { + String path = routingContext.normalisedPath(); + int length = "/apis/".length(); + String servicePath = path.substring(length); + int indexOfApiSlash = servicePath.indexOf('/'); + return servicePath.substring(indexOfApiSlash + 1); + } + + public static byte[] getBody(RoutingContext routingContext) { + return routingContext.getBody() == null ? null : routingContext.getBody() + .getBytes(); + } + + +} diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RevolverVerticle.java b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RevolverVerticle.java new file mode 100644 index 00000000..11944f96 --- /dev/null +++ b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/RevolverVerticle.java @@ -0,0 +1,37 @@ +package io.dropwizard.revolver.vertx; + +import io.dropwizard.revolver.RevolverBundle; +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Promise; +import io.vertx.ext.web.Router; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.log4j.LogManager; + +/*** + Created by nitish.goyal on 16/03/20 + ***/ +@Slf4j +public class RevolverVerticle extends AbstractVerticle { + + + @Override + public void start(Promise startPromise) throws Exception { + + Router router = RevolverBundle.router; + + log.info("Starting server.. Host : {}", System.getenv("HOST")); + vertx.createHttpServer() + .requestHandler(router) + .listen(8080, Objects.nonNull(System.getenv("HOST")) ? System.getenv("HOST") : "localhost", + event -> Runtime.getRuntime() + .addShutdownHook(new Thread(() -> { + vertx.createHttpServer() + .requestHandler(router) + .close(r -> log.info("Closing httpServer")); + log.info("Shutting down.."); + LogManager.shutdown(); + }))); + } + +} diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RevolverRequestRegistry.java b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RevolverRequestRegistry.java new file mode 100644 index 00000000..4c2acbd5 --- /dev/null +++ b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RevolverRequestRegistry.java @@ -0,0 +1,81 @@ +package io.dropwizard.revolver.vertx.routes; + +import io.dropwizard.revolver.http.config.RevolverHttpApiConfig.RequestMethod; +import io.dropwizard.revolver.resource.RevolverRequestResource; +import io.dropwizard.revolver.vertx.RequestUtil; +import io.vertx.core.http.HttpMethod; +import io.vertx.ext.web.Router; +import io.vertx.ext.web.RoutingContext; +import io.vertx.ext.web.handler.BodyHandler; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.UriInfo; +import lombok.Builder; +import lombok.extern.slf4j.Slf4j; + +/*** + Created by nitish.goyal on 17/03/20 + ***/ +@Slf4j +public class RevolverRequestRegistry { + + private final Router router; + + private final RevolverRequestResource revolverRequestResource; + + @Builder + public RevolverRequestRegistry(Router router, RevolverRequestResource revolverRequestResource) { + this.router = router; + this.revolverRequestResource = revolverRequestResource; + } + + public void register() { + //Test APIs + router.route() + .path("/apis/*") + .method(HttpMethod.GET) + .handler(this::getResource); + router.route() + .path("/apis/*") + .method(HttpMethod.POST) + .handler(BodyHandler.create()) + .handler(this::postResource); + } + + private void getResource(RoutingContext routingContext) { + log.info("Executing via vertx for path : {}", routingContext.normalisedPath()); + UriInfo uriInfo = RequestUtil.getUriInfo(routingContext); + HttpHeaders headers = RequestUtil.getHeaders(routingContext); + String service = RequestUtil.getServiceName(routingContext); + String path = RequestUtil.getApiPath(routingContext); + byte[] body = RequestUtil.getBody(routingContext); + log.info("Service : {}, Path : {}", service, path); + + try { + revolverRequestResource.processRequest(routingContext, service, RequestMethod.GET, path, headers, uriInfo, + body); + } catch (Exception e) { + log.error("Error occurred while executing resource ", e); + } + log.info("Execution completed : " + routingContext.getBody()); + } + + private void postResource(RoutingContext routingContext) { + log.info("Executing via vertx for path : {}", routingContext.normalisedPath()); + UriInfo uriInfo = RequestUtil.getUriInfo(routingContext); + HttpHeaders headers = RequestUtil.getHeaders(routingContext); + String service = RequestUtil.getServiceName(routingContext); + String path = RequestUtil.getApiPath(routingContext); + byte[] body = RequestUtil.getBody(routingContext); + String buffer = routingContext.getBody() == null ? "" : routingContext.getBody() + .toString(); + log.info("Service : {}, Path : {}, Body : {}", service, path, buffer); + + try { + revolverRequestResource.processRequest(routingContext, service, RequestMethod.POST, path, headers, uriInfo, + body); + } catch (Exception e) { + log.error("Error occurred while executing resource ", e); + } + log.info("Execution completed : " + routingContext.getBody()); + } +} diff --git a/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RouterRegistry.java b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RouterRegistry.java new file mode 100644 index 00000000..d9eff9af --- /dev/null +++ b/revolver-server/src/main/java/io/dropwizard/revolver/vertx/routes/RouterRegistry.java @@ -0,0 +1,23 @@ +package io.dropwizard.revolver.vertx.routes; + +import io.dropwizard.revolver.resource.RevolverRequestResource; +import io.vertx.ext.web.Router; +import lombok.Builder; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Data + +public class RouterRegistry { + + @Builder + public RouterRegistry(Router router, RevolverRequestResource revolverRequestResource) { + RevolverRequestRegistry.builder() + .router(router) + .revolverRequestResource(revolverRequestResource) + .build() + .register(); + } + +} diff --git a/revolver-vertx/pom.xml b/revolver-vertx/pom.xml new file mode 100644 index 00000000..6922b933 --- /dev/null +++ b/revolver-vertx/pom.xml @@ -0,0 +1,48 @@ + + + + dropwizard-revolver + io.revolver + 2.0.3-SNAPSHOT + + 4.0.0 + + revolver-vertx + + + 3.8.4 + + + + + + io.vertx + vertx-circuit-breaker + 3.8.5 + + + io.vertx + vertx-web-client + ${vertex.version} + + + io.vertx + vertx-core + ${vertex.version} + + + io.vertx + vertx-config + ${vertex.version} + + + io.vertx + vertx-web + ${vertex.version} + + + + + \ No newline at end of file diff --git a/sentinel/pom.xml b/sentinel/pom.xml index 674b5645..a4e4b2c6 100644 --- a/sentinel/pom.xml +++ b/sentinel/pom.xml @@ -3,9 +3,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - dropwizard-revolver-resilience4j + dropwizard-revolver io.revolver - 2.0.1-SNAPSHOT + 2.0.3-SNAPSHOT 4.0.0 @@ -15,12 +15,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