consul如何构造SRV记录
How consul constructs SRV record
假设我在 consul 中注册了一个服务,这样我就可以通过类似的方式查询它:
curl http://localhost:8500/v1/catalog/service/BookStore.US
它returns
[
{
"ID": "xxxxx-xxx-...",
"ServiceName": "BookStore.US",
...
}
]
如果我在我的代码中直接使用 consul 就可以了。但是问题是,当我想直接使用SRV记录的时候,是不行的。
通常情况下,consul 会创建一个名为service_name.service.consul 的服务记录。在上面的例子中,它是“BookStore.US.service.consul”
以便您可以使用“dig”命令来获取它。
dig @127.0.0.1 -p 8600 BookStore.US.service.consul SRV
但是当我试图“挖掘”它时,它失败了,回答会话为 0。
我的问题:
consul如何构造service/SRV名称(在注册的consul记录中提取一些字段并连接它们?)
有什么方法可以用通配符搜索SRV记录,这样至少我可以使用关键字“BookStore”搜索SRV名称
SRV 查找不起作用,因为 Consul 将服务名称中的 .
解释为主机名中的域分隔符。
根据 https://www.consul.io/docs/discovery/dns#standard-lookup,Consul 中的服务查找可以使用以下格式。
[tag.]<service>.service[.datacenter].<domain>
标签和数据中心组件是可选的。必须指定其他组件。给定名称 BookStore.US.service.consul
,Consul 将组件解释为:
- 标签:
BookStore
- 服务:
US
- Sub-domain:
service
- 顶级域名:
consul
由于您没有使用名称 US
注册的服务,DNS 服务器正确响应零记录。
要解决此问题,您可以执行以下两项操作之一。
用不同的名称注册服务,例如bookstore-us
.
{
"Name": "bookstore-us",
"Port": 1234
}
在服务注册中将 US
位置指定为 tag
。
{
"Name": "bookstore",
"Tags": ["us"],
"Port": 1234
}
请注意,无论哪种情况,服务名称都应该是有效的 DNS 标签。也就是说,它可能只包含 ASCII 字母 a 到 z(以 case-insensitive 方式)、数字 0 到 9 和 hyphen-minus 字符('-')。
然后 SRV 查询应该会成功 return 服务查找的结果。
# 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
假设我在 consul 中注册了一个服务,这样我就可以通过类似的方式查询它:
curl http://localhost:8500/v1/catalog/service/BookStore.US
它returns
[
{
"ID": "xxxxx-xxx-...",
"ServiceName": "BookStore.US",
...
}
]
如果我在我的代码中直接使用 consul 就可以了。但是问题是,当我想直接使用SRV记录的时候,是不行的。
通常情况下,consul 会创建一个名为service_name.service.consul 的服务记录。在上面的例子中,它是“BookStore.US.service.consul”
以便您可以使用“dig”命令来获取它。
dig @127.0.0.1 -p 8600 BookStore.US.service.consul SRV
但是当我试图“挖掘”它时,它失败了,回答会话为 0。
我的问题:
consul如何构造service/SRV名称(在注册的consul记录中提取一些字段并连接它们?)
有什么方法可以用通配符搜索SRV记录,这样至少我可以使用关键字“BookStore”搜索SRV名称
SRV 查找不起作用,因为 Consul 将服务名称中的 .
解释为主机名中的域分隔符。
根据 https://www.consul.io/docs/discovery/dns#standard-lookup,Consul 中的服务查找可以使用以下格式。
[tag.]<service>.service[.datacenter].<domain>
标签和数据中心组件是可选的。必须指定其他组件。给定名称 BookStore.US.service.consul
,Consul 将组件解释为:
- 标签:
BookStore
- 服务:
US
- Sub-domain:
service
- 顶级域名:
consul
由于您没有使用名称 US
注册的服务,DNS 服务器正确响应零记录。
要解决此问题,您可以执行以下两项操作之一。
用不同的名称注册服务,例如
bookstore-us
.{ "Name": "bookstore-us", "Port": 1234 }
在服务注册中将
US
位置指定为tag
。{ "Name": "bookstore", "Tags": ["us"], "Port": 1234 }
请注意,无论哪种情况,服务名称都应该是有效的 DNS 标签。也就是说,它可能只包含 ASCII 字母 a 到 z(以 case-insensitive 方式)、数字 0 到 9 和 hyphen-minus 字符('-')。
然后 SRV 查询应该会成功 return 服务查找的结果。
# 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