public static void init() {
System.setProperty(“spring.cloud.gateway.routes[0].id”, “account-service”);
System.setProperty(“spring.cloud.gateway.routes[0].uri”, “http://localhost:” + mockServer.getServerPort());
System.setProperty(“spring.cloud.gateway.routes[0].predicates[0]”, “Path=/account/**”);
System.setProperty(“spring.cloud.gateway.routes[0].filters[0]”, “RewritePath=/account/(?
System.setProperty(“spring.cloud.gateway.routes[0].filters[1].name”, “RequestRateLimiter”);
System.setProperty(“spring.cloud.gateway.routes[0].filters[1].args.redis-rate-limiter.replenishRate”, “10”);
System.setProperty(“spring.cloud.gateway.routes[0].filters[1].args.redis-rate-limiter.burstCapacity”, “20”);
System.setProperty(“spring.redis.host”, “localhost”);
System.setProperty(“spring.redis.port”, “” + redis.getMappedPort(6379));
new MockServerClient(mockServer.getContainerIpAddress(), mockServer.getServerPort())
.when(HttpRequest.request()
.withPath(“/1”))
.respond(response()
.withBody(“{“id”:1,“number”:“1234567890”}”)
.withHeader(“Content-Type”, “application/json”));
}
@Test
@BenchmarkOptions(warmupRounds = 0, concurrency = 6, benchmarkRounds = 600)
public void testAccountService() {
ResponseEntity r = template.exchange(“/account/{id}”, HttpMethod.GET, null, Account.class, 1);
LOGGER.info(“Received: status->{}, payload->{}, remaining->{}”, r.getStatusCodeValue(), r.getBody(), r.getHeaders().get(“X-RateLimit-Remaining”));
// Assert.assertEquals(200, r.getStatusCodeValue());
// Assert.assertNotNull(r.getBody());
// Assert.assertEquals(Integer.valueOf(1), r.getBody().getId());
// Assert.assertEquals(“1234567890”, r.getBody().getNumber());
}
}
执行Test类: 发现超过20之后会被拦截返回429,运行过程中随着令牌的放入会不断有请求成功。
14:20:32.242 — [pool-2-thread-1] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[18]
14:20:32.242 — [pool-2-thread-4] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[16]
14:20:32.242 — [pool-2-thread-2] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[14]
14:20:32.242 — [pool-2-thread-3] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[15]
14:20:32.242 — [pool-2-thread-6] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[17]
14:20:32.242 — [pool-2-thread-5] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[19]
14:20:32.294 — [pool-2-thread-4] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[15]
14:20:32.297 — [pool-2-thread-6] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[19]
14:20:32.304 — [pool-2-thread-3] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[18]
14:20:32.308 — [pool-2-thread-5] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[16]
14:20:32.309 — [pool-2-thread-1] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[17]
14:20:32.312 — [pool-2-thread-2] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[14]
14:20:32.320 — [pool-2-thread-4] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[13]
14:20:32.326 — [pool-2-thread-6] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[12]
14:20:32.356 — [pool-2-thread-4] : Received: status->200, payload->Account(id=1, number=1234567890), remaining->[7]<