You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ba...@apache.org on 2025/06/17 02:34:26 UTC
(apisix) branch master updated: fix: handle consul nil port cases by defaulting to port 80 (#12304)
This is an automated email from the ASF dual-hosted git repository.
baoyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push:
new 5ac6264bb fix: handle consul nil port cases by defaulting to port 80 (#12304)
5ac6264bb is described below
commit 5ac6264bbda2b726a275d5e4a6ca100036de940b
Author: Zhihuang Lin <22...@qq.com>
AuthorDate: Tue Jun 17 10:34:21 2025 +0800
fix: handle consul nil port cases by defaulting to port 80 (#12304)
---
apisix/discovery/consul/init.lua | 4 +++
docs/en/latest/discovery/consul.md | 7 +++++
t/discovery/consul2.t | 52 ++++++++++++++++++++++++++++++++++----
3 files changed, 58 insertions(+), 5 deletions(-)
diff --git a/apisix/discovery/consul/init.lua b/apisix/discovery/consul/init.lua
index a6139993d..4d3c0e46b 100644
--- a/apisix/discovery/consul/init.lua
+++ b/apisix/discovery/consul/init.lua
@@ -516,6 +516,10 @@ function _M.connect(premature, consul_server, retry_delay)
end
local svc_address, svc_port = node.Service.Address, node.Service.Port
+ -- Handle nil or 0 port case - default to 80 for HTTP services
+ if not svc_port or svc_port == 0 then
+ svc_port = 80
+ end
-- if nodes is nil, new nodes table and set to up_services
if not nodes then
nodes = core.table.new(1, 0)
diff --git a/docs/en/latest/discovery/consul.md b/docs/en/latest/discovery/consul.md
index 7b89494ca..fd6758bc9 100644
--- a/docs/en/latest/discovery/consul.md
+++ b/docs/en/latest/discovery/consul.md
@@ -155,6 +155,13 @@ curl -X PUT 'http://127.0.0.1:8500/v1/agent/service/register' \
In some cases, same service name might exist in different consul servers.
To avoid confusion, use the full consul key url path as service name in practice.
+### Port Handling
+
+When APISIX retrieves service information from Consul, it handles port values as follows:
+
+- If the service registration includes a valid port number, that port will be used.
+- If the port is `nil` (not specified) or `0`, APISIX will default to port `80` for HTTP services.
+
### Upstream setting
#### L7
diff --git a/t/discovery/consul2.t b/t/discovery/consul2.t
index 841ef5026..16f2f630d 100644
--- a/t/discovery/consul2.t
+++ b/t/discovery/consul2.t
@@ -140,6 +140,7 @@ location /consul3 {
"PUT /consul1/deregister/service_b2",
"PUT /consul1/deregister/service_a3",
"PUT /consul1/deregister/service_a4",
+ "PUT /consul1/deregister/service_no_port",
"PUT /consul2/deregister/service_a1",
"PUT /consul2/deregister/service_a2",
"PUT /consul3/deregister/service_a1",
@@ -148,13 +149,14 @@ location /consul3 {
"PUT /consul1/register\n" . "{\"ID\":\"service_a2\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30512,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul1/register\n" . "{\"ID\":\"service_a3\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"localhost\",\"Port\":30511,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul1/register\n" . "{\"ID\":\"service_a4\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"localhost\",\"Port\":30512,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
+ "PUT /consul1/register\n" . "{\"ID\":\"service_no_port\",\"Name\":\"service_no_port\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Meta\":{\"service_version\":\"1.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul2/register\n" . "{\"ID\":\"service_a1\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30511,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul2/register\n" . "{\"ID\":\"service_a2\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30512,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul3/register\n" . "{\"ID\":\"service_a1\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30511,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
"PUT /consul3/register\n" . "{\"ID\":\"service_a2\",\"Name\":\"service_a\",\"Tags\":[\"primary\",\"v1\"],\"Address\":\"127.0.0.1\",\"Port\":30512,\"Meta\":{\"service_a_version\":\"4.0\"},\"EnableTagOverride\":false,\"Weights\":{\"Passing\":10,\"Warning\":1}}",
]
--- error_code eval
-[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
+[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
@@ -187,7 +189,7 @@ discovery:
--- request
GET /t
--- response_body
-{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}]}
+{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}],"service_no_port":[{"host":"127.0.0.1","port":80,"weight":1}]}
@@ -221,7 +223,7 @@ discovery:
--- request
GET /t
--- response_body
-{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}]}
+{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}],"service_no_port":[{"host":"127.0.0.1","port":80,"weight":1}]}
@@ -255,7 +257,7 @@ discovery:
--- request
GET /t
--- response_body
-{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30512,"weight":1}]}
+{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30512,"weight":1}],"service_no_port":[{"host":"127.0.0.1","port":80,"weight":1}]}
@@ -289,4 +291,44 @@ discovery:
--- request
GET /t
--- response_body
-{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}]}
+{"service_a":[{"host":"127.0.0.1","port":30511,"weight":1},{"host":"127.0.0.1","port":30512,"weight":1},{"host":"localhost","port":30511,"weight":1},{"host":"localhost","port":30512,"weight":1}],"service_no_port":[{"host":"127.0.0.1","port":80,"weight":1}]}
+
+
+
+=== TEST 6: verify service without port defaults to port 80
+--- yaml_config
+apisix:
+ node_listen: 1984
+ enable_control: true
+discovery:
+ consul:
+ servers:
+ - "http://127.0.0.1:9500"
+ dump:
+ path: "consul.dump"
+ load_on_init: false
+--- config
+ location /t {
+ content_by_lua_block {
+ local json = require("toolkit.json")
+ local t = require("lib.test_admin")
+ ngx.sleep(2)
+
+ local code, body, res = t.test('/v1/discovery/consul/show_dump_file',
+ ngx.HTTP_GET)
+ local entity = json.decode(res)
+
+ -- Check that service_no_port exists and has default port 80
+ local service_no_port = entity.services.service_no_port
+ if service_no_port and #service_no_port > 0 then
+ ngx.say("service_no_port found with port: ", service_no_port[1].port)
+ else
+ ngx.say("service_no_port not found")
+ end
+ }
+ }
+--- timeout: 3
+--- request
+GET /t
+--- response_body
+service_no_port found with port: 80