Мы используем кочевник для развертывания наших приложений, которые обеспечивают gRPC конечные точки - как задачи. Затем задачи регистрируются в Консул, с помощью строфа службы кочевника.
Маршрутизация для наших приложений достигается с помощью доверенное лицо посланника. Мы запускаем центральные экземпляры посланников с балансировкой нагрузки по IP 10.1.2.2
.
Решение, к какой конечной точке / задаче направить, в настоящее время основывается на host
заголовок, и каждая задача регистрируется как служба в <$JOB>.our.cloud
. Это приводит к двум проблемам.
При доступе к службе имя DNS должно быть зарегистрировано для IP-адреса балансировщика нагрузки, что приводит к /etc/hosts
записи вроде
10.1.2.2 serviceA.our.cloud serviceB.our.cloud serviceC.our.cloud
Эта проблема частично решается за счет использования dnsmasq
, но все равно немного раздражает, когда мы добавляем новые службы
Невозможно одновременно запустить несколько служб, которые предоставляют одну и ту же службу gRPC. Если мы, например, решили протестировать новую реализацию службы, нам нужно запустить ее в том же job
под тем же именем и должны быть реализованы все службы, которые определены в файле службы gRPC.
Возможное решение, которое мы обсуждали, - использовать tags
из service
раздел для добавления тегов, которые определяют предоставляемые службы gRPC, например:
service {
tags = ["grpc-my.company.firstpackage/ServiceA", "grpc-my.company.secondpackage/ServiceB"]
}
Но это обескураживает Консул:
Dots are not supported because Consul internally uses them to delimit service tags.
Теперь мы думали сделать это с помощью таких тегов, как grpc-my-company-firstpackage__ServiceA
, ... Это выглядит действительно отвратительно :-(
) Итак, мой вопрос: