API网关之Kong

news2024/12/23 17:38:27

Kong 是一个高性能的开源 API 网关和微服务管理平台,用于管理、保护和扩展 API 和微服务。它最初由 Mashape 公司开发,并于 2015 年作为开源项目发布。Kong 能够处理 API 的路由、认证、负载均衡、缓存、监控、限流等多种功能,是微服务架构中不可或缺的一部分。

Kong 的核心功能

  1. API 路由

    • Kong 通过定义路由将客户端的请求转发到适当的微服务。它支持基于路径、主机名、方法、请求头等多种路由规则,提供灵活的流量管理能力。
  2. 身份验证

    • Kong 提供了多种身份验证方式,包括 API Key、JWT、OAuth2、LDAP 等,确保只有经过认证的用户才能访问受保护的 API。
  3. 负载均衡

    • Kong 内置负载均衡功能,支持多种负载均衡算法(如轮询、权重等),能够将请求均匀地分发到后端的微服务实例中,提升系统的可靠性和可用性。
  4. 限流和速率限制

    • 通过限流插件,Kong 可以限制用户在一定时间内的请求数量,从而保护后端服务免受流量激增或恶意请求的影响。
  5. 日志记录与监控

    • Kong 能够集成各种监控和日志工具,如 Prometheus、Datadog、ELK 等,实时监控 API 的性能和使用情况,帮助运营团队及时发现问题并进行优化。
  6. 缓存

    • 通过缓存插件,Kong 可以缓存 API 的响应数据,减少后端服务的负载并提升响应速度。
  7. 请求和响应修改

    • Kong 提供了丰富的插件,用于在请求到达后端服务前或在响应返回客户端前对其进行修改,如添加或删除头信息、重写 URL、注入认证信息等。
  8. 安全性增强

    • Kong 支持 IP 白名单和黑名单、防火墙、请求速率限制等功能,增强了 API 和微服务的安全性。
  9. 服务发现与动态配置

    • Kong 可以与服务发现工具(如 Consul、etcd)集成,自动更新后端服务的配置,实现动态扩展和配置的自动化管理。
  10. 插件架构

    • Kong 的插件架构非常灵活,允许用户根据需要添加或移除功能插件。官方提供了许多插件,社区也有丰富的第三方插件可供选择。此外,用户还可以根据需求开发自定义插件。

Kong 的架构

Kong 的架构设计简单且高效,主要包括以下组件:

  1. Kong 网关

    • 核心组件,负责处理所有进入的 API 请求。它基于 OpenResty 和 Nginx 构建,具备高性能和可扩展性。
  2. Kong 数据库

    • 用于存储 Kong 的配置信息、插件数据和运行时状态。Kong 支持使用 PostgreSQL 或 Cassandra 作为后台数据库。
  3. Kong 管理 API

    • 提供了一套 RESTful API,允许管理员动态管理 Kong 的路由、服务、插件等配置。
  4. Kong Manager

    • 一种可视化的管理界面,帮助用户更方便地管理 Kong 集群和配置。
  5. Kong Dev Portal

    • 一个开发者门户,帮助 API 使用者浏览、测试和集成 API,增强了开发者的体验和合作。

Kong 的部署模式

Kong 支持多种部署模式,适应不同的架构和需求:

  1. 单节点部署

    • 适用于小规模应用或开发测试环境,Kong 和数据库部署在同一台机器上。
  2. 集群部署

    • 适用于生产环境,Kong 可以部署在多台服务器上,通过数据库共享配置,实现高可用性和负载均衡。
  3. 无数据库模式(DB-less)

    • 在无数据库模式下,Kong 的所有配置通过静态文件或环境变量加载,适用于需要快速启动且不依赖数据库的场景。
  4. 混合部署模式

    • 支持分布式部署,其中控制平面(负责管理配置)和数据平面(处理 API 请求)分离,适用于跨地域的大规模分布式系统。

Kong 的应用场景

  1. 微服务架构管理

    • 在微服务架构中,Kong 作为 API 网关,集中管理和保护所有微服务的 API 接口,简化了微服务间的通信与协作。
  2. API 管理

    • Kong 提供全面的 API 管理功能,包括认证、限流、日志记录、监控等,适合需要公开 API 的企业或平台。
  3. 安全增强

    • 通过插件,Kong 可以为微服务和 API 提供多层次的安全防护,如身份认证、IP 过滤、防火墙等。
  4. 流量控制

    • Kong 的限流和负载均衡功能帮助企业在流量高峰时平衡请求负载,避免系统过载。
  5. 服务发现与负载均衡

    • Kong 与服务发现工具的集成,自动实现后端服务的动态配置与负载均衡,提升系统的灵活性和可靠性。

