Compare commits

...

11 Commits
main ... 4.0.x

Author SHA1 Message Date
buildmaster cba61f7b94 Bumping versions 11 months ago
buildmaster aed52c2a0d Bumping versions to 4.0.9-SNAPSHOT after release 11 months ago
buildmaster e023410fde Going back to snapshots 11 months ago
buildmaster 37c0810887 Update SNAPSHOT to 4.0.8 11 months ago
dependabot[bot] 8a7a00c37b
Bump org.apache.maven.plugins:maven-jar-plugin from 3.2.0 to 3.2.2 (#3069) 11 months ago
dependabot[bot] bdba26009c
Bump grpc.version from 1.47.0 to 1.47.1 (#3066) 11 months ago
dependabot[bot] 0aee03ec2a
Bump org.testcontainers:testcontainers-bom from 1.17.3 to 1.17.6 (#3072) 11 months ago
buildmaster 48612c4f6a Bumping versions 11 months ago
Ignacio Lozano ee9d6ad16a
Correct the order when routes are refreshed by group (#3112) 11 months ago
buildmaster 7becdc5c74 Bumping versions 12 months ago
dependabot[bot] 8f1439f5c9
Bump mikepenz/action-junit-report from 2 to 4 (#3071) 12 months ago
  1. 2
      .github/workflows/maven.yml
  2. 5
      docs/src/main/asciidoc/_configprops.adoc
  3. 2
      pom.xml
  4. 2
      spring-cloud-gateway-integration-tests/grpc/pom.xml
  5. 4
      spring-cloud-gateway-server/pom.xml
  6. 5
      spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java
  7. 53
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java

2
.github/workflows/maven.yml

@ -31,7 +31,7 @@ jobs: @@ -31,7 +31,7 @@ jobs:
- name: Build with Maven
run: ./mvnw clean install -B -U -Pspring -Dmaven.test.redirectTestOutputToFile=true -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120
- name: Publish Test Report
uses: mikepenz/action-junit-report@v2
uses: mikepenz/action-junit-report@v4
if: always() # always run even if the previous step fails
with:
report_paths: '**/surefire-reports/TEST-*.xml'

5
docs/src/main/asciidoc/_configprops.adoc

@ -20,8 +20,9 @@ @@ -20,8 +20,9 @@
|spring.cloud.gateway.filter.hystrix.enabled | `+++true+++` | Enables the hystrix filter.
|spring.cloud.gateway.filter.json-to-grpc.enabled | `+++true+++` | Enables the JSON to gRPC filter.
|spring.cloud.gateway.filter.local-response-cache.enabled | `+++false+++` | Enables the local-response-cache filter.
|spring.cloud.gateway.filter.local-response-cache.size | `+++5m+++` | Maximum size of the cache to evict entries for this route (in KB, MB and GB).
|spring.cloud.gateway.filter.local-response-cache.time-to-live | | Time to expire a cache entry (expressed in s for seconds, m for minutes, and h for hours).
|spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy | |
|spring.cloud.gateway.filter.local-response-cache.size | | Maximum size of the cache to evict entries for this route (in KB, MB and GB).
|spring.cloud.gateway.filter.local-response-cache.time-to-live | `+++5m+++` | Time to expire a cache entry (expressed in s for seconds, m for minutes, and h for hours).
|spring.cloud.gateway.filter.map-request-header.enabled | `+++true+++` | Enables the map-request-header filter.
|spring.cloud.gateway.filter.modify-request-body.enabled | `+++true+++` | Enables the modify-request-body filter.
|spring.cloud.gateway.filter.modify-response-body.enabled | `+++true+++` | Enables the modify-response-body filter.

2
pom.xml

@ -56,7 +56,7 @@ @@ -56,7 +56,7 @@
<junit-pioneer.version>1.6.2</junit-pioneer.version>
<spring-cloud-circuitbreaker.version>3.0.4-SNAPSHOT</spring-cloud-circuitbreaker.version>
<spring-cloud-commons.version>4.0.5-SNAPSHOT</spring-cloud-commons.version>
<testcontainers.version>1.17.3</testcontainers.version>
<testcontainers.version>1.17.6</testcontainers.version>
</properties>
<dependencyManagement>

2
spring-cloud-gateway-integration-tests/grpc/pom.xml

@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
<description>Spring Cloud Gateway gRPC Integration Test</description>
<properties>
<grpc.version>1.47.0</grpc.version>
<grpc.version>1.47.1</grpc.version>
</properties>
<parent>

4
spring-cloud-gateway-server/pom.xml

@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
<description>Spring Cloud Gateway Server</description>
<properties>
<main.basedir>${basedir}/..</main.basedir>
<grpc.version>1.47.0</grpc.version>
<grpc.version>1.47.1</grpc.version>
<context-propagation.version>1.0.0</context-propagation.version>
</properties>
@ -310,7 +310,7 @@ @@ -310,7 +310,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<version>3.2.2</version>
<executions>
<execution>
<goals>

5
spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/CachingRouteLocator.java

@ -88,8 +88,9 @@ public class CachingRouteLocator @@ -88,8 +88,9 @@ public class CachingRouteLocator
.onErrorResume(s -> Mono.just(List.of()));
scopedRoutes.subscribe(scopedRoutesList -> {
Flux.concat(Flux.fromIterable(scopedRoutesList), getNonScopedRoutes(event)).materialize()
.collect(Collectors.toList()).subscribe(signals -> {
Flux.concat(Flux.fromIterable(scopedRoutesList), getNonScopedRoutes(event))
.sort(AnnotationAwareOrderComparator.INSTANCE).materialize().collect(Collectors.toList())
.subscribe(signals -> {
applicationEventPublisher.publishEvent(new RefreshRoutesResultEvent(this));
cache.put(CACHE_KEY, signals);
}, this::handleRefreshError);

53
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/actuate/GatewayControllerEndpointTests.java

@ -23,6 +23,7 @@ import java.util.List; @@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.assertj.core.util.Maps;
import org.junit.jupiter.api.Assertions;
@ -193,6 +194,58 @@ public class GatewayControllerEndpointTests { @@ -193,6 +194,58 @@ public class GatewayControllerEndpointTests {
});
}
@Test
public void testOrderOfRefreshByGroup() {
RouteDefinition testRouteDefinition = new RouteDefinition();
testRouteDefinition.setUri(URI.create("http://example.org"));
testRouteDefinition.setOrder(1000);
String group1 = "group-1_" + UUID.randomUUID();
testRouteDefinition.setMetadata(Map.of("groupBy", group1));
String routeId1 = "route-1_" + UUID.randomUUID();
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1)
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange()
.expectStatus().isCreated();
RouteDefinition testRouteDefinition2 = new RouteDefinition();
testRouteDefinition2.setUri(URI.create("http://example.org"));
testRouteDefinition2.setOrder(0);
String group2 = "group-2_" + UUID.randomUUID();
testRouteDefinition2.setMetadata(Map.of("groupBy", group2));
String routeId2 = "route-2_" + UUID.randomUUID();
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2)
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange()
.expectStatus().isCreated();
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1)
.exchange().expectStatus().isOk();
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2)
.exchange().expectStatus().isOk();
testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk()
.expectBodyList(Map.class).consumeWith(result -> {
List<Map> responseBody = result.getResponseBody();
List ids = responseBody.stream().map(route -> route.get("route_id"))
.filter(id -> id.equals(routeId1) || id.equals(routeId2)).collect(Collectors.toList());
assertThat(ids).containsExactly(routeId2, routeId1);
});
testRouteDefinition2.setOrder(testRouteDefinition.getOrder() + 1);
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2)
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange()
.expectStatus().isCreated();
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2)
.exchange().expectStatus().isOk();
testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk()
.expectBodyList(Map.class).consumeWith(result -> {
List<Map> responseBody = result.getResponseBody();
List ids = responseBody.stream().map(route -> route.get("route_id"))
.filter(id -> id.equals(routeId1) || id.equals(routeId2)).collect(Collectors.toList());
assertThat(ids).containsExactly(routeId1, routeId2);
});
}
@Test
public void testRefreshByGroup_whenRouteDefinitionsAreDeleted() {
RouteDefinition testRouteDefinition = new RouteDefinition();

Loading…
Cancel
Save