微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
一、为什么会有 API Gateway 网关
随着微服务架构的流行,很多公司把原有的单体架构改造成了微服务架构。
第一步:拆分
微服务架构就是把一个大单体改造成一个一个小的应用。比如把一个电商网站,从单体改造成微服务架构,如下图:

改造成微服务后,用户通过 PC 和手机访问电商应用,都是调用后面的微服务 API,而且各自要调用多个后端 API 服务才能拿到需要的数据。业务量小的时候,这种访问方式没有多大问题。用户多了访问量大了呢?这种方式就不能持续。
第二步:API 功能逐渐增多
如果后面业务发展较快,用户需要的功能越来越多,那么相应的后端微服务的数量也会越来越多,用上面这种方式来访问,调用的微服务 API 数量越来越多,如果访问量大服务器压力就会加大,那能不能缩减下调用 API 的数量,减轻服务器访问压力?聚合服务,内部聚合一些 API 服务接口形成一个聚合服务,PC 或手机客户端访问这个聚合服务,是不是就减少了访问次数?提高访问性能,提升用户体验。
为了提高 API 服务的可用性,还会给 API 加上限流控制,超时控制,熔断降级,API 隔离等功能。
为了提高 API 服务访问安全性,还会给 API 加上访问控制,比如进行 JWT 验证,黑白名单机制。如下图:

第三步:API 网关
想一想,每一个 API 服务都需要这些功能,那能不能把这些功能集和在一起?后面就不需要给每个 API 添加同样的功能。减少开发时间。
这些功能都可以集成到 API Gateway 网关中,如下图:

还有,要上线服务或重构 API 服务时,这种用户直接访问的方式,就会造成用户访问出现错误,对用户体验是很大伤害。API 网关屏蔽用户直接访问后端服务,它就可以平滑过渡这种发布需求或重构 API 需求。
它还有负载均衡,后端服务可以进行相应扩展。
二、API 网关功能
通过上面介绍可以看到,API 网关可以统一后端的访问,也就是用户访问后端服务必须通过 API 网关才能够访问到。API 网关统一管理了后端的服务接入服务。
它就相当于一尊门神,守护着后端的所有服务。
API 网关的功能:
API 管理:API 上线、下线,API 路由转发
服务治理:限流控制,超时控制,熔断降级
安全策略:统一身份认证,黑白名单机制
协议转换:REST、gRPC、Dubbo 不同协议转换
API 发布策略:灰度发布,流量染色
负载均衡:服务扩展,服务伸缩
其他一些功能:监控报警、链路追踪、日志收集审查等。
三、常见开源 API 网关介绍
在前面写的关于微服务文章:微服务架构学习与思考(04):微服务技术体系 一文中又提到过一些开源网关软件。这次再来详细介绍下开源 API 网关软件。
3.1 以 Nginx 为基础的网关
以 Nginx 为基础,在加上 Lua 语言来进行扩展编程的网关。
3.1.1 OpenResty
介绍:OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty 官网:官网地址
github:OpenResty github
看这个介绍,OpenResty 的功能不止于网关功能,还有高性能动态 Web 应用和服务。
它内部集成了大量精良的 Lua 库,库地址 。
有很多 Nginx API for lua,你可以自己用 lua 来编写相关功能。
当然,它还提供一个企业级(收费服务)产品,提供了很多关于 API 网关功能,Web 界面的操作。
没有找到与开源产品功能对比,只有企业级产品功能介绍。
3.1.2 Kong
Kong 网关介绍
kong 是一个高性能高可用易扩展的 API 网关和 API 服务管理的软件,它基于 OpenResty(Nginx+Lua)。
它可以在物理机上运行也可以在 kubernetes 上运行。
kong 官网:官网地址
github地址:kong github
kong 也提供了一张使用网关前后的对比图,可以直观看到使用 API 网关的变化,API 自身的功能明显减少,都集成到 kong 里面:

