Как консул строит запись 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-сервер корректно отвечает нулевыми записями.
Чтобы решить эту проблему, вы можете сделать одну из двух вещей.
Зарегистрируйте службу под другим именем, например
bookstore-us
.{ "Name": "bookstore-us", "Port": 1234 }
Укажите
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