注意:我不是在询问Consul HTTP端口8500.我可以调用微服务公开的API,使用Consul发现,只需通过.service.consul / WITHOUT指定端口号吗?
我正在使用Consul来发现微服务的多个版本。这个微服务(用Java编写)具有预定的端口:
在consul注册的服务为 - my-service.service.consul(服务端口是,让我们说3030)。我在consul注册了相同的微服务的另一个版本:my-servicev2.service.consul(port 3033)。
服务定义(为示例而更改):
{
"Address": <IP address>,
"CreateIndex": 111,
"ModifyIndex": 000,
"Node": <node name>,
"ServiceAddress": "",
"ServiceEnableTagOverride": false,
"ServiceID": "my-servicev2",
"ServiceName": "my-servicev2",
"ServicePort": 3033,
"ServiceTags": [
"v2"
],
"TaggedAddresses": {
"lan": <LAN IP>,
"wan": <WAN IP>
}
}
我可以使用dig @localhost my-service.service.consul' or
ping -c2 my-service.service.consul`
但是,如何在不明确使用ServicePort
的情况下访问此微服务公开的API之一?
以下是有效的方法:
curl http://my-servicev2.service.consul:3033/health -> resolves the service name, maps it to one of the deployed VM IP, and gives back the API response. In this case something like: `{"build"`: 'OK"}`
但是,我应该能够在不指定端口号的情况下访问API,如下所示:
curl http://my-servicev2.service.consul/health ->
{“build”:“OK”}`
Consul有可能吗?
我尝试注册没有Port
值的服务,并添加了0
作为端口值。
答案 0 :(得分:1)
否则在这种情况下,consul纯粹作为DNS服务器并返回健康实例的ip地址。正如您在dig和ping命令中看到的那样。
您必须像使用curl调用一样指定端口。
要破解此操作,您可以修改您的应用程序以在http默认端口80上运行。
如果无法做到这一点,您可以设置所谓的反向代理。
Nginx非常适合这一点。以下是一个允许您处理此配置的配置片段:
location / {
proxy_pass http://127.0.0.1:3033;
}
这会将您所有的端口80调用传递给localhost端口3033.然后您的curl调用将按预期工作,而不指定端口。