(来自:https://github.com/Kong/kong)
一些通用的功能都集成到 kong 里,而后面 API/RPC 只需要编写业务相关功能就可以了,简化了 API 开发。
kong 架构
kong 架构图:

- Admin API:通过 admin api 来管理 kong 的功能
- Plugins:插件,默认插件和用户自定义插件
- Clustering & Database:存储 kong 集群节点信息,API 信息,插件信息等。目前提供了 PostgreSQL 和 Cassandra 2 种支持,如果需要高可用建议使用 Cassandra。
- OpenResty:处理插件、运行插件程序
- Nginx:处理底层操作
功能简介
- 开源产品和企业产品功能对比
kong 也提供了企业级产品,它还给出了 kong 开源产品和 kong 企业级产品功能对比图,功能详细对比在这里 https://docs.konghq.com/gateway/latest/#features。
可以看到,企业级产品比开源产品提供了丰富得多的功能,这样才能给企业提供价值。
对比来看,开源功能相对企业版较少(开源产品功能也挺多),但是开源产品功能已经足够小公司用,还能自定义插件功能。如果你有预算费用可以使用企业版,这样更快还有官方咨询服务。如果没有预算,那开源也足够用,也可自己开发插件。
- 开源产品功能
开源产品除了提供一些基础功能:
包括 HTTP 基本认证、密钥认证、CORS、监控、文件日志、API 请求限流、请求转发、缓存、SSL设置等基本功能,这些功能都是通过插件机制实现。
在 kong 3.0.x 文档中,还看到了蓝绿部署、cluster等功能,更多功能可以看文档。
还有一些其他重要功能特性:
- 集群
kong 支持单节点集群和多节点集群。
单节点集群:连接到数据库(Cassandra 或 PostgreSQL)的单个 Kong 节点创建一个节点的 Kong 群集。通过此节点的 Admin API 应用的任何更改都将立即生效。
多节点集群:多节点集群它是通过定期后台作业与其他节点进行数据同步。可以通过配置参数 db_update_frequency(默认 5 秒) 更改频率,这个频率更新有点慢。所以 kong 集群数据一致性是最终一致性。
kong 也给用户提供了自定义插件的功能,如果你有需要,自己可以编写插件来扩展 kong 的功能。
- 扩展功能-编写插件
用户可以编写插件来对 kong 功能进行扩展,kong 的插件是在 API 请求响应循环的生命周期中被执行的。
kong 插件文档,默认用 lua 语言来编写插件,也可以用其它语言。
a. 编写插件可以使用的语言 lua,Go,python,js
kong 在 2.6.x 支持了其他语言编写插件,有 Go,python,js,文档地址:https://docs.konghq.com/gateway/2.6.x/reference/external-plugins/。更老的版本应该也有支持的,得去看文档。
它还有一个编写插件的模板。
b. 插件市场 plugin hub
kong 也有自己的一个插件市场,也就是说你也可以给 kong 贡献第三方插件,是优质插件可能会被收录。
- 通过 admin-api 来管理 kong
详细看文档地址:https://docs.konghq.com/gateway/3.0.x/admin-api/
web UI 界面管理
kong 企业版提供了管理 UI,开源版本没有管理 UI。但是程序员是多么的勤奋也崇尚开源,所以就有很多开源贡献的管理 UI,其中比较好用的,介绍 1 个, konga。
konga 看 github 上的更新时间,也是 3 年前了,也算比较老的了。
3.1.3 APISIX 网关
APISIX 介绍
Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以使用 Apache APISIX 来处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 K8s Ingress Controller 来使用。
apisix 也是基于 nginx,openresty 的。
apisix 文档:apisix doc
apisix github:apisix github
APISIX 架构
整体架构图:

(from:https://apisix.apache.org/zh/docs/apisix/getting-started/)
从图上可以看出,APISIX 底层基座也是基于 Nginx 和 OpenResty。运行在基座之上的是 APISIX 软件。
底层技术基座:Nginx 和 OpenResty
APISIX软件:看上面架构图,
第一部分:APISIX Core,apisix 核心,包括 Lua 插件、多语言插件运行时(Plugin Runner)、Wasm 插件运行时等
第二部分:各种内置插件,包括可观测性、安全、流量控制等插件。
APISIX 多语言插件运行时提供多种开发语言的支持,比如 Golang、Java、Python、JS 等。
技术架构图:
从另外一个角度来看看apisix架构,分为数据面和控制面:

(from:https://github.com/apache/apisix)
- apisix 使用 etcd 作为配置中心来进行数据信息保存和同步配置。
特性功能
可以到 github 上看它的 Features,列举了很多功能特性。
- 扩展能力-插件功能
a)apisix 内置了很多插件,可以看文档 Plugins。
b)它也有一个插件市场,plugin hub。
c)当然你也可以自定义插件。这些看起来与 kong 开源版本拥有扩展功能差不多。
- 高可用集群
- Apache APISIX 的数据平面是无状态的,可以进行随意的弹性伸缩,前面加一层负载均衡即可
- Apache APISIX 的控制平面是依赖于 etcd cluster 的高可用实现的,不需要任何关系型数据库的依赖
与 kong 区别:
这第二点与 Kong 集群有区别,Kong 集群依赖的是 Postgre 和 Cassandra。
Web UI
通过RESTful API 来管理 apisix,通过 Admin API 来管理 apisix 节点。通过 Control API 控制单个 apisix 数据平面行为。
官方还提供了一个 Dashboard,通过 UI 管理 apisix。
与 kong 区别:
kong 开源版本没有这个 Dashboard 功能,企业版本有。
3.1.4 Orange 网关
这个 orange 也是一 OpenResty 为基础开发的网关,
orange 官网: orange 地址
github 地址:orange github
orange 的功能相对于前面的 kong 和 apisix,比较少。所以它的架构肯定比他们简单,可以作为学习之用。
如果你不需要那么多功能,可以试用下这款 API 网关。
四、API 网关缺点
- 让系统复杂度变高
在整个系统架构中,多一个了 API 网关,就多了一份维护工作,多了一处发生“危险”的地方。
- API 网关可能成为性能瓶颈
因为所有的流量都要经过 API 网关,可以通过扩展集群来解决。前面在加一组负载均衡设备等方法。
五、参考
- https://openresty.org/ openresty 官网
- https://github.com/openresty openresty github
- https://github.com/openresty/lua-nginx-module lua 模块
- https://openresty.com.cn/cn/edge/ openresty edge 企业级产品
- https://github.com/openresty/lua-nginx-module#nginx-api-for-lua nginx api for lua
- https://konghq.com/ kong 官网
- https://github.com/kong/kong kong github
- https://docs.konghq.com/gateway/3.0.x/ Kong 3.0.x 文档
- https://docs.konghq.com/gateway/3.0.x/plugin-development/ kong 插件文档
- https://docs.konghq.com/gateway/3.0.x/production/clustering/ Kong 3.0.x 的集群文档
- https://docs.konghq.com/hub/ kong 插件 hub
- https://github.com/Kong/kong-plugin 插件模板
- https://github.com/pantsel/konga kong web ui
- https://apisix.apache.org/zh/docs/apisix/getting-started/ apisix 文档
- https://apisix.apache.org/zh/docs/apisix/plugins/batch-requests 内置插件
- https://apisix.apache.org/zh/plugins/ 插件市场
- https://apisix.apache.org/zh/docs/apisix/control-api/
- http://orange.sumory.com/docs/ orange 地址
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍的更多相关文章
- 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍
微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍 上一篇关于网关的文章: 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Ngi ...
- 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习
一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习
转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- (转)微服务架构 互联网保险O2O平台微服务架构设计
http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...
- Spring Cloud 微服务架构学习笔记与示例
本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...
- .NET Core微服务架构学习与实践系列文章索引目录
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
- SpingCloud微服务架构学习(一)之服务提供者与服务消费者
微服务构建的是分布式系统,各个微服务之间通过网络进行服务调用,这就有了服务提供者(被调用方)和服务消费者(调用方),以电影售票系统为例,假设服务调用关系如下图所示: 围绕此场景,我们先编写一个用户微服 ...
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
上篇文章讲解了SpringCloud组件和概念介绍,接下来讲解一下SpringCloud组件相关组件使用.原理和每个组件的作用的,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix ...
随机推荐
- 使用jmh框架进行benchmark测试
性能问题 最近在跑flink社区1.15版本使用json_value函数时,发现其性能很差,通过jstack查看堆栈经常在执行以下堆栈 可以看到这里的逻辑是在等锁,查看jsonpath的LRUCach ...
- 使用.NET简单实现一个Redis的高性能克隆版(三)
译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...
- Git学习与码云实战
Git学习与码云实战 一.Git安装 概述: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具. 下载安装: 下载地址:http ...
- 简单概述因特网(Internet)
学习目的 了解 Internet 的概念,区别因特网与互联网. 了解 Internet 的基本结构. 了解 Internet 的发展历史. Internet 概念 因特网(Internet)是全球性的 ...
- linux之间上传下载--SCP
1.远程拷贝文件 [root@rhel8-client01 yum.repos.d]# scp root@192.168.72.149:/etc/yum.repos.d/* . (.表示拷贝到当前文件 ...
- gcd(数论)
题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对? 输入 一个整数 1<=N<=1000000 输出 一个整数 样例输入 4 样例输出 ...
- Windows API 学习
Windows API学习 以下都是我个人一些理解,笔者不太了解windows开发,如有错误请告知,非常感谢,一切以microsoft官方文档为准. https://docs.microsoft.co ...
- for--else大坑问题
这是一次偶然发现的问题,做一下记录 a = [{'w0', 'b0', 'v0'}, {'w1', 'b1', 'v1'}, {'w2', 'b2', 'v2'}] for i in a: for j ...
- swagger访问url
http://172.16.5.130:8080/swagger-ui.html 上面的ip:port 根据实际情况调换 如果设置了server.servlet.context-path 比如: se ...
- 如何使用Arthas定位问题
在我们日常的工作中,经常会遇到一些线上才会遇到的问题.Arthas无疑是我们在工作中,定位线上问题的神奇.下面,我将介绍一下我们在工作中经常用到的一些功能. dashboard 首先我们可以通过das ...