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 服务器正确响应零记录。

要解决此问题,您可以执行以下两项操作之一。

  1. 用不同的名称注册服务,例如bookstore-us.

    {
      "Name": "bookstore-us",
      "Port": 1234
    }
    
  2. 在服务注册中将 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