首页 > 解决方案 > vertx single webClient 连接到多个服务器集群以实现负载平衡并避免连接失败

问题描述

我们使用以下方法使用 Web 客户端连接到服务器 fts.server。

webClient.post(config.getInteger("fts.port"), config.getString("fts.server"), config.getString("fts.indexpath")).putHeader(HttpHeaders.Names.AUTHORIZATION, "Basic " + base64key).sendJsonObject(jreq, ar -> {
                    if (ar.succeeded()) {
            }
            else 
            { 
            }
} 

就我而言,我有 fts.server1 、 fts.server2 、 fts.server3 都提供相同的服务。我需要对服务器之间的调用进行负载平衡,如果其中任何一个离线,请尝试另一台服务器。就像是

webClient.post(config.getInteger("fts.port"), (config.getString("fts.server1")) or config.getString("fts.server2")) or config.getString("fts.server3"))   , config.getString("fts.indexpath")).putHeader(HttpHeaders.Names.AUTHORIZATION, "Basic " + base64key).sendJsonObject(jreq, ar -> {
                    if (ar.succeeded()) {
            }
            else 
            { 
            }
}

我该怎么做 ?

标签: javarestwebclientvert.x

解决方案


首先,有负载均衡器,专门为此。

但到了手头。与其拥有一个客户端并尝试对其进行负载平衡,不如创建 N 个客户端并在它们之间进行负载平衡。

使用 Java9:

var list = List.of(WebClient.create(vertx, new WebClientOptions().setDefaultHost("fts1")),
                WebClient.create(vertx, new WebClientOptions().setDefaultHost("fts2")),
                WebClient.create(vertx, new WebClientOptions().setDefaultHost("fts3")));

现在由您决定如何在它们之间进行负载平衡。

随机的?

Random r = new Random();
WebClient c = list.get(r.nextInt(list.size()));

循环赛?

AtomicInteger count = new AtomicInteger();
WebClient c = list.get(count.getAndIncrement() % list.size());

这取决于你。


推荐阅读