DNS

    首先我们需要配置 DNS 服务器的地址:

    与在 Upstream 的 对象中配置域名不同的是,DNS 服务发现将返回所有的记录。例如按照以下的 upstream 配置:

    1. {
    2. "id": 1,
    3. "discovery_type": "dns",
    4. "service_name": "test.consul.service",
    5. "type": "roundrobin"
    6. }

    之后 test.consul.service 将被解析为 1.1.1.11.1.1.2,这个结果等同于:

    注意所有来自 test.consul.service 的 IP 都有相同的权重。

    1. # 添加到 config.yaml
    2. dns:
    3. - "127.0.0.1:8600" # 使用 DNS 服务器的真实地址
    4. order: # DNS 解析的顺序
    5. - last # "last" 表示从上次成功的类型开始
    6. - SRV
    7. - A
    8. - AAAA
    9. - CNAME

    如果你想指定 upstream 服务器的端口,可以把以下内容添加到 service_name

    另一种方法是通过 SRV 记录,见如下。

    通过使用 SRV 记录你可以指定一个服务的端口和权重。

    假设你有一条这样的 SRV 记录:

    1. ; under the section of blah.service
    2. A 300 IN A 1.1.1.1
    3. B 300 IN A 1.1.1.3
    4. ; name TTL type priority weight port
    5. srv 86400 IN SRV 10 60 1980 A
    6. srv 86400 IN SRV 20 20 1981 B

    效果等同于:

    1. {
    2. "id": 1,
    3. "type": "roundrobin",
    4. "nodes": [
    5. {"host": "1.1.1.1", "port": 1980, "weight": 60, "priority": -10},
    6. {"host": "1.1.1.2", "port": 1981, "weight": 10, "priority": -20},
    7. {"host": "1.1.1.3", "port": 1981, "weight": 10, "priority": -20}

    注意 B 域名的两条记录均分权重。 对于 SRV 记录,低优先级的节点被先选中,所以最后一项的优先级是负数。

    关于 0 权重的 SRV 记录,在 RFC 2782 中是这么描述的:

    对于端口为 0 的 SRV 记录,我们会使用上游协议的默认端口。 你也可以在 “service_name” 字段中直接指定端口,比如 “srv.blah.service:8848”。