解决的办法是在构建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
实现这是你会做驱动的任何事件更新到您的服务器列表,但保持负载平衡器相同。
Hi @hayduke。几个小时后,我们也提出了这个解决方案。非常感谢您确认我们走上了正轨。 :) –