private static WebClient newLoadBalancingClient() throws ExecutionException, InterruptedException {
        // Send HTTP health check requests to '/internal/l7check' every 10 seconds.
        final HealthCheckedEndpointGroup healthCheckedGroup =
                HealthCheckedEndpointGroup.builder(animationGroup, "/internal/l7check")
                                          .protocol(SessionProtocol.HTTP)
                                          .retryInterval(Duration.ofSeconds(10))
                                          .build();

        // Wait until the initial health check is finished.
        healthCheckedGroup.whenReady().get();

        return WebClient.builder(SessionProtocol.HTTP, healthCheckedGroup)
                        // Disable timeout to serve infinite streaming response.
                        .responseTimeoutMillis(0)
                        .decorator(LoggingClient.newDecorator())
                        .build();
    }
We used hardcoded backend addresses. But you can use other service discovery mechanisms to configure
backends dynamically using {@link DnsServiceEndpointGroup}, ZooKeeper or Central Dogma.
See <a href="https://armeria.dev/docs/client-service-discovery">service discovery</a>,
<a href="https://armeria.dev/docs/advanced-zookeeper">Service discovery
with ZooKeeper</a> and <a href="https://line.github.io/centraldogma/">centraldogma</a>.
examples/proxy-server/src/main/java/example/armeria/proxy/ProxyService.java