Kong API网关:同一服务名多实例(本地/远程URL)配置问题咨询
解决方案:Kong无法保留同服务名多实例的问题
核心原因
Kong的Service名称是全局唯一标识符,创建同名Service时,后续配置会直接覆盖之前的实例,这是Kong的设计约束,并非配置失效。
可行解决方案
1. 为不同实例配置唯一Service名称,通过路径区分路由
给H1和H2的Service设置不同名称,再分别绑定对应路径的Route,客户端通过不同路径访问对应实例:
- 创建H1本地Service:
curl -X POST http://kong:8001/services \ --data name=service1-h1 \ --data url=http://localhost:port
- 绑定Route到H1的Service:
curl -X POST http://kong:8001/services/service1-h1/routes \ --data paths[]=/h1/endpoint1
- 创建H2的Service:
curl -X POST http://kong:8001/services \ --data name=service1-h2 \ --data url=http://H2_IPAddress:port
- 绑定Route到H2的Service:
curl -X POST http://kong:8001/services/service1-h2/routes \ --data paths[]=/h2/endpoint1
客户端请求/h1/endpoint1会转发到H1本地,请求/h2/endpoint1转发到H2。
2. 共用路径,通过请求头/查询参数精准路由
如果需要客户端用统一路径访问,可通过请求头或查询参数作为路由匹配条件,绑定到不同名称的Service:
- 给H1的Service配置带请求头匹配的Route:
curl -X POST http://kong:8001/services/service1-h1/routes \ --data paths[]=/endpoint1 \ --data headers[X-Target-Hardware][]=H1
- 给H2的Service配置对应请求头匹配的Route:
curl -X POST http://kong:8001/services/service1-h2/routes \ --data paths[]=/endpoint1 \ --data headers[X-Target-Hardware][]=H2
客户端请求/endpoint1时,携带X-Target-Hardware: H1头会路由到H1,携带X-Target-Hardware: H2则路由到H2。
3. 使用Upstream+Target实现负载均衡(适用于需故障转移/轮询场景)
如果不需要精准路由,而是希望Kong在H1和H2之间做负载均衡或故障转移,可将两个实例作为同一Upstream的Target:
- 创建Upstream:
curl -X POST http://kong:8001/upstreams \ --data name=service1-upstream
- 添加H1作为Target:
curl -X POST http://kong:8001/upstreams/service1-upstream/targets \ --data target=localhost:port
- 添加H2作为Target:
curl -X POST http://kong:8001/upstreams/service1-upstream/targets \ --data target=H2_IPAddress:port
- 创建指向Upstream的Service:
curl -X POST http://kong:8001/services \ --data name=service1 \ --data url=http://service1-upstream
- 绑定统一Route:
curl -X POST http://kong:8001/services/service1/routes \ --data paths[]=/endpoint1
此时Kong会默认按轮询策略转发请求到H1和H2,也可通过配置Upstream的负载均衡策略调整。
内容的提问来源于stack exchange,提问作者Parag Thamke
相关产品推荐
相关产品推荐