Kong使用示例

        使用 Kong 的基本配置示例,涵盖了服务、路由、插件等配置的完整流程。

1. 启动 Kong 和数据库

首先,确保 Kong 和数据库(如 PostgreSQL 或 Cassandra)已经启动并连接。你可以使用 Docker 快速启动 Kong 和 PostgreSQL:

# 启动 PostgreSQL
docker run -d --name kong-database \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kong" \
  postgres:11

# 启动 Kong
docker run -d --name kong \
  --link kong-database:kong-database \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-database" \
  -e "KONG_PG_PASSWORD=kong" \
  -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  -p 8444:8444 \
  kong:latest

2. 配置服务和路由

添加服务

首先,添加一个服务(即你想要代理的后端服务):

curl -i -X POST http://localhost:8001/services/ \
  --data name=my-service \
  --data url='http://httpbin.org'

此命令将 httpbin.org 添加为一个名为 my-service 的服务。Kong 将代理到该服务。

添加路由

接下来,配置一个路由,使得客户端请求能通过 Kong 转发到该服务:

curl -i -X POST http://localhost:8001/services/my-service/routes \
  --data 'hosts[]=example.com'

该路由配置表示,当请求的 Host 头为 example.com 时,Kong 会将请求路由到 my-service 服务。

3. 添加插件

添加身份验证插件

假设你想为此服务添加一个简单的 API 密钥认证,可以添加如下插件:

curl -i -X POST http://localhost:8001/services/my-service/plugins \
  --data "name=key-auth"

添加完插件后,你需要为客户端生成并分发 API 密钥:

curl -i -X POST http://localhost:8001/consumers/ \
  --data "username=my-consumer"

curl -i -X POST http://localhost:8001/consumers/my-consumer/key-auth/ \
  --data "key=my-secret-key"

现在,客户端必须在请求头中带上 apikey: my-secret-key 才能访问 my-service

添加限流插件

为了防止服务被过多的请求压垮,你可以为 my-service 添加限流插件:

curl -i -X POST http://localhost:8001/services/my-service/plugins \
  --data "name=rate-limiting" \
  --data "config.minute=5"

这个配置将请求限制为每分钟最多 5 个请求。

4. 测试配置

在配置完成后,你可以通过以下方式测试你的 Kong 配置:

curl -i -X GET --url http://localhost:8000/anything \
  --header "Host: example.com" \
  --header "apikey: my-secret-key"

这个请求会被转发到 httpbin.org/anything,同时由于携带了正确的 Hostapikey,请求将成功通过 Kong 的路由和插件验证。

5. 管理和监控

你可以通过 Kong 的管理 API 访问和管理所有配置。访问 http://localhost:8001 可以查看所有服务、路由、插件、消费者等配置。

Kong 的优缺点

优点
  • 高性能:基于 Nginx 和 OpenResty 构建,Kong 具有极高的性能和并发处理能力。
  • 插件丰富:Kong 提供了大量的官方插件,并支持用户自定义插件,功能扩展性强。
  • 易于集成:Kong 可以与现有的监控、日志和认证系统无缝集成,简化了 API 和微服务的管理。
  • 灵活的部署方式:支持多种部署模式,包括无数据库模式,适应不同规模的应用场景。
  • 强大的社区支持:Kong 拥有一个活跃的社区,提供了丰富的文档、插件和第三方工具支持。
缺点
  • 学习曲线:对于新手来说,Kong 的配置和管理可能需要一定的学习成本,特别是在复杂的部署场景下。
  • 依赖性:某些功能和插件可能依赖于特定的数据库或第三方服务,这可能增加系统的复杂性。

总结

Kong 是一个功能强大且灵活的 API 网关,适合在微服务架构和大型 API 管理平台中使用。它不仅提供了丰富的功能,还通过插件系统实现了极高的扩展性。无论是为了提升 API 的安全性、可用性,还是简化微服务间的通信与管理,Kong 都是一个值得考虑的解决方案。

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

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

相关文章

Mysql中count(*) over 用法讲解

