0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

API 网关详细介绍(上)

jf_78858299 来源:Steve的后端小栈 作者: Steave 2023-05-04 17:28 次阅读

业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 Tyk 等。

GoKu API Gateway 是由国内公司 eolinker 使用 Go 语言研发,拥有社区版和商业版,包含 API Gateway 和 Dashboard 两部分。其中社区版本包含大量基础功能,可以满足中型企业和产品的使用;企业版本包含更多扩展;比较适合大型软件和大型组织使用。

Tyk 由国外的 TykTechnologies 公司研发,也是基于 Go 语言。Tyk 一切均导向收费版本,免费版本第一次申请有一年的使用授权。

下面将会介绍常用的 API 网关组件 Nginx、Zuul 和 Kong 的相关特性。

Nginx

Nginx 可以说是互联网应用的标配组件,主要的使用场景包括负载均衡、反向代理、代理缓存、限流等。

Nginx 由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行 URL 匹配,用于启动不同的模块去完成相应的工作。

Nginx 在启动后,会有一个 Master 进程和多个 Worker 进程,Master 进程和 Worker 进程之间是通过进程间通信进行交互的,如图所示。Worker 工作进程的阻塞点是在像 select()、epoll_wait() 等这样的 I/O 多路复用函数调用处,以等待发生数据可读 / 写事件。Nginx 采用了异步非阻塞的方式来处理请求,也就是说,Nginx 是可以同时处理成千上万个请求的。

图片

还可以将 Lua 嵌入到 Nginx 中,从而可以使用 Lua 来编写脚本,这样就可以使用 Lua 编写应用脚本,部署到 Nginx 中运行,即 Nginx 变成了一个 Web 容器;这样开发人员就可以使用 Lua 语言开发高性能Web应用了。在开发的时候使用 OpenResty 来搭建开发环境,OpenResty 将 Nginx 核心、LuaJIT、许多有用的 Lua 库和 Nginx 第三方模块打包在一起;这样只需要安装 OpenResty,不需要了解 Nginx 核心和写复杂的 C/C++ 模块就可以,只需要使用 Lua 语言进行 Web 应用开发了。

使用 Nginx 的反向代理和负载均衡可实现负载均衡及高可用,除此之外还需要我们解决自注册和网关本身的扩展性。

Springcloud-gateway

Spring Cloud Gateway 是 Spring Cloud 微服务生态下的网关组件。Spring Cloud Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的

Netflix Zuul

Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型。Zuul 的核心是一系列的过滤器,这些过滤器可以完成以下功能:

  • 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
  • 审查与监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由:动态地将请求路由到不同的后端集群。
  • 压力测试:逐渐增加指向集群的流量,以了解性能。
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
  • 多区域弹性:跨越 AWS Region 进行请求路由,旨在实现 ELB(Elastic Load Balancing,弹性负载均衡)使用的多样化,以及让系统的边缘更贴近系统的使用者。

上面提及的这些特性是 Nigix 所没有的,Netflix 公司研发 Zuul 是为了解决云端的诸多问题(特别是帮助 AWS 解决跨 Region 情况下的这些特性实现),而不仅仅是做一个类似于 Nigix 的反向代理,当然,我们可以仅使用反向代理功能,这里不多做描述。

Zuul 目前有两个大的版本:Zuul1 和 Zuul2。

  • Zuul1 是基于 Servlet 框架构建,如图所示,采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。
  • Netflix 发布的 Zuul2 有重大的更新,它运行在异步和无阻塞框架上,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。

Kong

Kong 是 Mashape 开源的高性能高可用 API 网关和 API 服务管理层,一款基于 Nginx_Lua 模块写的高可用服务网关,由于 Kong 是基于 Nginx 的,所以可以水平扩展多个 Kong 服务器。通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。

Nginx、Zuul 和 Kong 这三种 API 网关组件的功能和特性,并制作了如下的对比表格:

