Я экспериментировал с установкой, которая очень похожа на один подробно в изображении здесь: https://raw.githubusercontent.com/Oreste-Luci/netflix-oss-example/master/netflix-oss-example.pngЧто такое канонический способ развертывания синего/зеленого с стеком Spring Cloud/Netflix на PWS?
В моей установке, я использую клиентское приложение (https://www.joedog.org/siege-home/), прокси-сервер (Zuul), сервис обнаружения (Eureka) и простой микросервис. Все развертывается на PWS.
Я хочу перейти от одной версии моего простого микросервиса к следующему без простоя. Первоначально я начал с описанной здесь методики: https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html
На мой взгляд, этот подход не «совместим» с сервисом обнаружения, таким как Eureka. Фактически, новая версия моей службы зарегистрирована в Eureka и получает трафик еще до того, как я смогу переназначить все маршруты (CF-маршрутизатор).
Это привело меня к другому подходу, в котором я опираться на механизмы отказоустойчивых в Spring Cloud/Netflix:
- Я раскрутить новый (обратная совместимость) версию моей службы.
- Когда эта версия подхвачена Zuul/Eureka, она начинает получать 50% трафика.
- Как только я проверил, что новая версия работает правильно, я снимаю «старый» экземпляр. (Я просто нажмите на кнопку «стоп» в PWS)
Как я понимаю, Zuul использует ленты (балансировка нагрузки) под капотом, так в ту долю секунды, когда старый экземпляр все еще находится в Eureka, но на самом деле закрытие , Я ожидаю повторение нового экземпляра без какого-либо влияния на клиента.
Однако мое предположение неверно. Я получаю несколько 502 ошибок в моем клиенте:
Lifting the server siege... done.
Transactions: 5305 hits
Availability: 99.96 %
Elapsed time: 59.61 secs
Data transferred: 26.06 MB
Response time: 0.17 secs
Transaction rate: 89.00 trans/sec
Throughput: 0.44 MB/sec
Concurrency: 14.96
Successful transactions: 5305
Failed transactions: 2
Longest transaction: 3.17
Shortest transaction: 0.14
Часть моей application.yml
server:
port: ${PORT:8765}
info:
component: proxy
ribbon:
MaxAutoRetries: 2 # Max number of retries on the same server (excluding the first try)
MaxAutoRetriesNextServer: 2 # Max number of next servers to retry (excluding the first server)
OkToRetryOnAllOperations: true # Whether all operations can be retried for this client
ServerListRefreshInterval: 2000 # Interval to refresh the server list from the source
ConnectTimeout: 3000 # Connect timeout used by Apache HttpClient
ReadTimeout: 3000 # Read timeout used by Apache HttpClient
hystrix:
threadpool:
default:
coreSize: 50
maxQueueSize: 100
queueSizeRejectionThreshold: 50
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
я не уверен, что пойдет не так.
Это техническая проблема?
Или я делаю неправильные предположения (я читал где-то, что POST не подвергаются повторному рассмотрению, что я действительно не понимаю)?
Хотелось бы услышать, как вы это делаете.
Спасибо, Andy
Хорошая идея. Я тоже смотрю на это. Но я не уверен в том, чтобы сделать это на стороне Eureka - если служба отправит новое сердцебиение, не изменит ли он свое состояние снова на UP? Весеннее облако содержит конечную точку/pause и/resume, которая, как я думаю, изменяет состояние клиента на OUT_OF_SERVICE или DOWN. Я думал о сценарии развертывания, который отправляет/приостанавливает перед развертыванием. Список экземпляров, чтобы отправить это, можно было потянуть из Eureka и отфильтровать по версии или что-то еще. – nedenom
Я тоже смотрел в состояние OUT_OF_SERVICE. Из того, что я понимаю, похоже, что Asgard придерживается аналогичного подхода: https://github.com/Netflix/asgard/wiki/Eureka-Integration Я пришел к выводу, что для реализации скользящих обновлений на PWS нам нужно обычная, домашняя приборная панель (например, Asgard), которая будет способствовать этому. Представление PWS слишком ограничено для этого. AFAIK нет библиотеки Spring, которая делает это. Я не понимал, что для этого я мог бы создать свои собственные конечные точки REST, поэтому я начал с REST api самой Eureka. Я посмотрю на это - спасибо! –
@nedenom, если вы установите статус в положение «ВНИЗ», он автоматически будет установлен на UP снова через 30 секунд. Если вы установите статус OUT_OF_SERVICE, он останется таким, пока вы вручную (через REST api) не установите его UP/DOWN. –