当前位置: 代码迷 >> java >> vertx单个webClient连接到多个服务器群集以实现负载平衡并避免连接失败
  详细解决方案

vertx单个webClient连接到多个服务器群集以实现负载平衡并避免连接失败

热度:22   发布时间:2023-07-16 17:31:33.0

我们使用以下方法使用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 
            { 
            }
}

我该怎么做 ?

首先,有专门用于此目的的负载均衡器。

但是到现在为止。 创建一个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());

随你(由你决定。