注册多个同一主机服务

时间:2017-09-27 23:39:53

标签: consul

我正在使用the Consul API注册在本地计算机上的各种端口上运行的本地Web服务。我的最终目标是能够在不同的端口上运行多个后端并对其进行负载平衡。

我正在运行一个节点的本地Consul服务器,以便在Vagrant VM中进行开发。我已经注册了我服务的第一个实例:

{
  "Node": {
    "ID": "49d3be4b-5ee5-5f0f-e145-dcb1782e5b4b",
    "Node": "localhost",
    "Address": "127.0.0.1",
    "Datacenter": "dc1",
    "TaggedAddresses": {
      "lan": "127.0.0.1",
      "wan": "127.0.0.1"
    },
    "Meta": {
      "consul-network-segment": ""
    },
    "CreateIndex": 5,
    "ModifyIndex": 6
  },
  "Services": {
    "consul": {
      "ID": "consul",
      "Service": "consul",
      "Tags": [],
      "Address": "",
      "Port": 8300,
      "EnableTagOverride": false,
      "CreateIndex": 5,
      "ModifyIndex": 5
    },
    "rusty": {
      "ID": "rusty",
      "Service": "rusty",
      "Tags": [
        "rusty",
        "rust"
      ],
      "Address": "127.0.0.1",
      "Port": 8001,
      "EnableTagOverride": false,
      "CreateIndex": 247,
      "ModifyIndex": 491
    }
  }
}

您可以在端口8001上看到我的服务rusty。奇怪的是,当我在不同的端口上注册相同的服务时,Consul会使用新的服务端口取代端口8001。

是否有办法在同一主机上的不同端口上为服务运行多个后端?

3 个答案:

答案 0 :(得分:2)

尝试检查您是否使用不同的ID注册服务。有关完整信息,请参阅/agent/service/register端点的parameters

以下是两个rusty服务实例的示例,其中包含不同的ID rusty1rusty2

{ "Node": { "ID": "eff2fae3-6ee5-5de7-bf1a-c041992a1d6a", "Node": "FB20160707", "Address": "192.168.1.66", "Datacenter": "dc1", "TaggedAddresses": { "lan": "192.168.1.66", "wan": "192.168.1.66" }, "Meta": {}, "CreateIndex": 5, "ModifyIndex": 6 }, "Services": { "consul": { "ID": "consul", "Service": "consul", "Tags": [], "Address": "", "Port": 8300, "EnableTagOverride": false, "CreateIndex": 5, "ModifyIndex": 5 }, "rusty1": { "ID": "rusty1", "Service": "rusty", "Tags": [], "Address": "10.10.10.10", "Port": 8001, "EnableTagOverride": false, "CreateIndex": 16, "ModifyIndex": 28 }, "rusty2": { "ID": "rusty2", "Service": "rusty", "Tags": [], "Address": "10.10.10.10", "Port": 8002, "EnableTagOverride": false, "CreateIndex": 19, "ModifyIndex": 29 } } }

答案 1 :(得分:0)

根据我对@ ruslan-sennov的评论,如果services部分看起来像这样(通过添加端口使ID服务的每个实例的rusty唯一,但name保留为rusty):

"Services": {
  "consul": {
    "ID": "consul",
    "Service": "consul",
    "Tags": [],
    "Address": "",
    "Port": 8300,
    "EnableTagOverride": false,
    "CreateIndex": 5,
    "ModifyIndex": 5
  },
  "rusty": {
    "ID": "rusty:8001",
    "Service": "rusty",
    "Tags": [
      "rusty",
      "rust"
    ],
    "Address": "127.0.0.1",
    "Port": 8001,
    "EnableTagOverride": false,
    "CreateIndex": 247,
    "ModifyIndex": 491
  },
  "rusty": {
    "ID": "rusty:8002",
    "Service": "rusty",
    "Tags": [
      "rusty",
      "rust"
    ],
    "Address": "127.0.0.1",
    "Port": 8002,
    "EnableTagOverride": false,
    "CreateIndex": 247,
    "ModifyIndex": 491
  }
}

这意味着您可以使用SRV查询来查询rusty服务,并详细了解哪些端口可用:

dig @127.0.0.1 rusty.service.consul SRV

; <<>> DiG 9.11.3 <<>> rusty.service.consul SRV
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56091
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 52, AUTHORITY: 0, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;rusty.service.consul.                IN      SRV

;; ANSWER SECTION:
rusty.service.consul. 0       IN      SRV     1 1 8001 FB20160707.node.dc1.consul.
rusty.service.consul. 0       IN      SRV     1 1 8002 FB20160707.node.dc1.consul.

如果您还更改名称以使其唯一(如Ruslan建议的rusty1rusty2),则会失去此查询功能。

答案 2 :(得分:0)

我知道现在回答这个问题太迟了,但是希望这会对某人有所帮助。

根据Spring Cloud Consul docs,将其添加到bootstrap.yml

spring:
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}