微服务架构学习与思考(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等功能,更多功能可以看文档。

还有一些其他重要功能特性:

  1. 集群

kong 支持单节点集群和多节点集群。

单节点集群:连接到数据库(Cassandra 或 PostgreSQL)的单个 Kong 节点创建一个节点的 Kong 群集。通过此节点的 Admin API 应用的任何更改都将立即生效。

多节点集群:多节点集群它是通过定期后台作业与其他节点进行数据同步。可以通过配置参数 db_update_frequency(默认 5 秒) 更改频率,这个频率更新有点慢。所以 kong 集群数据一致性是最终一致性。

kong 也给用户提供了自定义插件的功能,如果你有需要,自己可以编写插件来扩展 kong 的功能。

  1. 扩展功能-编写插件

用户可以编写插件来对 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 贡献第三方插件,是优质插件可能会被收录。

  1. 通过 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 开源版本拥有扩展功能差不多。

  • 高可用集群
  1. Apache APISIX 的数据平面是无状态的,可以进行随意的弹性伸缩,前面加一层负载均衡即可
  2. 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 网关缺点

  1. 让系统复杂度变高

在整个系统架构中,多一个了 API 网关,就多了一份维护工作,多了一处发生“危险”的地方。

  1. API 网关可能成为性能瓶颈

因为所有的流量都要经过 API 网关,可以通过扩展集群来解决。前面在加一组负载均衡设备等方法。

五、参考

微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍的更多相关文章

  1. 微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍

    微服务架构学习与思考(11):开源 API 网关02-以 Java 为基础的 API 网关详细介绍 上一篇关于网关的文章: 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Ngi ...

  2. 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习

    一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...

  3. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

  4. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

  5. (转)微服务架构 互联网保险O2O平台微服务架构设计

    http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...

  6. Spring Cloud 微服务架构学习笔记与示例

    本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...

  7. .NET Core微服务架构学习与实践系列文章索引目录

    一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...

  8. SpingCloud微服务架构学习(一)之服务提供者与服务消费者

    微服务构建的是分布式系统,各个微服务之间通过网络进行服务调用,这就有了服务提供者(被调用方)和服务消费者(调用方),以电影售票系统为例,假设服务调用关系如下图所示: 围绕此场景,我们先编写一个用户微服 ...

  9. 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)

    上篇文章讲解了SpringCloud组件和概念介绍,接下来讲解一下SpringCloud组件相关组件使用.原理和每个组件的作用的,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix ...

随机推荐

  1. 密码学系列之:PEM和PKCS7,PKCS8,PKCS12

    目录 简介 PEM PKCS7 PKCS8 PKCS12 总结 简介 PEM是一种常见的保存key或者证书的格式,PEM格式的文件一般来说后缀是以.pem结尾的.那么PEM到底是什么呢?它和常用的证书 ...

  2. Linux 的常用基本命令

    一.Linux 的常用基本命令..................................................................................... ...

  3. BMP位图之4位位图(二)

    起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...

  4. web前端要学些什么,学习思路

    有没有Web前端大神给个意见 我已学了 html  css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么

  5. SpringBoot接收MultipartFile文件,并保存文件

    package com.hrw.controller; import com.hrw.pojo.Result; import org.apache.tomcat.util.http.fileuploa ...

  6. 【SWIFT】从零开始的SWIFT语言学习笔记-2:简单值、数组与字典

    1.0.3 简单值.数组与字典 知识点: 使用var创建变量 var myVariable = 65 myVariable = myVariable + 1 使用let创建常量 let myConst ...

  7. Java Web中MVC设计模式与IOC

    MVC是由Model(模型).View(视图).Controller(控制器)三个模块组成 视图:用于做数据展示以及和用户交互的一个界面(html页面) 控制层:能够接受客户端的请求,具体的业务功能还 ...

  8. 第九十一篇:Vue 具名插槽作用域

    好家伙, 1.作用域插槽 插槽在定义的时候,可以定义一些属性,便于在父组件中使用 来看看代码: Article.vue组件中: <template> <div class=" ...

  9. .NET使用StackTrace获取方法调用者信息

    前言 在日常工作中,偶尔需要调查一些诡异的问题,而业务代码经过长时间的演化,很可能已经变得错综复杂,流程.分支众多,如果能在关键方法的日志里添加上调用者的信息,将对定位问题非常有帮助. 介绍 Stac ...

  10. 理解 Spring IoC 容器

    控制反转与大家熟知的依赖注入同理, 这是通过依赖注入对象的过程. 创建 Bean 后, 依赖的对象由控制反转容器通过构造参数 工厂方法参数或者属性注入. 创建过程相对于普通创建对象的过程是反向, 称之 ...