Mysql中count(*) over ()用法讲解 一、原理1、原理介绍 二、下面是一个使用COUNT(*) OVER()的代码示例:1、代码示例2、结果详解3、COUNT(*) OVER() 分区用法 三 、总结 一、原理 1、原理介绍 在MySQL中,C…

MySQL集群的基础部署及主从复制详解

一、Msql在服务器中的部署方法 官网:http://www.mysql.com 在企业中90%的服务器操作系统均为Linux 在企业中对于Mysql的安装通常用源码编译的方式来进行 1.1 在Linux下部署MySQL 1.1.1 部署环境 主机IP角色MySQL-node1172.25.254.13masterMySQL-node2172.25.…

【C语言】深入理解指针(四)qsort函数的实现

指针4 1.回调函数是什么2.qsort使用举例3.qsort函数的模拟实现 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的…

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆,测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

Leetcode JAVA刷刷站(98)验证二叉搜索树

一、题目概述 二、思路方向 在Java中,要判断一个二叉树是否是有效的二叉搜索树(BST),我们可以采用递归的方法,通过维护一个外部的范围(通常是Integer.MIN_VALUE到Integer.MAX_VALUE作为初始范围&#xff…

网络优化4|网络流问题|路径规划问题|车辆路径问题

网络流问题 网络最大流问题 研究网络通过的流量也是生产管理中经常遇到的问题 例如:交通干线车辆最大通行能力、生产流水线产品最大加工能力、供水网络中最大水流量等。这类网络的弧有确定的容量,虽然常用 c i j c_{ij} cij​表示从节点 i i i到节点 j…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写,它是一个允许计算机短期存储数据以更快访问的组件。众所周知,操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时,CPU 会将数据传输到 RAM 中进行计…

安防视频汇聚平台EasyCVR启动后无法访问登录页面是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南?Jenkins怎么配置服务器? Jenkins作为一个流行的自动化服务器,其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能,以实现自动化通知。 Jenkins发邮件&#xf…

NVI技术创新联盟成立,BOSMA博冠IP轻量化制播已运用

2024年北京国际广播电影电视展览会(BIRTV)首日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV 2024超高清全产业链发展研讨会上宣布正式成立。作为国产8K摄像机先行者,BOSMA博冠受邀加入NVI技术…

Flowable BPMN bpmnjs 设计器

最近半年我一直在打造一款行业顶尖的流程设计器,适配了flowable所有的组件,美观,大方,灵活,好用。所有的组件都进行严格的测试并在生产环境上线了。 1、在线预览 2、整体框架布局 3、组件分组 4、完整模式切换 给大…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话,测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi,他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包,java -jar ruoyi-admin.jar就可以了 将jar上…

STM32嵌套向量中断控制器—NVIC

NVIC简介: NVIC,即Nested Vectored Interrupt Controller(嵌套向量中断控制器),是STM32中的中断控制器。它负责管理和协调处理器的中断请求,是STM32中处理异步事件的重要机制。 NVIC提供了灵活、高效、可扩…

IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与讨论会!

再获权威顶会认可 8 月 26 日至 8 月 30 日,数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 三篇论文的最新研发成果被本次大会录用,这其中也包括 TsFile 成为 Apache Top-Level 项目后发表的第一篇顶会论文。 同时,在国际权威数据库…

博弈论详解 2(SG函数 和 SG定理)

传送门:博弈论详解 1(基本理论定义 和 Nim 游戏) 什么是 SG 函数 接着上次的讲解,我们来了解一个更通用的模型。我们把每一个状态变成一个点(在 Nim 游戏里就代表 a a a 数组),如果可以从一种…

008、架构_分布式事务

分布式事务控制 对于一个分布式写事务,计算节点会向GTM申请全局事务GTID,GTID申请成功后,称当前GTID对应的事务是活跃事务,处于未提交状态。如果涉及数据更新,则将GTID信息同步更新到该事务要更新的事务中。成功提交事务后,这里的成功是指分布式事务涉及所有数据节点均提…

C++入门基础知识37——【关于C++ 运算符——关系运算符】

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

Day24 第11站 出发 c++!

1> 思维导图 2> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 string s1;cout << "请输入一个字符串" << endl;getline(cin,s1);int len s1.length();char buf[128]"";strcpy(buf,s1…

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具&#xff0c;可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及&#xff0c;Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …