Vertx Single WebClient подключиться к кластеру нескольких серверов для балансировки нагрузки и предотвращения сбоев подключения - PullRequest
0 голосов
/ 21 февраля 2019

Мы подключаемся к серверу 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 голосов
/ 22 февраля 2019

Во-первых, есть балансировщики нагрузки, специально для этого.

Но к делу.Вместо того, чтобы иметь одного клиента и пытаться сбалансировать его, создайте 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());

Это зависит от вас.

...