2016-01-13 34 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。几个小时后,我们也提出了这个解决方案。非常感谢您确认我们走上了正轨。 :) –