Создание бэкэндов по пути

Я использую HAProxy в качестве прокси-сервера перед Consul, реестром микросервисов. Я использую HAProxy для маршрутизации трафика к определенному бэкэнду в зависимости от типа узла (какой сервис он запускает, активен ли он, какая у него версия и т. д. и т. д.)

Пока что я могу использовать HAProxy, чтобы увидеть, с чего начинается путь, и направить его к одному бэкэнду, например, если путь начинается с /blog, он перейдет к бэкенду блога.

Мой вопрос: когда есть несколько критериев для выбора бэкэнда, как мне создать указанные бэкэнды? Могу ли я их как-то вложить? Должен ли я просто исчерпывающе перечислить все комбинации критериев и добавить для этого бэкэнд?


person Thomas Oo    schedule 08.06.2017    source источник
comment
Ваш вопрос кажется немного неясным, но я попытался ответить на то, о чем вы, кажется, спрашиваете. Пожалуйста, отредактируйте вопрос, чтобы уточнить, если я неправильно понял ваш вопрос.   -  person Michael - sqlbot    schedule 09.06.2017


Ответы (1)


backend — это один или несколько серверов (служб, конечных точек), которые могут обрабатывать один и тот же набор запросов. Вы определяете серверные части не на основе того, что к ним идет, а скорее исходя из того, что может к ним идти.

Например, если у вас есть набор серверов, которые могут обслуживать несколько видов статических ресурсов, вы не будете создавать серверную часть для javascript, еще одну для CSS, еще одну для изображений. Вы бы сделали один.

backend static-assets
    mode http
    server static-1 203.0.113.100:80
    server static-2 203.0.113.200:80

Затем направьте соответствующие запросы на этот сервер.

Вы можете сделать это несколькими способами.

Анонимные ACL, по одному на шаблон:

frontend main
    mode http
    bind :80
    use_backend static-assets if { path_end .js }
    use_backend static-assets if { path_end .css }
    use_backend static-assets if { path_end .png }

Анонимные ACL с явным || (логическое ИЛИ):

frontend main
    mode http
    bind :80
    use_backend static-assets if { path_end .js } || { path_end .css } || { path_end .png }

Или используйте именованные ACL. Каждая строка в именованном ACL выполняется по схеме ИЛИ — для соответствия ACL должна совпадать только одна строка.

frontend main
    mode http
    bind :80
    acl is_static path_end .js
    acl is_static path_end .css
    acl is_static path_end .png
    use_backend static-assets if is_static

Или используйте любую их комбинацию.

Первая директива use_backend для сопоставления — это серверная часть, на которую будет направлен запрос — они обрабатываются в определенном порядке. Не должно быть необходимости в «вложенности».

person Michael - sqlbot    schedule 09.06.2017
comment
Я понимаю что ты имеешь ввиду. Возможно, мне нужно переосмыслить то, как я использую HAProxy. Я пытаюсь в основном определить бэкэнды, но также иметь дескрипторы для бэкэндов.. так что бэкэнд со статическими активами, но также и бэкэнд со статическими активами версии 5, если это имеет смысл. - person Thomas Oo; 09.06.2017
comment
@ThomasOo, значит, статические активы v5 будут обрабатываться совершенно другим набором серверов, чем, скажем, активы v4? Возможно, вы могли бы добавить пример того, как вы делаете что-то в настоящее время, а затем объяснить, что в связи с этим не работает так, как вам хотелось бы. - person Michael - sqlbot; 09.06.2017
comment
Еще одно замечание: HAProxy очень хорошо работает на небольших серверах, поэтому иногда логично и выгодно иметь более одного уровня. У меня есть случаи, когда некоторые запросы проходят через два или три уровня HAProxy. например интерфейсный уровень 1 HAProxy направляет все /api/* на уровень 2 HAProxy, который маршрутизирует по определенным путям внутри /api/, поэтому реконфигурации API не могут сломать что-либо еще, обрабатываемое на уровне 1. Некоторые из внутренних пунктов назначения уровня 2 могут быть третий уровень HAProxy по разным причинам. Это звучит неэффективно, но работает очень хорошо и четко разделяет задачи. - person Michael - sqlbot; 09.06.2017
comment
Да. v5 и v4 будут обрабатываться совершенно другим набором серверов. На самом деле я думал о том, чтобы пойти по маршруту с несколькими серверами HAProxy, но меня беспокоит то, что количество уровней будет увеличиваться по мере увеличения количества фильтров, если это имеет смысл? - person Thomas Oo; 09.06.2017
comment
В моем случае используется HAProxy в качестве прокси для обслуживания нескольких микросервисов. Эти микросервисы помечены своим именем и любым количеством других тегов, таких как номер версии, статус активности и т. д. Я бы хотел, чтобы HAProxy направлял маршрут к нужным сервисам с учетом желаемой специфики. Если мне все равно, какой номер версии я получу, я пропущу его и буду перенаправлен на серверы, которые соответствуют остальной части моего запроса (скажем, я ввел имя и статус активности). Пока я очень наивно создаю бэкенды со всеми комбинациями тегов. На данный момент есть только 5 ~ тегов, так что это не так много, но это не очень масштабируемо. - person Thomas Oo; 09.06.2017