组件/指标 Nginx Zuul(1.x)/springcloud gateway Kong 社区版
API 注册/动态路由 在Nginx中配置 动态路由 通过 Admin API 管理
支持协议 RESTful API RESTful API RESTful API
插件机制 Lua 插件机制 可以基于源码定制开发,基于 Servlet/Filter Lua 插件机制
安全认证 & 鉴权 插件支持 支持 OAuth、JWT 等 支持OAuth2.0、黑白名单、ACL、JWT、SSL 等
限流 插件 插件 支持Rate Limiting
高可用集群 配合硬件负载均衡 可以通过部署多个 Zuul 做负载均衡 支持集群
可管理性 没有 GUI 管理台 提供 Rest API 交互
性能 一般
日志记录 Nginx 可灵活记日志 可自行配置 日志可以记录到磁盘,或者HTTP、TCP、UDP发出去

总得来说,Zuul 复杂度较低,上手简单,可以自定义开发,但是高并发场景下的性能相对较差;Nginx 性能经受得住考验,配合 Lua 可以引入各种插件,但是功能性相对较弱,需要开发者自身去完善很多功能;Kong 基于 Nginx、OpenResty 和 Lua,对性能要求高,需要对外开放,建议考虑使用 Kong。下面我们将重点介绍。

Kong网关介绍:

  • 为什么需要云原生网关?
  • Kong 介绍
  • Kong 的基本架构
  • 使用 Kong 构建服务网关
  • 几种常用插件应用
  • 自定义插件的实践

为什么需要 API 网关?

当使用单体应用程序架构时,客户端(Web 或移动端)通过向后端应用程序发起一次 REST 调用来获取数据。负载均衡器将请求路由给 N 个相同的应用程序实例中的一个。然后应用程序会查询各种数据库表,并将响应返回给客户端。微服务架构下,单体应用被切割成多个微服务,如果将所有的微服务直接对外暴露,势必会出现安全方面的各种问题。

客户端可以直接向每个微服务发送请求,其问题主要如下:

  • 客户端需求和每个微服务暴露的细粒度 API 不匹配。
  • 部分服务使用的协议不是Web友好协议。可能使用 Thrift 二进制 RPC,也可能使用 AMQP 消息传递协议。
  • 微服务难以重构。如果合并两个服务,或者将一个服务拆分成两个或更多服务,这类重构就非常困难了。

服务端的各个服务直接暴露给客户端调用势必会引起各种问题。同时,服务端的各个服务可扩展和伸缩性很差。API 网关是微服务架构中的基础组件,位于接入层之下和业务服务层之上,如前所述的这些功能适合在 API 网关实现。

关于服务网关的开源组件,有 Netflix Zuul、Spring Cloud Gateway、Kong、Traefik、NGINX 和服务网关类型的 Envoy 等。我们现在使用的是可编程的新型网关:Spring Cloud Gateway, Spring Cloud Gateway是基于WebFlux异步编程技术。本文主要介绍现代微服务网关 Kong,在 Kong 的官网介绍中,第一条特性便是 Kong 的云原生属性:与平台无关,Kong 可以从裸机运行到 Kubernetes。本文基于 Kong 1.2.1,自定义插件部分会涉及部分 Lua 编码,适合服务端开发和运维人员。

  1. 什么是 Kong

    当我们决定对应用进行微服务改造时,应用客户端如何与微服务交互的问题也随之而来,毕竟服务数量的增加会直接导致部署授权、负载均衡、通信管理、分析和改变的难度增加。

    面对以上问题,API GATEWAY是一个不错的解决方案,其所提供的访问限制、安全、流量控制、分析监控、日志、请求转发、合成和协议转换功能,可以解放开发者去把精力集中在具体逻辑的代码,而不是把时间花费在考虑如何解决应用和其他微服务链接的问题上。

  2. 为什么使用Kong

    在众多 API GATEWAY 框架中,Mashape 开源的高性能高可用API网关和API服务管理层——KONG(基于 NGINX)特点尤为突出,它可以通过插件扩展已有功能,这些插件(使用 lua 编写)在API请求响应循环的生命周期中被执行。于此同时,KONG本身提供包括 HTTP 基本认证、密钥认证、CORS、TCP、UDP、文件日志、API请求限流、请求转发及 NGINX 监控等基本功能。目前,Kong 在 Mashape 管理了超过 15,000 个 API,为 200,000 开发者提供了每月数十亿的请求支持。

