1

我目前正在试用 Netflix Ribbon 库,并且正在尝试动态更新可用端点列表以进行负载平衡。

我已经成功创建了一个httpResourceGroup使用基于配置的服务器列表,例如:

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

但是,我希望能够DynamicServerListhttpResourceGroup. 我设法构建了一个负载均衡器,如下所示:

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

但我找不到一种方法来换出由httpResourceGroup ClientOptions.

有谁知道我该怎么做?

4

1 回答 1

2

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("/users/{userId}/recommendations")
                .withFallbackProvider(new RecommendationServiceFallbackHandler())
                .withResponseValidator(new RecommendationServiceResponseValidator())
                .build();
    Observable<ByteBuf> result = recommendationsByUserIdTemplate.requestBuilder()
                            .withRequestProperty("userId", “user1")
                            .build()
                            .observe();

听起来您已经有了一个ServerList实现,您可以在其中对服务器列表进行任何事件驱动的更新,但保持负载均衡器相同。

于 2016-01-14T22:34:21.050 回答