KONG - API转发流程梳理

news2024/11/18 9:49:24

kong简介

Kong 是一个开源的API网关,集成了服务注册和发现、负载均衡、健康检查等功能,还可以通过插件来提供限流、熔断、监控、日志等能力,

kong的微服务架构中,kong担当了注册中心的角色,服务提供者(Provider)首先将服务信息注册到 kong,服务消费者(Consumer)调用服务的过程是调用端先将请求发到 kong,再通过 kong 把请求转发到服务提供者而实现间接调用。

在这里插入图片描述

本文通过梳理kong数据库中的字段关联关系,从而了解请求的转发流程。


kong服务定义

一个完整的kong服务由四部分实体构成:routeserviceupstreamtarget。各自作用介绍如下:

  1. route:记录了请求规则和服务service的对应关系;
  2. services:服务实体,是上游服务upstream的抽象;
  3. upstream:一个或多个target的集合,负责流量的转发;
  4. target:提供服务的最小单位,也是负载均衡的终端。

kong转发请求的整体流程可以概述为:当客户端发起一个请求时,routes通过提前注册的信息匹配出对应的service服务,根据service对应的upstream信息就可以找到最终处理请求的目标tartget,从而完成请求的处理。调用流程图示如下:

在这里插入图片描述

以下就客户端请求/api/tembin/atsani为例,结合kong数据库中的关联关系来具体说明请求的转发流程。


转发流程梳理

从 Route 到 Service

routes

routes路由匹配客户端的请求规则,匹配成功后分配到service层,以请求的方法、host、路径等作为转发依据。routeservice是多对一的关系,所以可根据请求的路径可匹配出对应的service

表结构

以下字段需要特殊注意:

字段
protocols允许访问该路由的协议(默认https\http都允许)
paths匹配路由访问的路径
service_id指向服务的id
kong=# \d routes;
                           Table "public.routes"
           Column           |           Type           |     Modifiers
----------------------------+--------------------------+--------------------
 id                         | uuid                     | not null
 created_at                 | timestamp with time zone |
 updated_at                 | timestamp with time zone |
 name                       | text                     |
 service_id                 | uuid                     |
 protocols                  | text[]                   |
 methods                    | text[]                   |
 hosts                      | text[]                   |
 paths                      | text[]                   |
 snis                       | text[]                   |
 sources                    | jsonb[]                  |
 destinations               | jsonb[]                  |
 regex_priority             | bigint                   |
 strip_path                 | boolean                  |
 preserve_host              | boolean                  |
 tags                       | text[]                   |
 https_redirect_status_code | integer                  |
 headers                    | jsonb                    |
 path_handling              | text                     | default 'v0'::text
Indexes:
    "routes_pkey" PRIMARY KEY, btree (id)
    "routes_name_key" UNIQUE CONSTRAINT, btree (name)
    "routes_service_id_idx" btree (service_id)
    "routes_tags_idx" gin (tags)
Foreign-key constraints:
    "routes_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id)
Referenced by:
    TABLE "plugins" CONSTRAINT "plugins_route_id_fkey" FOREIGN KEY (route_id) REFERENCES routes(id) ON DELETE CASCADE
Triggers:
    routes_sync_tags_trigger AFTER INSERT OR DELETE OR UPDATE OF tags ON routes FOR EACH ROW EXECUTE PROCEDURE sync_tags()

可看出routesservice表通过service_id进行关联

示例

routes表中可根据指定路径筛选出对应的service_id27f7d1f2-67f3-430f-b5a1-417c6dcb1198

