我通过Catalog API http://127.0.0.1:8500/v1/catalog/register在领事馆注册外部服务,其有效负载如下:
{
"Datacenter": "dc1",
"Node": "pedram",
"Address": "www.google.com",
"Service": {
"ID": "google",
"Service": "google",
"Address": "www.google.com",
"Port": 80
},
"Check": {
"Node": "pedram",
"CheckID": "service:google",
"Status": "passing",
"ServiceID": "google",
"script": "curl www.google.com > /dev/null 2>&1",
"interval": "10s"
}
}
外部服务成功注册,我在注册服务列表中看到它,但过了一段时间它就消失了。它似乎已自动取消注册。
我在-dev模式下运行consul。
有什么问题?
我发现我应该在单独的节点中注册外部服务。我的应用程序的本地服务已在名为的节点中注册
"Node": "pedram"
当我在此节点中注册外部服务时,它们将被自动删除。
但是当我在一个新节点中注册我的外部服务时,所有新的外部服务都会被持久注册并准备好用作所有其他本地服务。
我的新有效载荷如下:
{
"Datacenter": "dc1",
"Node": "newNode",
"Address": "www.google.com",
"Service": {
"ID": "google",
"Service": "google",
"Address": "www.google.com",
"Port": 80
},
"Check": {
"Node": "newNode",
"CheckID": "service:google",
"Status": "passing",
"ServiceID": "google"
}
}
这是例外行为。在领事Anti-Entropy docs
如果代理程序不知道的目录中存在任何服务或检查,则会自动删除它们以使目录反映该代理程序的正确服务集和运行状况信息。领事将代理人的状态视为权威;如果代理程序和目录视图之间存在任何差异,则将始终使用代理程序本地视图。
在您的设置中,主机'pedram'中的代理不知道服务寄存器。所以反熵策略会删除服务。
你不应该使用-dev模式,除了测试/玩游戏。为了您的健康检查,我建议不要使用"script": "curl www.google.com > /dev/null 2>&1",
相反,我建议使用http健康检查:"http": "https://www.google.com",
有关健康检查的更多信息,请访问:https://www.consul.io/docs/agent/checks.html
此外,如果可以,您可能应该转移到HTTPS(在端口443上)。
它也可能有助于将其保存为.JSON文件,并让consul将其作为其启动的一部分进行读取,因为我猜你希望这是一个长期运行的外部服务。您可以使用以下命令执行此操作:/usr/local/bin/consul agent -config-dir=/etc/consul/consul.d
,/etc/consul/consul.d/
中的每个.json文件都将作为其配置的一部分进行读取。如果您更改文件,consul reload
将重新启动。
我会进行这些更改(不是在开发模式下运行等),看看问题是否仍然存在。我猜它不会。