public static RoundRobinProxyHandler createStatisticalRoundRobinHandler( ClientFactory factory, ProxyRouteConfig config, SocketAddressHelper addressHelper) { return new RoundRobinProxyHandler(factory, config, addressHelper, ThreadLocalRandom::current); }
@Override public Optional<ClientConfig> getClientConfig(ChannelHandlerContext ctx, Request request) { // get/create the cachedClientConfig that is instanced per server channel IntObjectMap<Optional<ClientConfig>> cachedClientConfig = ctx.channel().attr(ROUND_ROBIN_KEY).get(); if (cachedClientConfig == null) { cachedClientConfig = new IntObjectHashMap<>(); ctx.channel().attr(ROUND_ROBIN_KEY).set(cachedClientConfig); } return getClientConfig(cachedClientConfig, request); }
@VisibleForTesting RoundRobinProxyHandler( ClientFactory factory, ProxyRouteConfig config, SocketAddressHelper addressHelper, Supplier<Random> randomSupplier) { super(factory, config, addressHelper); if (randomSupplier == null) { this.computationFunction = this::computeRoundRobin; } else { this.computationFunction = () -> this.computeStatisticalRoundRobin(randomSupplier); } }
when(config.clientConfigs()).thenReturn(clientConfigs); Random mockRandom = mock(Random.class); subject = new RoundRobinProxyHandler(null, config, null, () -> mockRandom); ClientConfig result1 = subject.getClientConfig(cacheMap, request1).orElse(null); assertEquals(clientConfig1, result1); ClientConfig result2 = subject.getClientConfig(cacheMap, request2).orElse(null); assertEquals(clientConfig2, result2); ClientConfig result3 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig3, result3); ClientConfig result4 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig1, result4);
@Test public void testFullRequestsStandard() { when(config.clientConfigs()).thenReturn(clientConfigs); subject = RoundRobinProxyHandler.createStandardRoundRobinHandler(null, config, null); ClientConfig result1 = subject.getClientConfig(cacheMap, request1).orElse(null); assertEquals(clientConfig1, result1); ClientConfig result2 = subject.getClientConfig(cacheMap, request2).orElse(null); assertEquals(clientConfig2, result2); ClientConfig result3 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig3, result3); ClientConfig result4 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig1, result4);
when(config.clientConfigs()).thenReturn(clientConfigs); Random mockRandom = mock(Random.class); subject = new RoundRobinProxyHandler(null, config, null, () -> mockRandom); ClientConfig result1 = subject.getClientConfig(cacheMap, request1).orElse(null); assertEquals(clientConfig1, result1); ClientConfig result2 = subject.getClientConfig(cacheMap, request2).orElse(null); assertEquals(clientConfig1, result2); ClientConfig result3 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig1, result3);
@Test public void testChunkedRequestsHttp1Standard() { when(config.clientConfigs()).thenReturn(clientConfigs); subject = RoundRobinProxyHandler.createStandardRoundRobinHandler(null, config, null); ClientConfig result1 = subject.getClientConfig(cacheMap, request1).orElse(null); assertEquals(clientConfig1, result1); ClientConfig result2 = subject.getClientConfig(cacheMap, request2).orElse(null); assertEquals(clientConfig1, result2); ClientConfig result3 = subject.getClientConfig(cacheMap, request3).orElse(null); assertEquals(clientConfig1, result3);
when(config.clientConfigs()).thenReturn(clientConfigs); Random mockRandom = mock(Random.class); subject = new RoundRobinProxyHandler(null, config, null, () -> mockRandom); ClientConfig result1a = subject.getClientConfig(cacheMap, request1a).orElse(null); assertEquals(clientConfig1, result1a); ClientConfig result1b = subject.getClientConfig(cacheMap, request1b).orElse(null); assertEquals(clientConfig2, result1b); ClientConfig result2a = subject.getClientConfig(cacheMap, request2a).orElse(null); assertEquals(clientConfig1, result2a); ClientConfig result2b = subject.getClientConfig(cacheMap, request2b).orElse(null); assertEquals(clientConfig2, result2b); ClientConfig result3a = subject.getClientConfig(cacheMap, request3a).orElse(null); assertEquals(clientConfig1, result3a); ClientConfig result3b = subject.getClientConfig(cacheMap, request3b).orElse(null); assertEquals(clientConfig2, result3b);
@Test public void testChunkedRequestsHttp2Standard() { when(config.clientConfigs()).thenReturn(clientConfigs); subject = RoundRobinProxyHandler.createStandardRoundRobinHandler(null, config, null); ClientConfig result1a = subject.getClientConfig(cacheMap, request1a).orElse(null); assertEquals(clientConfig1, result1a); ClientConfig result1b = subject.getClientConfig(cacheMap, request1b).orElse(null); assertEquals(clientConfig2, result1b); ClientConfig result2a = subject.getClientConfig(cacheMap, request2a).orElse(null); assertEquals(clientConfig1, result2a); ClientConfig result2b = subject.getClientConfig(cacheMap, request2b).orElse(null); assertEquals(clientConfig2, result2b); ClientConfig result3a = subject.getClientConfig(cacheMap, request3a).orElse(null); assertEquals(clientConfig1, result3a); ClientConfig result3b = subject.getClientConfig(cacheMap, request3b).orElse(null); assertEquals(clientConfig2, result3b);
public static RoundRobinProxyHandler createStandardRoundRobinHandler( ClientFactory factory, ProxyRouteConfig config, SocketAddressHelper addressHelper) { return new RoundRobinProxyHandler(factory, config, addressHelper, null); }