当前位置: 首页 > news >正文

KONG - API转发流程梳理

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 nullcreated_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 nullcreated_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 CASCADETABLE "oauth2_tokens" CONSTRAINT "oauth2_tokens_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADETABLE "plugins" CONSTRAINT "plugins_service_id_fkey" FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADETABLE "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 upstreamsTable "public.upstreams"Column        |           Type           |                                 Modifiers
----------------------+--------------------------+---------------------------------------------------------------------------id                   | uuid                     | not nullcreated_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 nullhealthchecks         | 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 targetsTable "public.targets"Column    |           Type           |                                 Modifiers
-------------+--------------------------+---------------------------------------------------------------------------id          | uuid                     | not nullcreated_at  | timestamp with time zone | default timezone('UTC'::text, ('now'::text)::timestamp(3) with time zone)upstream_id | uuid                     |target      | text                     | not nullweight      | integer                  | not nulltags        | 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,完成请求的处理了。

相关文章:

  • 深入探索Java并发编程:ArrayBlockingQueue详解
  • Python最常用的库
  • 从零开始利用MATLAB进行FPGA设计(三)将Simulink模型转化为定点数据类型
  • C# RAM Stable Diffusion 提示词反推 Onnx Demo
  • 基于 Spark 的电商用户行为分析系统
  • AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤
  • 大语言模型(LLM)Token 概念
  • 如何配置Apache的反向代理
  • Linux动态库*.so函数名修改
  • 动态规划 Leetcode 377 组合总和IV
  • 记事小本本
  • web学习笔记(三十三)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)
  • Pytorch搭建AlexNet 预测实现
  • 分布式调用与高并发处理(二)| Dubbo
  • [译]Python中的类属性与实例属性的区别
  • Android 架构优化~MVP 架构改造
  • CAP 一致性协议及应用解析
  • IDEA 插件开发入门教程
  • If…else
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JS字符串转数字方法总结
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Spring框架之我见(三)——IOC、AOP
  • use Google search engine
  • vue-router 实现分析
  • win10下安装mysql5.7
  • 创建一种深思熟虑的文化
  • 官方解决所有 npm 全局安装权限问题
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 记一次删除Git记录中的大文件的过程
  • 开发基于以太坊智能合约的DApp
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 数据科学 第 3 章 11 字符串处理
  • 通过几道题目学习二叉搜索树
  • 小程序开发之路(一)
  • 《天龙八部3D》Unity技术方案揭秘
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​卜东波研究员:高观点下的少儿计算思维
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (145)光线追踪距离场柔和阴影
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (6)添加vue-cookie
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)模仿学习-Action数据的模仿
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(六):替换字符串中匹配的子串
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net Stream篇(六)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET大文件上传知识整理