Kong 的基本架构

Kong 是基于 Nginx 的,所以可以水平扩展多个 Kong 服务器。通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。

图片

Kong 主要有三个组件:

  • Kong Server :基于nginx的服务器,用来接收 API 请求。
  • Apache Cassandra/PostgreSQL:用来存储操作数据。
  • Kong dashboard:官方推荐 UI 管理工具,当然,也可以使用 restfull 方式管理 admin api。

Kong 采用插件机制进行功能定制,插件集(可以是 0 或 N 个)在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,基础功能包括:HTTP 基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 Nginx 监控等。

Kong 网关具有以下的特性:

  • 可扩展性: 通过简单地添加更多的服务器,可以轻松地进行横向扩展,这意味着您的平台可以在一个较低负载的情况下处理任何请求;
  • 模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API轻松配置;
  • 在任何基础架构上运行: Kong 网关可以在任何地方都能运行。可以在云或内部网络环境中部署 Kong,包括单个或多个数据中心设置,以及 public,private 或 invite-only APIs。

常用概念

Kong 中常用的术语介绍,这些术语会在下面的实践中经常用到。

  • Route:请求的转发规则,按照 Hostname 和 PATH,将请求转发给 Service;
  • Services:多个 Upstream 的集合,是 Route 的转发目标;
  • Consumer:API 的用户,记录用户信息
  • Plugin:插件,可以是全局的,也可以绑定到 Service、Router 或者 Consumer;
  • Certificate:https 配置的证书;
  • Sni:域名与 Certificate 的绑定,指定了一个域名对应的 https 证书;
  • Upstream:上游对象用来表示虚拟主机名,拥有多个服务(目标)时,会对请求进行负载均衡;
  • Target:最终处理请求的 Backend 服务。

使用 Kong 构建服务网关

客户端的请求将会首先经由微服务网关处理,一些通用的功能切面将会在网关生效,即 Kong 中的插件,之后才会将请求进行转发到对应的 Backend 服务,如下图所示。

安装实践

目前 Kong 的最新版本 1.2,Kong 的安装支持多种方式。官方支持如下列出方式的安装:

图片

除了官方提供的安装方式,还有社区提供的安装方式,详细了解参见:https://konghq.com/install/。

一、安装Kong

1.构建 Kong 的容器网络

首先我们创建一个 Docker 自定义网络,以允许容器相互发现和通信。在下面的创建命令中 kong-net 是我们创建的 Docker 网络名称。

docker network create kong-net

2.搭建数据库环境

Kong 目前使用 Cassandra 或者 PostgreSQL,你可以执行以下命令中的一个来选择你的 Database。请注意定义网络 --network=kong-net 。

使用 PostgreSQL:

docker pull postgres:9.6

 docker run -d --name kong-database \\
                --network=kong-net \\
                -p 5432:5432 \\
                -e "POSTGRES_USER=kong" \\
                -e "POSTGRES_DB=kong" \\
                -e "POSTGRES_PASSWORD=kong" \\
                postgres:9.6

3.初始化或者迁移数据库

我们使用 docker run --rm 来初始化数据库,该命令执行后会退出容器而保留内部的数据卷(volume)。这个命令我们还是要注意的,一定要跟你声明的网络,数据库类型、host 名称一致。

下面指定的数据库是 PostgreSQL:


docker run --rm \\
      --network=kong-net \\
      -e "KONG_DATABASE=postgres" \\
      -e "KONG_PG_HOST=kong-database" \\
      -e "KONG_PG_PASSWORD=kong" \\
      -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \\
      kong:1.5.1 kong migrations bootstrap

4.启动 Kong 容器

完成初始化或者迁移数据库后,我们就可以启动一个连接到数据库容器的 Kong 容器,请务必保证你的数据库容器启动状态,同时检查所有的环境参数 -e 是否是你定义的环境。


docker pull kong:1.5.1

 docker run -d --name kong \\
      --network=kong-net \\
      -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, 0.0.0.0:8444 ssl" \\
      -p 8000:8000 \\
      -p 8443:8443 \\
      -p 8001:8001 \\
      -p 8444:8444 \\
      kong:1.5.1

Kong 默认绑定 4 个端口

8000:用来接收客户端的 HTTP 请求,并转发到 upstream。
 8443:用来接收客户端的 HTTPS 请求,并转发到 upstream。
 8001:HTTP 监听的 API 管理接口
 8444:HTTPS 监听的 API 管理接口。

到这里,Kong 已经安装完毕,我们可以使用 docker ps 命令查看当前运行容器,正常情况下可以看到 Kong 和 PostgreSQL 的两个容器:


docker ps

图片

我们可以通过 curl -i http://192.168.1.200:8001 来查看 Kong 是否运行完好。

二、安装Kong UI

Kong 企业版提供了管理 UI,开源版本是没有的。但是有很多的开源的管理 UI ,其中比较流行的有Kong Dashboard 和 Konga。简单介绍一下 Kong Dashboard 和 Konga。

1.Kong Dashboard

docker 环境中安装运行如下:


docker pull pgbi/kong-dashboard

 docker run --rm  \\
 --network=kong-net \\
 -p 8080:8080 \\
 pgbi/kong-dashboard start \\
 --kong-url http://kong:8001

启动之后,可以在浏览器中输入 http://192.168.1.200:8080/ 来访问 Kong Dashboard 管理界面。

2.Konga

Konga(官网地址:pantsel.github.io/konga/,Github地址:github.com/pantsel/kon… )可以很好地通过 UI 观察到现在 Kong 的所有的配置,并且可以对于管理Kong节点情况进行查看、监控和预警。Konga主要是用 AngularJS 写的,运行于 nodejs 服务端。具有以下特性:

  • 管理所有 Kong Admin API 对象。
  • 支持从远程源(数据库,文件,API等)导入使用者。
  • 管理多个 Kong 节点。使用快照备份,还原和迁移 Kong 节点。
  • 使用运行状况检查监视节点和 API 状态。
  • 支持电子邮件和闲置通知。
  • 支持多用户。
  • 易于数据库集成(MySQL,PostgresSQL,MongoDB,SQL Server)。

下面使用的 PostgreSQL 是和上面在 docker 环境中安装 Kong 时的是一致的,注意用户名、密码、数据库名称等配置,docker 环境安装启动 Konga:

docker pull pantsel/konga

 docker run  -d -p 1337:1337 \\
         --network kong-net \\
         --name konga \\
         -e "DB_ADAPTER=postgres" \\
         -e "DB_URI=postgresql://kong:kong@kong-database/kong" \\
         pantsel/konga

如果 Konga 容器启动成功,可以通过 http://192.168.1.200:1337/ 访问管理界面。通过注册后进入,然后在 CONNECTIONS 中添加 Kong 服务的管理路径 http://192.168.1.200:8001。Konga 管理界面示例如下:

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网关
    +关注

    关注

    9

    文章

    3212

    浏览量

    50022
  • API
    API
    +关注

    关注

    2

    文章

    1383

    浏览量

    60992
  • nginx
    +关注

    关注

    0

    文章

    135

    浏览量

    11986
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8927
收藏 人收藏

    评论

    相关推荐

    API信息全掌控,方便你的日志管理——阿里云推出API网关打通日志服务

    摘要: 近日,阿里云API网关对接了日志服务,可以输出用户在API网关产生的API调用日志,目前支持将
    发表于 02-06 15:24

    哪位大神可以详细介绍一下MQTT API吗?

    MQTT API介绍
    发表于 04-02 07:24

    AI边缘计算网关介绍

    AI边缘计算网关介绍:智能网关支持物联网硬件多协议接入,适应各种无线通信协议场景。只需通过硬件板卡的快速装卸,就可以实现功能的自由增删。同时智能网关运行Mosquitto等服务实现了M
    发表于 07-26 06:41

    介绍ZigBee网关的架构

    前面的文章中,我们通过实际案例介绍了 ZigBee 网关的架构,相信大家对于网关该如何挑选合适的器件来实现相应功能有了一定了解。那么本文将从硬件设计的角度来继续网关的话题!硬件电路是
    发表于 11-11 08:18

    介绍LoRaWAN网关的技术基础及其工作原理

    /软件组件四、总结在上一篇文章中我大概解释了什么是LoRaWAN网关。今天我将会更详细地给大家介绍LoRaWAN网关的技术基础及其工作原理。只有了解这些,我们才能让我们更好地了解
    发表于 02-14 07:45

    【RA4M2设计挑战赛】作品提交 - 智慧网关以农作物大棚为例的应用

    :红外模块本地控制:蓝牙模块详细介绍:此网关主要有以下功能,可以通过温湿度检测模块进行检测温度、湿度等。通过检测的温度、湿度来进行判断,比如说温度过高我们就通过红外模块进行控制,空调进行控制这个温度,当
    发表于 03-04 23:39

    什么是API网关为什么需要API网关

    API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等。
    发表于 12-23 09:57 1.2w次阅读
    什么是<b class='flag-5'>API</b><b class='flag-5'>网关</b>为什么需要<b class='flag-5'>API</b><b class='flag-5'>网关</b>

    网关怎么查看_网关的线怎么插

    本文详细介绍网关的查看方法及网关的线的插法。
    发表于 04-30 09:59 1.3w次阅读
    <b class='flag-5'>网关</b>怎么查看_<b class='flag-5'>网关</b>的线怎么插

    ESP8266字符串API详细概述

    本文档的主要内容详细介绍的是ESP8266字符串API详细概述。
    发表于 07-17 08:00 1次下载
    ESP8266字符串<b class='flag-5'>API</b>的<b class='flag-5'>详细</b>概述

    什么是API网关

    API应用编程接口(Application Programming Interface)是一组用于构建和集成应用软件的定义和协议。
    的头像 发表于 07-03 09:37 2469次阅读

    关于API网关策略的知识分享

    近些年随着云原生和微服务架构的日趋发展,API 网关以流量入口的角色在技术架构中扮演着越来越重要的作用。API 网关主要负责接收所有请求的流量并进行处理转发至上游服务,
    的头像 发表于 02-11 10:45 909次阅读

    API 网关详细介绍(下)

    业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 T
    的头像 发表于 05-04 17:28 583次阅读
    <b class='flag-5'>API</b> <b class='flag-5'>网关</b><b class='flag-5'>详细</b><b class='flag-5'>介绍</b>(下)

    为什么需要 API 网关

    API 网关API 全生命周期管理的关键基础组件,负责生产环境中 API 的配置、发布、版本回滚、安全、负载均衡等。API
    的头像 发表于 05-04 17:47 543次阅读
    为什么需要 <b class='flag-5'>API</b> <b class='flag-5'>网关</b>?

    企业怎么选择API网关

      一、API网关的用处 API网关我的分析中会用到以下三种场景。 1、Open API 企业需要将自身数据、能力等作为开发平台向外开放,通
    的头像 发表于 05-23 11:05 394次阅读
    企业怎么选择<b class='flag-5'>API</b><b class='flag-5'>网关</b>

    api网关 kong 教程入门

    统一权限控制、接口请求访问日志统计 安全,是保护内部服务而设计的一道屏障 开源-最大好处 当然也有一个很大的缺点,api-gw很可能成为性能瓶颈,因为所有的请求都经过这里,可以通过横向扩展和限流解决这个问题。 在众多API GATEWAY框架中,Mashape开源的高性
    的头像 发表于 11-10 11:39 278次阅读
    <b class='flag-5'>api</b><b class='flag-5'>网关</b> kong 教程入门