diff --git a/pom.xml b/pom.xml index abf799dd..e5df2f0b 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,12 @@ org.springframework.boot.experimental spring-boot-starter-web-reactive + + + org.springframework.boot + spring-boot-starter-tomcat + + io.projectreactor.ipc diff --git a/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java b/src/main/java/org/springframework/cloud/gateway/GatewayApplication.java similarity index 89% rename from src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java rename to src/main/java/org/springframework/cloud/gateway/GatewayApplication.java index ac3a81d1..747804d6 100644 --- a/src/main/java/org/springframework/cloud/gateway/SpringCloudGatewayApplication.java +++ b/src/main/java/org/springframework/cloud/gateway/GatewayApplication.java @@ -16,9 +16,9 @@ import reactor.core.publisher.Mono; @Import(GatewayConfiguration.class) @SpringBootConfiguration @EnableAutoConfiguration -public class SpringCloudGatewayApplication { +public class GatewayApplication { - private static final Log log = LogFactory.getLog(SpringCloudGatewayApplication.class); + private static final Log log = LogFactory.getLog(GatewayApplication.class); // TODO: only apply filters to zuul? @Bean @@ -48,7 +48,7 @@ public class SpringCloudGatewayApplication { public static void main(String[] args) { new SpringApplicationBuilder() - .sources(SpringCloudGatewayApplication.class) + .sources(GatewayApplication.class) //TODO: howto do programatically .run(args); } diff --git a/src/main/java/org/springframework/cloud/gateway/GatewayHandlerMapping.java b/src/main/java/org/springframework/cloud/gateway/GatewayHandlerMapping.java index 87a1be5c..57b0cc53 100644 --- a/src/main/java/org/springframework/cloud/gateway/GatewayHandlerMapping.java +++ b/src/main/java/org/springframework/cloud/gateway/GatewayHandlerMapping.java @@ -28,7 +28,7 @@ public class GatewayHandlerMapping extends AbstractUrlHandlerMapping { protected void registerHandlers(Map routes) { for (Route route : routes.values()) { - registerHandler(route.getPath(), this.gatewayWebHandler); + registerHandler(route.getRequestPath(), this.gatewayWebHandler); } } diff --git a/src/main/java/org/springframework/cloud/gateway/GatewayProperties.java b/src/main/java/org/springframework/cloud/gateway/GatewayProperties.java index 1eb4cd04..0f3231c8 100644 --- a/src/main/java/org/springframework/cloud/gateway/GatewayProperties.java +++ b/src/main/java/org/springframework/cloud/gateway/GatewayProperties.java @@ -2,6 +2,7 @@ package org.springframework.cloud.gateway; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.net.URI; import java.util.LinkedHashMap; import java.util.Map; @@ -27,41 +28,31 @@ public class GatewayProperties { public static class Route { private String id; - private String path; - private String host; - private String port; + private String requestPath; + private URI upstreamUrl; - public String getPath() { - return this.path; + public String getRequestPath() { + return this.requestPath; } - public void setPath(String path) { - this.path = path; + public void setRequestPath(String requestPath) { + this.requestPath = requestPath; } - public String getHost() { - return this.host; + public URI getUpstreamUrl() { + return upstreamUrl; } - public void setHost(String host) { - this.host = host; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; + public void setUpstreamUrl(URI upstreamUrl) { + this.upstreamUrl = upstreamUrl; } @Override public String toString() { return "Route{" + "id='" + id + '\'' + - ", path='" + path + '\'' + - ", host='" + host + '\'' + - ", port='" + port + '\'' + + ", requestPath='" + requestPath + '\'' + + ", upstreamUrl='" + upstreamUrl + '\'' + '}'; } } diff --git a/src/main/java/org/springframework/cloud/gateway/GatewayWebHandler.java b/src/main/java/org/springframework/cloud/gateway/GatewayWebHandler.java index 630bdb0a..e8a485dc 100644 --- a/src/main/java/org/springframework/cloud/gateway/GatewayWebHandler.java +++ b/src/main/java/org/springframework/cloud/gateway/GatewayWebHandler.java @@ -28,7 +28,7 @@ public class GatewayWebHandler implements WebHandler { @Override public Mono handle(ServerWebExchange exchange) { - Optional requestUrl = exchange.getAttribute("requestUri"); + Optional requestUrl = exchange.getAttribute("requestUrl"); ServerHttpRequest request = exchange.getRequest(); ClientRequest clientRequest = ClientRequest .method(request.getMethod(), requestUrl.get()) diff --git a/src/main/java/org/springframework/cloud/gateway/filters/FindRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filters/FindRouteFilter.java index 2213d307..b82a5ac2 100644 --- a/src/main/java/org/springframework/cloud/gateway/filters/FindRouteFilter.java +++ b/src/main/java/org/springframework/cloud/gateway/filters/FindRouteFilter.java @@ -4,7 +4,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.gateway.GatewayProperties; import org.springframework.cloud.gateway.GatewayProperties.Route; -import org.springframework.cloud.gateway.SpringCloudGatewayApplication; +import org.springframework.cloud.gateway.GatewayApplication; +import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.AntPathMatcher; import org.springframework.web.server.ServerWebExchange; @@ -18,9 +19,9 @@ import java.net.URI; /** * @author Spencer Gibb */ -public class FindRouteFilter implements WebFilter { +public class FindRouteFilter implements WebFilter, Ordered { - private static final Log log = LogFactory.getLog(SpringCloudGatewayApplication.class); + private static final Log log = LogFactory.getLog(GatewayApplication.class); private final GatewayProperties properties; private final AntPathMatcher matcher; @@ -30,6 +31,11 @@ public class FindRouteFilter implements WebFilter { this.matcher = new AntPathMatcher(); } + @Override + public int getOrder() { + return 500; + } + @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { log.info("FindRouteFilter start"); @@ -38,13 +44,12 @@ public class FindRouteFilter implements WebFilter { URI uri = request.getURI(); String path = uri.getPath(); for (Route route : this.properties.getRoutes().values()) { - if (this.matcher.match(route.getPath(), path)) { - URI requestUri = UriComponentsBuilder.fromHttpRequest(request) - .host(route.getHost()) - .port(route.getPort()) + if (this.matcher.match(route.getRequestPath(), path)) { + URI requestUrl = UriComponentsBuilder.fromHttpRequest(request) + .uri(route.getUpstreamUrl()) .build(true) .toUri(); - exchange.getAttributes().put("requestUri", requestUri); + exchange.getAttributes().put("requestUrl", requestUrl); return chain.filter(exchange); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fe67ffe1..0d375ac9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,6 +6,5 @@ spring: gateway: routes: test1: - path: /** - host: httpbin.org - port: 80 + requestPath: /** + upstreamUrl: http://httpbin.org:80 diff --git a/src/test/java/org/springframework/cloud/gateway/SpringCloudGatewayApplicationTests.java b/src/test/java/org/springframework/cloud/gateway/GatewayApplicationTests.java similarity index 86% rename from src/test/java/org/springframework/cloud/gateway/SpringCloudGatewayApplicationTests.java rename to src/test/java/org/springframework/cloud/gateway/GatewayApplicationTests.java index f1f26522..2bbc595b 100644 --- a/src/test/java/org/springframework/cloud/gateway/SpringCloudGatewayApplicationTests.java +++ b/src/test/java/org/springframework/cloud/gateway/GatewayApplicationTests.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class SpringCloudGatewayApplicationTests { +public class GatewayApplicationTests { @Test public void contextLoads() {