我目前正在试用Netflix功能区库,而我正试图动态更新可用端点列表以实现负载均衡。
我已成功创建使用基于配置的服务器列表的httpResourceGroup
,例如:
httpResourceGroup = Ribbon.createHttpResourceGroup("searchServiceClient",
ClientOptions.create()
.withMaxAutoRetriesNextServer(3)
.withLoadBalancerEnabled(true)
.withConfigurationBasedServerList(serverList))
但是,我希望能够在DynamicServerList
中使用httpResourceGroup
。我设法建立了一个负载均衡器,如下所示:
LoadBalancerBuilder.<Server>newBuilder()
.withDynamicServerList(servicesList)
.buildDynamicServerListLoadBalancer();
但我无法找到替换httpResourceGroup
ClientOptions
配置的负载均衡器的方法。
任何人都知道我该怎么做?
答案 0 :(得分: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("/users/{userId}/recommendations")
.withFallbackProvider(new RecommendationServiceFallbackHandler())
.withResponseValidator(new RecommendationServiceResponseValidator())
.build();
Observable<ByteBuf> result = recommendationsByUserIdTemplate.requestBuilder()
.withRequestProperty("userId", “user1")
.build()
.observe();
听起来你已经有ServerList
实现,你可以在其中对服务器列表进行任何事件驱动的更新,但保持负载均衡器不变。