解決的辦法是在構建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。幾個小時後,我們也提出了這個解決方案。非常感謝您確認我們走上了正軌。 :) –