Как консул строит запись SRV

Скажем, я зарегистрировал службу в консуле, чтобы я мог запросить ее примерно так:

      curl http://localhost:8500/v1/catalog/service/BookStore.US

и он возвращается

      [
    {
        "ID": "xxxxx-xxx-...",
        "ServiceName": "BookStore.US",
        ...
    }
]

Если я использую консул непосредственно в своем коде, все в порядке. Но проблема в том, что когда я хочу использовать запись SRV напрямую, это не работает.

Обычно консулом создается служебная запись с именем имя_службы.служба.консул. В приведенном выше случае это «BookStore.US.service.consul».

Так что вы можете использовать команду «копать», чтобы получить его.

      dig @127.0.0.1 -p 8600 BookStore.US.service.consul SRV

Но когда я попытался «выкопать» его, это не удалось с 0 сеансом ответа.

Мой вопрос:

Как консул создает имя службы/SRV (берет некоторые поля в зарегистрированной записи консула и объединяет их?)

Есть ли способ для поиска записей SRV с помощью подстановочных знаков, чтобы, по крайней мере, я мог искать имя SRV, используя ключевое слово "BookStore"

1 ответ

Поиск SRV не работает, потому что Consul интерпретирует .в имени службы в качестве разделителя домена в имени хоста.

Согласно https://www.consul.io/docs/discovery/dns#standard-lookup, поиск службы в Consul может использовать следующий формат.

[тег.]<сервис>.сервис[.центр обработки данных].<домен>

Компоненты тега и центра обработки данных являются необязательными. Остальные компоненты должны быть указаны. Учитывая имя BookStore.US.service.consul, Consul интерпретирует компоненты как:

  • Ярлык: BookStore
  • Обслуживание:
  • Поддомен: service
  • ДВУ: consul

Поскольку у вас нет службы, зарегистрированной под именем , DNS-сервер корректно отвечает нулевыми записями.

Чтобы решить эту проблему, вы можете сделать одну из двух вещей.

  1. Зарегистрируйте службу под другим именем, например bookstore-us.

            {
      "Name": "bookstore-us",
      "Port": 1234
    }
    
  2. Укажите USрасположение в качестве tagв сервисной регистрации.

            {
      "Name": "bookstore",
      "Tags": ["us"],
      "Port": 1234
    }
    

Обратите внимание, что в любом случае имя службы должно быть допустимой меткой DNS. То есть он может содержать только буквы ASCII от a до z (без учета регистра), цифры от 0 до 9 и символ дефиса-минус ('-').

Затем запрос SRV должен успешно вернуть результат поиска службы.

      # Period in hostname changed to a hyphen
$ dig -t SRV bookstore-us.service.consul +short

# If `US` is a tag:

# Standard lookup
$ dig -t SRV us.bookstore.service.consul +short

# RFC 2782-style lookup
$ dig -t SRV _bookstore._us.service.consul +short
Другие вопросы по тегам