kong 网关下集成 Consul服务注册与发现
kong 网关下集成 Consul服务注册与发现
一. 服务环境搭建
1. consul 的部署与配置
参考:Docker - 部署Consul 新 - 无心々菜 - 博客园
参考:NETCORE - Consul 注册 新 - 无心々菜 - 博客园
2. kong 的部署
参考:Docker 部署 kong 网关 - 无心々菜 - 博客园
二. KONG 配置
配置 D:\DockerMapping\Kong\kong.yml
_format_version: "3.0"
_transform: true
services:
- name: api-assist # 对应 Consul 的 ServiceName
host: api-assist.service.consul # Consul DNS 名称
port: 7096 # 对应 ServicePort
protocol: https # 对应 ServiceScheme
routes:
- name: api-assist-route
paths:
- /api-assist # Kong 暴露出来的访问前缀
- name: kong-config
url: http://localhost:8001/config # Admin API 内部调用
routes:
- name: kong-config-route
paths:
- /current-config
重启 docker 容器
docker-compose restart kong
由于我的 kong 是 DBless 版本,没有用 数据库 版本,
所以在 Kong Manager (http://localhost:18002)管理界面 看不到配置。
可以通过以下页面查看:
访问: http://localhost:18001/services

访问:localhost:18001/config?format=yaml
访问:localhost:18000/current-config

三. 测试
1. localhost:18000/api-assist/health
2. 10.10.0.98:18000/api-assist/health
3. localhost:18000/api-assist/Test/test


四. 负载均衡
1. 在项目中增加接口,用于负载均衡测试
/// <summary>
/// 获取当前请求的URL
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("current-url")]
public IActionResult GetCurrentUrl()
{
var request = HttpContext.Request;
var fullUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{request.QueryString}";
return Ok(fullUrl);
}
2. 发布项目3份

它们的配置文件如下



3. 启动项目
PS D:\project-publish\railassist1> dotnet .\RailAssist.Controllers.dll --urls="http://0.0.0.0:7196"
PS D:\project-publish\railassist2> dotnet .\RailAssist.Controllers.dll --urls="http://0.0.0.0:7296"
PS D:\project-publish\railassist3> dotnet .\RailAssist.Controllers.dll --urls="http://0.0.0.0:7396"
4. 在consul管理页面上可以看到注册的服务

5. kong 配置:
D:\DockerMapping\Kong\kong.yml 配置
_format_version: "3.0"
_transform: true
upstreams:
- name: api-assist-upstream
# 可选:轮询策略,默认是 round-robin
algorithm: round-robin
targets:
- target: 10.10.32.37:7196 # 第一个实例
weight: 1
- target: 10.10.32.37:7296 # 第二个实例
weight: 1
- target: 10.10.32.37:7396 # 第三份实例
weight: 1
# 定义路由,通过 upstream 转发
services:
- name: api-assist
host: api-assist-upstream # 这里指向上面的 upstream
protocol: http
routes:
- name: api-assist-route
paths:
- /api-assist
Upstream 负载均衡算法 的配置项在后面。
6. 重启 kong服务
docker-compose restart kong
7. 测试
http://localhost:18000/api-assist/Test/current-url
目前为轮询调用,如下结果



完成。
8. 参考:
Upstream 负载均衡算法 的配置项
🧭 1️⃣ 支持的负载均衡算法
Kong(3.x / DBless 模式)支持以下几种:
| 参数名 | 含义 | 特点 |
|---|---|---|
round-robin |
轮询 | 默认算法,所有 targets 按顺序均匀分配请求。 |
consistent-hashing |
一致性哈希 | 根据请求的特定 key(如 IP、header、cookie)分配目标,使同一 key 的请求落到同一实例。 |
least-connections |
最少连接数 | 请求总是转发给当前连接数最少的实例(更智能的实时负载均衡)。 |
least-latency (Enterprise) |
最低延迟 | 基于延迟数据动态分配请求(Kong Enterprise 专属)。 |
⚙️ 2️⃣ 示例配置对比
⚙️ 默认(Round-Robin)
行为:每个请求依次轮询:7096 → 7097 → 7098 → 再循环
⚙️ 一致性哈希(Consistent Hashing)
行为:根据 X-User-ID 请求头做哈希,使同一个用户总是被分配到同一个实例(可保持 session)。
支持以下哈希来源:
| 参数 | 说明 |
|---|---|
hash_on: none |
不启用哈希(默认) |
hash_on: consumer |
基于认证的 consumer |
hash_on: ip |
基于客户端 IP |
hash_on: header |
基于自定义 Header |
hash_on_header: <header> |
指定 Header 名称 |
hash_on_cookie |
基于 Cookie 名称 |
hash_on_cookie_path |
Cookie 路径 |
⚙️ 最少连接数(Least Connections)
⚙️ 最低延迟调度 - 仅企业版(least-latency)
虽然不能直接用 least-latency,但你可以通过 健康检查 + least-connections 达到类似效果:
end.

浙公网安备 33010602011771号