Решение должно не указывать withConfigurationBasedServerList()
при построении HttpResourceGroup
, так как я считаю, что это предназначено для фиксированного списка, хотя я не уверен. Существует много способов инициализации динамического балансировщика нагрузки (как правило, вы никогда не замените его, но повторно используете один и тот же балансировщик нагрузки и заменяете новые Server
, так как они становятся доступными или уходят. Самый простой способ сделать это может быть через Archaius основанная конфигурация.
Вариант 1
Создать config.properties
файл на пути к классам, содержащих следующие
ribbon.NIWSServerListClassName=com.example.MyServerList
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
Вариант 2
System.setProperty("ribbon.NIWSServerListClassName", "com.example.MyServerList");
System.setProperty("ribbon.NFLoadBalancerRuleClassName", "com.netflix.loadbalancer.RoundRobinRule");
Создать реализацию SERVERLIST
import java.util.Arrays;
import java.util.List;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
public class MyServerList implements ServerList<Server> {
@Override
public final List<Server> getUpdatedListOfServers() {
// TODO do some fancy stuff here
return Arrays.asList(new Server("1.2.3.4", 8888), new Server("5.6.7.8", 9999));
}
@Override
public final List<Server> getInitialListOfServers() {
return Arrays.asList(new Server("1.2.3.4", 8888), new Server("5.6.7.8", 9999));
}
}
Выполнить код
HttpResourceGroup httpResourceGroup = Ribbon.createHttpResourceGroup("searchServiceClient",
ClientOptions.create()
.withMaxAutoRetriesNextServer(3);
HttpRequestTemplate<ByteBuf> recommendationsByUserIdTemplate = httpResourceGroup.newTemplateBuilder("recommendationsByUserId", ByteBuf.class)
.withMethod("GET")
.withUriTemplate("https://stackoverflow.com/users/{userId}/recommendations")
.withFallbackProvider(new RecommendationServiceFallbackHandler())
.withResponseValidator(new RecommendationServiceResponseValidator())
.build();
Observable<ByteBuf> result = recommendationsByUserIdTemplate.requestBuilder()
.withRequestProperty("userId", “user1")
.build()
.observe();
Это звучит, как вы уже есть ServerList
реализацию, которая, где вы могли бы сделать любое событие, приводимый обновления в списке серверов, но сохраните балансировку нагрузки одинаково.
Hi @hayduke. Через несколько часов мы также придумали это решение. Большое спасибо за подтверждение того, что мы были на правильном пути. :) –