惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
爱范儿
爱范儿
Y
Y Combinator Blog
T
Tor Project blog
V
Visual Studio Blog
U
Unit 42
B
Blog RSS Feed
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
G
Google Developers Blog
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
博客园_首页
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
P
Proofpoint News Feed
Jina AI
Jina AI
博客园 - 【当耐特】
S
Security @ Cisco Blogs
I
Intezer
MyScale Blog
MyScale Blog
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy & Cybersecurity Law Blog
腾讯CDC
T
Tenable Blog
A
Arctic Wolf
T
Threat Research - Cisco Blogs
S
Securelist
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
C
Check Point Blog
NISL@THU
NISL@THU
Microsoft Security Blog
Microsoft Security Blog
V
Vulnerabilities – Threatpost

博客园 - 无心々菜

高并发 - 配置2 高并发 - 配置 地图 - QGIS加载geojson,并导入Postgis数据库 VUE2 - Geoserver打印矢量PDF地图 - 在VUE2中的应用 地图 - Geoserver打印矢量PDF地图 Docker - 离线+无root环境安装 docker-rootless 运维 - 哪吒监控 Postgres 数据库在docker环境下分布式部署(arm64框架) Postgres 数据库在docker环境下分布式部署 Https - 配置方案 OpenObserver - 系统接口监控 VUE3 - Docker部署 + traefik反代 VUE2 - Docker部署 + traefik反代 高斯DB 数据库的安装 NETCORE - 使用 EFCORE 调用 高斯DB数据库 JMeter - 压力测试 NETCORE - IdentityServer4 多节点部署 NETCORE - IdentityServer4 相关文档 .NET框架 - NETCORE + API + EF(DBFirst) + PostgresSql Docker 部署 APISIX + etcd Docker部署martin 矢量切片服务器 Postgres 数据库的安装 NETCORE - 调用 RUSTFS Docker - 部署 RustFS 对像存储 Docker - 使用 Docker Secrets 敏感数据传输 Docker - 部署 Consul KV 统一管理所有项目的配置 Docker - 部署 HashiCorp Vault 开源密钥管理工具 Docker 部署 kong 网关 Docker - 部署Consul 新
kong 网关下集成 Consul服务注册与发现
无心々菜 · 2025-10-15 · via 博客园 - 无心々菜

 kong 网关下集成 Consul服务注册与发现

一. 服务环境搭建

 1. consul 的部署与配置

  参考:Docker - 部署Consul 新 - 无心々菜 - 博客园

  参考:NETCORE - Consul 注册 新 - 无心々菜 - 博客园

 2. kong 的部署

  参考:Docker 部署 kong 网关 - 无心々菜 - 博客园

注意:

Kong OSS 版本的一致性哈希只对静态 upstream targets 生效,
不支持从 Consul 自动获取和维护服务实例,
如需 Consul 动态发现需使用 Enterprise 或自行实现同步机制。

在需要 Consul 服务发现 + 一致性哈希的场景下,
APISIX 开源版可原生支持动态实例变更,
而 Kong OSS 需额外同步机制或企业版支持。

二. 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)

        行为:每个请求依次轮询: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 达到类似效果:

如上kong轮询三个指定服务,如下可直接轮询consul里面的服务。

直接配置 services ,不需要配置 upstreams

# 定义路由,通过 upstream 转发
services:
  - name: api-assist
 #   host: api-assist-upstream   # 这里指向上面的 upstream
    host: api-assist.service.consul  # 直接使用Consul DNS
    protocol: http
    routes:
      - name: api-assist-route
        paths:
          - /api-assist        
 

end.