【问题标题】:Netflix Ribbon and Polling for Server ListNetflix 功能区和轮询服务器列表
【发布时间】:2016-04-18 17:01:09
【问题描述】:

我目前正在试用 Netflix 功能区库,并且正在尝试动态更新可用端点列表以实现负载平衡。

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

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

但是,我希望能够在httpResourceGroup 中使用DynamicServerList。我设法构建了一个负载均衡器,如下所示:

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

但我找不到替换httpResourceGroup ClientOptions 配置的负载均衡器的方法。

有人知道我该怎么做吗?

【问题讨论】:

    标签: load-balancing hystrix netflix netflix-ribbon


    【解决方案1】:

    解决方案是在构造HttpResourceGroup 时不指定withConfigurationBasedServerList(),因为我相信这是一个固定列表,但我不确定。有很多方法可以初始化动态负载均衡器(通常您永远不会将其换出,而是重用相同的负载均衡器并在新的Servers 可用或消失时换出它们。最直接的方法可能是通过基于 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 实现,您可以在其中对服务器列表进行任何事件驱动的更新,但保持负载平衡器不变。

    【讨论】:

    • 嗨@hayduke。几个小时后,我们也想出了这个解决方案。非常感谢您确认我们走在正确的轨道上。 :)
    猜你喜欢
    • 2018-01-03
    • 2017-01-02
    • 2021-05-13
    • 2014-11-09
    • 2018-11-02
    • 2019-06-19
    • 2012-04-15
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多