2016-01-13 4 views
0

Я сейчас тестирую библиотеку лент Netflix, и я пытаюсь динамически обновлять список доступных конечных точек для загрузки баланса.Netflix Ribbon и опрос для списка серверов

Я успешно создал httpResourceGroup, который использует список серверов конфигурации на основе и т.д .:

httpResourceGroup = Ribbon.createHttpResourceGroup("searchServiceClient", 
        ClientOptions.create() 
          .withMaxAutoRetriesNextServer(3) 
          .withLoadBalancerEnabled(true) 
          .withConfigurationBasedServerList(serverList)) 

, но я хотел бы быть в состоянии использовать DynamicServerList в httpResourceGroup. Я сумел построить систему балансировки нагрузки следующим образом:

LoadBalancerBuilder.<Server>newBuilder() 
        .withDynamicServerList(servicesList) 
        .buildDynamicServerListLoadBalancer(); 

, но я не могу найти способ, чтобы выгрузить балансировки нагрузки, выполненные с помощью httpResourceGroup ClientOptions.

Кто-нибудь знает, как я могу это сделать?

ответ

1

Решение должно не указывать 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 реализацию, которая, где вы могли бы сделать любое событие, приводимый обновления в списке серверов, но сохраните балансировку нагрузки одинаково.

+0

Hi @hayduke. Через несколько часов мы также придумали это решение. Большое спасибо за подтверждение того, что мы были на правильном пути. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^