На самом деле очень просто (в теории):
Настроить два сетевых интерфейса на сервере и настроить ваш сервис чтоб он слушал оба интерфейса.
Дальше переписать клиента так чтобы он использовал оба интерфейса сервера и при отсутствии ответа от основного, перепосылал запрос на резервный
Еще можно не переносить слой отказоустойчивости на уровень приложения, а выбрать готовый протокол транспортного уровня, который обеспечит необходимую функциональность, например SCTP. Правда в этом случае придется переписать еще и сервер :)
Что касается предложенных вариантов с BGP тут надо иметь ввиду, что стандартный holdtime для BGP в интернет составляет 180 секунд. А для магистралов tier-1,2 в разы больше. Ни о каких сабсекундных переключениях посредством BGP и речи быть не может
Ну а при взрослом подходе резервируют не только сеть, но и сами сервера. Собирают их в пулы и балансируют нагрузку лоадбалансерами (ЛБ). При этом вопрос отказоустойчивости переползает на уровень этих самих ЛБ. Отказоустойчивость ЛБ обеспечивается мощной инфраструктурой облачных и/или сервис провайдеров: AWS/GCP/Azure/CloudFlare