Я использую Ribbon без Eureka. Я использую ConfigurationBasedServerList, чтобы предоставить список таких экземпляров сервера.
customerinfo.ribbon.listOfServers=localhost:9003,localhost:9008
Я настроил PingURL с конечной точкой /health. Я также настроил AvailabilityFilteringRule, который должен фильтровать недоступные серверы. вот так..
public class RibbonConfig {
@Autowired
IClientConfig ribbonClientConfig;
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl(true, "/health");
}
@Bean
public IRule ribbonRule(IClientConfig config) {
return new AvailabilityFilteringRule();
}
}
В основном это работает хорошо. В одном случае не работает. Это тот случай, когда экземпляр сервера, работающий на порту 9008, не работает.
Позвольте мне объяснить некоторые сообщения DEBUG.
DEBUG com.netflix.loadbalancer.DynamicServerListLoadBalancer - List of Servers for customerinfo obtained from Discovery client: [localhost:9003, localhost:9008]
DEBUG com.netflix.loadbalancer.DynamicServerListLoadBalancer - Filtered List of Servers for customerinfo obtained from Discovery client: [localhost:9003, localhost:9008]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: clearing server list (SET op)
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9003]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9008]
com.netflix.loadbalancer.DynamicServerListLoadBalancer - Setting server list for zones: {unknown=[localhost:9003, localhost:9008]}
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: clearing server list (SET op)
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9003]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: addServer [localhost:9008]
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: forceQuickPing invoked
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: PingTask executing [2] servers configured
DEBUG com.netflix.loadbalancer.BaseLoadBalancer - LoadBalancer: Server [localhost:9008] status changed to DEAD
Глядя на сообщения DEBUG. Дальнейший процесс выглядит следующим образом: 1) Очистите список серверов и снова добавьте серверы из конфигурации. 2) Пропингуйте их, чтобы узнать их статус. 3) Обновите список доступных серверов в зависимости от результатов пинга.
Кажется, что каждые 30 секунд происходит описанный выше процесс, который должен поддерживать DynamicServerList.
Теперь проблема в том, что от первого оператора журнала до предпоследнего оператора журнала лента считает, что оба экземпляра сервера доступны. Таким образом, если в течение этого времени поступает запрос на балансировку нагрузки, есть вероятность, что он будет отправлен на сервер localhost:9008, который отключен.
Насколько я понимаю, библиотека Ribbon не хранит PingStatistics. Я думаю, что библиотека зависит от инструментов обнаружения служб, таких как Eureka, для предоставления динамического списка серверов, которые исправны в зависимости от некоторых проверок работоспособности.
Теперь, чтобы решить эту проблему, я могу начать использовать Eureka, и эта проблема может исчезнуть. Я не хочу использовать Eureka, так как моя среда не часто увеличивается/уменьшается... она довольно статична.
Есть ли конфигурация, которую мне здесь не хватает? Как решить эту проблему?
Я использую «весеннюю облачную стартовую ленту» версии 1.2.6.RELEASE.