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

image

访问:localhost:18001/config?format=yaml

访问:localhost:18000/current-config

image

 

三. 测试

1. localhost:18000/api-assist/health

2. 10.10.0.98:18000/api-assist/health

3. localhost:18000/api-assist/Test/test

image

image

 

 

 

四. 负载均衡

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份

image

它们的配置文件如下

imageimageimage

 

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管理页面上可以看到注册的服务

image

 

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

目前为轮询调用,如下结果

image

image

image

完成。

 

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)

upstreams:
  - name: api-assist-upstream
    algorithm: round-robin
    targets:
      - target: 10.10.0.98:7096
      - target: 10.10.0.98:7097
      - target: 10.10.0.98:7098

        行为:每个请求依次轮询:7096 → 7097 → 7098 → 再循环

   

     ⚙️ 一致性哈希(Consistent Hashing)

upstreams:
  - name: api-assist-upstream
    algorithm: consistent-hashing
    hash_on: header
    hash_on_header: X-User-ID

         行为:根据 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)

upstreams:
  - name: api-assist-upstream
    algorithm: least-connections
    targets:
      - target: 10.10.0.98:7096
      - target: 10.10.0.98:7097
      行为:Kong 会追踪每个实例的活跃连接数,请求会倾向于负载较轻的实例。

 

 

    

    ⚙️ 最低延迟调度 - 仅企业版(least-latency)

      虽然不能直接用 least-latency,但你可以通过 健康检查 + least-connections 达到类似效果:

upstreams:
  - name: api-assist-upstream
    algorithm: least-connections
    healthchecks:
      active:
        type: http
        http_path: /health
        healthy:
          interval: 5
          successes: 2
        unhealthy:
          interval: 5
          http_failures: 2
      行为:Kong 会追踪每个实例的活跃连接数,请求会倾向于负载较轻的实例。

 

 

 

 

 

 

 

 

 

 

end.

posted @ 2025-10-15 16:59  无心々菜  阅读(7)  评论(0)    收藏  举报