2016-01-13 64 views
0

我目前正在嘗試使用Netflix功能區庫,並試圖動態更新可用端點列表以實現負載平衡。Netflix功能區和服務器列表輪詢

我已經成功地創建了一個使用基於配置服務器列表中的httpResourceGroup,例如:

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

,但我希望能夠在httpResourceGroup使用DynamicServerList。我已經成功地建立一個負載平衡器如下:

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

,但我不能找到一種方法,換出由httpResourceGroup ClientOptions配置負載平衡器。

任何人都知道我該怎麼做?

回答

1

解決的辦法是在構建HttpResourceGroup時不指定withConfigurationBasedServerList(),因爲我相信這是爲了固定列表,儘管我不確定。有很多方法可以初始化動態負載均衡器(通常您不會將其交換出去,但可以重新使用相同的負載均衡器,並在新的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。幾個小時後,我們也提出了這個解決方案。非常感謝您確認我們走上了正軌。 :) –