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

时间:2019-02-20 23:55:04

标签: java rest webclient vert.x

我们使用以下方法使用网络客户端连接到服务器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 
            { 
            }
}

我该怎么做?

1 个答案:

答案 0 :(得分:0)

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

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

由您决定。