kong=# select * from routes where paths='{/api/tembin/atsani}';
-[ RECORD 1 ]--------------+-------------------------------------
id                         | 00dd061d-438c-4e76-92a2-92984c6c55dc
created_at                 | 2022-10-30 11:53:15+00
updated_at                 | 2022-10-30 11:53:15+00
name                       | nscloud.kong-tembin.029
service_id                 | 27f7d1f2-67f3-430f-b5a1-417c6dcb1198
protocols                  | {http,https}
methods                    |
hosts                      |
paths                      | {/api/tembin/atsani}
snis                       |
sources                    |
destinations               |
regex_priority             | 0
strip_path                 | f
preserve_host              | t
tags                       | {managed-by-ingress-controller}
https_redirect_status_code | 426
headers                    |
path_handling              | v0

```

services

service服务是一个抽象服务层,可以用于指向具体物理服务(target),也可以指向upstream用于实现物理服务的负载效果,其中serviceupstream是一对一的关系。

注:service中的host可以是upstreamname,也可以配置为外部的域名,这样请求会直接转发给外部

表结构

以下字段需要特殊注意:

字段
protocol请求upstream的协议(http、https)默认http
hostupstream name(一定要和upstream名称保持一致)
port请求upstream的端口(虚拟端口,可自定义)默认80
path请求upstream的路径
kong=# \d services;
                   Table "public.services"
        Column         |           Type           | Modifiers
-----------------------+--------------------------+-----------
 id                    | uuid                     | not null
 created_at            | timestamp with time zone |
 updated_at            | timestamp with time zone |
 name                  | text                     |
 retries               | bigint                   |
 protocol              | text                     |
 host                  | text                     |
 port                  | bigint                   |
 path                  | text                     |
 connect_timeout       | bigint                   |
 write_timeout         | bigint                   |
 read_timeout          | bigint                   |
 tags                  | text[]                   |
 client_certificate_id | uuid                     |
Indexes:
    "services_pkey" PRIMARY KEY, btree (id)
    "services_name_key" UNIQUE CONSTRAINT, btree (name)
    "services_fkey_client_certificate" btree (client_certificate_id)
    "services_tags_idx" gin (tags)
Foreign-key constraints:
    "services_client_certificate_id_fkey" FOREIGN KEY (client_certificate_id) REFERENCES certificates(id)
Referenced by:
    TABLE "oauth2_authorization_codes" CONSTRAINT "oauth2_authorization_codes_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
    TABLE "oauth2_tokens" CONSTRAINT "oauth2_tokens_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
    TABLE "plugins" CONSTRAINT "plugins_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE
    TABLE "routes" CONSTRAINT "routes_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id)
Triggers:
    services_sync_tags_trigger AFTER INSERT OR DELETE OR UPDATE OF tags ON services FOR EACH ROW EXECUTE PROCEDURE sync_tags()

示例

通过上一步查找的service_id,可在service表中匹配出对应记录

kong=# select * from services where id='27f7d1f2-67f3-430f-b5a1-417c6dcb1198';
-[ RECORD 1 ]---------+-------------------------------------
id                    | 27f7d1f2-67f3-430f-b5a1-417c6dcb1198
created_at            | 2022-10-30 11:53:15+00
updated_at            | 2022-10-30 11:53:15+00
name                  | nscloud.atsani.80
retries               | 5
protocol              | http
host                  | atsani.nscloud.80.svc
port                  | 80
path                  | /
connect_timeout       | 60000
write_timeout         | 60000
read_timeout          | 60000
tags                  | {managed-by-ingress-controller}
client_certificate_id |

ServiceUpstream

upstreams

upstream主要用于实现kong的负载功能,一个service匹配到一个upstream后,upstream可以指向多个target服务以此来实现负载的效果。

表结构

以下字段需要特殊注意:

字段
nameservice指向时使用
algorithm默认round-robin。目前支持round-robin, consistent-hashing, least-connections
healthchecks.active.type检查目标服务器target的健康方式。一共三类tcp、http、https
healthchecks.active.http_path使用http协议检查target服务是否健康时绑定的路径
kong=# \d upstreams
                                                  Table "public.upstreams"
        Column        |           Type           |                                 Modifiers
----------------------+--------------------------+---------------------------------------------------------------------------
 id                   | uuid                     | not null
 created_at           | timestamp with time zone | default timezone('UTC'::text, ('now'::text)::timestamp(3) with time zone)
 name                 | text                     |
 hash_on              | text                     |
 hash_fallback        | text                     |
 hash_on_header       | text                     |
 hash_fallback_header | text                     |
 hash_on_cookie       | text                     |
 hash_on_cookie_path  | text                     |
 slots                | integer                  | not null
 healthchecks         | jsonb                    |
 tags                 | text[]                   |
 algorithm            | text                     |
 host_header          | text                     |
Indexes:
    "upstreams_pkey" PRIMARY KEY, btree (id)
    "upstreams_name_key" UNIQUE CONSTRAINT, btree (name)
    "upstreams_tags_idx" gin (tags)
Referenced by:
    TABLE "targets" CONSTRAINT "targets_upstream_id_fkey" FOREIGN KEY (upstream_id) REFERENCES upstreams(id) ON DELETE CASCADE
Triggers:
    upstreams_sync_tags_trigger AFTER INSERT OR DELETE OR UPDATE OF tags ON upstreams FOR EACH ROW EXECUTE PROCEDURE sync_tags()

从表索引中可看出对于target表和upstreams表针对upstreams.idtargets.upstream_id做了外键约束

示例

通过上一步查找出的host字段匹配出对应的upstream

kong=# select * from upstreams where name='atsani.nscloud.80.svc';
-[ RECORD 1 ]---------------------------------------------------
id                   | b85dd291-d561-4605-8771-2895c1decaa3
created_at           | 2022-10-31 02:52:43+00
name                 | atsani.nscloud.80.svc
hash_on              | none
hash_fallback        | none
hash_on_header       |
hash_fallback_header |
hash_on_cookie       |
hash_on_cookie_path  | /
slots                | 10000
healthchecks         | {"active": {"type": "http", "healthy": {"interval": 0, "successes": 0, "http_statuses": [200, 302]}, "timeout": 1, "http_path": "/", "https_sni": null, "unhealthy": {"interval": 0, "timeouts": 0, "tcp_failures": 0, "http_failures": 0, "http_statuses": [429, 404, 500, 501, 502, 503, 504, 505]}, "concurrency": 10, "https_verify_certificate": true}, "passive": {"type": "http", "healthy": {"successes": 0, "http_statuses": [200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 306, 307, 308]}, "unhealthy": {"timeouts": 0, "tcp_failures": 0, "http_failures": 0, "http_statuses": [429, 500, 503]}}, "threshold": 0}
tags                 | {managed-by-ingress-controller}
algorithm            | round-robin
host_header          |

UpstreamTarget

对请求进行处理的时候,主要有两项处理,一是进行负载均衡,二是调用插件进行处理。

一个Upstream可以包含多个Target,负载均衡的过程,就是为当前的请求选择一个Target的过程

target

targetIP或者hostport,是提供服务的最小单位。每个tartget还可设置不同的权重。

表结构

以下字段需要特殊注意:

字段
upstream_idtag对应的upstream表的主键
target转发目的的ip和port
weight该target在整个upstream中所占的权重
kong=# \d targets
                                               Table "public.targets"
   Column    |           Type           |                                 Modifiers
-------------+--------------------------+---------------------------------------------------------------------------
 id          | uuid                     | not null
 created_at  | timestamp with time zone | default timezone('UTC'::text, ('now'::text)::timestamp(3) with time zone)
 upstream_id | uuid                     |
 target      | text                     | not null
 weight      | integer                  | not null
 tags        | text[]                   |
Indexes:
    "targets_pkey" PRIMARY KEY, btree (id)
    "targets_tags_idx" gin (tags)
    "targets_target_idx" btree (target)
    "targets_upstream_id_idx" btree (upstream_id)
Foreign-key constraints:
    "targets_upstream_id_fkey" FOREIGN KEY (upstream_id) REFERENCES upstreams(id) ON DELETE CASCADE
Triggers:
    targets_sync_tags_trigger AFTER INSERT OR DELETE OR UPDATE OF tags ON targets FOR EACH ROW EXECUTE PROCEDURE sync_tags()

从表结构中可看出通过upstream_idupstreams表进行关联。

示例

kong=# select * from  targets where upstream_id='b85dd291-d561-4605-8771-2895c1decaa3';
-[ RECORD 1 ]-------------------------------------
id          | f88f7a83-e973-4414-ae64-fd1b34e96a2a
created_at  | 2022-10-30 11:53:16.174+00
upstream_id | b85dd291-d561-4605-8771-2895c1decaa3
target      | 10.244.0.215:80
weight      | 100
tags        | {managed-by-ingress-controller}

由于本地环境中将kongk8s进行结合,所以最终在环境上可通过target获取出对应提供服务的Pod

[root@master-1 ~]# kubectl get pods -A -o wide | grep 10.244.0.215
nscloud       /api/tembin/atsani                        1/1     Running     1          23h     10.244.0.215   master-1   <none>           <none>

至此就可以将对于/api/tembin/atsani路径的请求转发至本机10.244.0.215所对应的pod,完成请求的处理了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【b站咸虾米】ES6 Promise的用法,ES7 async/await异步处理同步化,异步处理进化史

课程地址&#xff1a;【ES6 Promise的用法&#xff0c;ES7 async/await异步处理同步化&#xff0c;异步处理进化史】 https://www.bilibili.com/video/BV1XW4y1v7Md/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 图文地址&#xff1a;https://www.b…

Java 集合类的高级特性介绍

在 Java 编程中&#xff0c;了解集合类的高级特性对于编写高效和可维护的代码至关重要。以下是一些你应该知道的 Java 集合类的高级特性&#xff0c;以及简单的例子来说明它们的用法。 1. 迭代器&#xff08;Iterators&#xff09;和列表迭代器&#xff08;ListIterators&#…

算法归纳【数组篇】

目录 二分查找1. 前提条件&#xff1a;2. 二分查找边界 2.移除元素有序数组的平方长度最小的子数组59.螺旋矩阵II54. 螺旋矩阵 二分查找 参考链接 https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%9D%E8%B7%AF 1. 前提条件&#xff1a; 数…

git revert 撤回之前的几个指定的提交

文章目录 Intro操作命令-n 选项 参考 Intro 在开发过程中&#xff0c;有的时候一开始只是一个小需求&#xff0c;可以改着改着事情超出了控制&#xff0c;比如说我一开始只是想调整一个依赖包的版本&#xff0c;可是改到后来类库不兼容甚至导致项目无法启动。 这个时候我就想&…

华为OD机试 - 服务器广播 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷…

从数据到智能:探讨大数据在AI领域的核心作用

前言 大数据和人工智能已经成为当今社会的两大热门话题。它们之间究竟有何关系&#xff1f;又如何在各个领域发挥着重要作用&#xff1f; 概念区别与联系 一、大数据与人工智能的基本概念 大数据&#xff0c;顾名思义&#xff0c;指的是海量的、类型繁多的数据集合。这些数据…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

【日常聊聊】2024 年 AI 辅助研发趋势

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;AI辅助研发的技术进展 方向二&#xff1a;行业应用案例 方向三&#xff1a; 面临的挑战与机遇 方向四&a…

学习人工智能:吴恩达《AI for everyone》2019 第3周:实现智能音箱和自动驾驶的几个步骤;无监督学习;增强学习

吴恩达 Andrew Ng&#xff0c; 斯坦福大学前教授&#xff0c;Google Brain项目发起人、领导者。 Coursera 的联合创始人和联合主席&#xff0c;在 Coursera 上有十万用户的《机器学习》课程&#xff1b;斯坦福大学计算机科学前教授。百度前副总裁、前首席科学家&#xff1b;谷…

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示&#xff0c;图中有 n 个节点&#xff0c;从 1 到 n 编号&#xff08;包含 1 和 n&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中每个 edges[i] [ui, vi] 表…

开源分子对接程序rDock使用方法(1)-Docking in 3 steps

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、Docking in 3 steps 标准对接rDock 的基本对接步骤及注意事项 二、 三步对接案例Step 1. 结构文件准备Step 2. 产生对接位点Step 3. 运行分子对接3.1 检查输入文件3.2 测试-只进行打分3.3 运行…

Linux/Validation

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80&#xff0c;4566和8080端口&#xff0c;端口详细信息如下 系统对外开放了4个端口&#xff0c;从nmap的结果来看&#xff0c;8080无法访问&#xff0c;手动尝试后4566也无法访问&#xff0c;只能从80端口开始 …

用MATLAB求解微分方程

第一篇为 基础概念 &#xff0c;第二篇为 R-K法的具体实现方法。 &#xff08;一&#xff09;常微分方程的MATLAB求解 概要&#xff1a; 常微分方程的MATLAB求解分为解析解、数值解解析解(只有少数微分方程组有解析解)&#xff1a;dsolve函数数值解&#xff1a;solver函数&a…

Python实例☞数据类型及运算符案例

实例一&#xff1a; ❶要求☞从键盘获取一个4位整数&#xff0c;并分别输出个、十、百、千位 ❷程序代码☞ ①第一种方法 print(请输入一个4位整数&#xff1a;) xeval(input()) print(个位数为&#xff1a;,x%10) print(十位数为&#xff1a;,(x//10)%10) print(百位数为&am…

Transformer中的FeedForward

Transformer中的FeedForward flyfish class PoswiseFeedForwardNet(nn.Module):def __init__(self, d_ff2048):super(PoswiseFeedForwardNet, self).__init__()# 定义一维卷积层 1&#xff0c;用于将输入映射到更高维度self.conv1 nn.Conv1d(in_channelsd_embedding, out_ch…

自律篇001-养成自律的秘密武器1-目标规划表

&#x1f680;以前在某书上看到一些博主非常自律&#xff0c;比如每天5点多起床看书&#xff0c;或者每天坚持健身&#xff0c;直到练出马甲线&#xff0c;还有一边工作一边考研等等&#xff0c;自己也曾尝试过做一些目标规划&#xff0c;但结果都不尽人意。写计划的时候往往信…

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中&#xff0c;给我们提供了以下几种连接网络的模式 桥接模式&#xff1a;直接联机物理网络NAT模式&#xff1a;用于共享主机的IP地址仅主机模式&#xff1a;与主机共享的专用网络自定义&#xff1a;特定虚拟网络LAN区段 特别注意的是&am…

c++ 11 新特性 元组

一.元组介绍 C11引入了元组&#xff08;tuple&#xff09;这一新特性&#xff0c;它是一种可以存储不同类型元素的复合类型。元组类似于结构体&#xff0c;但更加灵活&#xff0c;因为它可以在运行时动态地创建和访问元素。 二.元组使用场景 C11中引入的元组&#xff08;tuple&…

css clip-path polygon属性实现直角梯形

2024.3.8今天我学习了如何用css实现直角梯形的效果&#xff0c; 效果&#xff1a; 具体实现原理&#xff1a; 一、需要三个div&#xff1a; 外面一个大的div&#xff0c;里面左右两个小的div 我们需要先把第一个div变成直角梯形&#xff1a; 大概是这样&#xff0c;设置好之…

ORA/GSA -- 学习记录

brief over-representation analysis(ORA),过表“达”分析&#xff0c;就是我们做多分组的RNAseq数据解析后会得到一些差异表达的gene&#xff0c;有些时候是单独拿出一个差异gene去解释表型&#xff0c;缺点是欠缺证据力度。有些人就把一些相关的差异gene放在一块儿解释&…