自学内容网 自学内容网

【中间件】—一篇说明白API网关&常用API网关推荐

【中间件】- API网关简介

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记仓库👉https://github.com/A-BigTree/tree-learning-notes
个人主页👉https://www.abigtree.top
⭐⭐⭐⭐⭐⭐


1 计算机中的网关

计算机网络中,网关(Gateway) 又称网间连接器、协议转化器。网间连接器,顾名思义,也就是连接网络的机器,它能解析处理网络通信请求,将请求转发到对应的目标主机。

例如下图中网络A和网络B,网络A中的主机A1想和网络B的主机B1通信,那么A1必须先将数据发到网络A的网关A,网关A再发到网络B的网关B,接着网关B再将数据发到主机B1。

在这里插入图片描述

2 微服务环境中的API网关

2.1 背景

随着软件架构由传统的单体架构逐渐拆分为微服务架构,一个单体应用的业务系统被拆为多个服务,每个服务进行独立维护和部署。这样做降低了服务的耦合度,但是同时也带来了一些新的问题。

(1)服务通用功能冗余:鉴权、限流、日志、监控等通用功能在每个服务内单独实现,系统维护者没有全局视图管理这类通用功能。

(2)服务使用多种协议:例如公司中最常见的两种协议HTTP,GRPC。

(3)服务实例动态变化:服务独立部署后,部署的实例Ip、端口在每次部署前后会发生动态变化。

为了解决上述问题,出现了Api网关。

2.2 API网关是什么

(1) 流量入口

类比计算机网络中的网关来说,在微服务环境中,Api网关是所有服务的流量入口,网关在接收到请求后进行处理,再转发到对应的服务;服务处理请求并返回给网关数据后,网关再将数据返回给原始请求方。

在这里插入图片描述

从设计模式上来说,Api网关的设计理念类似于外观模式。Api网关封装了系统内部架构,为调用方提供一个定制的Api,提供了如鉴权、监控、负载均衡、协议转化等非业务功能的服务。

使用Api网关前,流量直接访问各个Web应用,每个应用都需要进行鉴权、限流等操作。在使用Api网关后,流量统一从网关进入,由Api网关转发到各个服务,Api网关拦截请求集中处理,进行如鉴权、协议转化、监控等功能,再转发到不同服务上。

在这里插入图片描述

2.3 API网关的主要功能

1、路由转发

通过路由功能将请求转发到目标服务。在微服务架构中,网关结合服务注册中心,调用方只需要知道网关对外暴露的Api即可访问到后端服务。

2、负载均衡

当服务有多个实例时,根据调度策略选择调用哪个实例。

3、稳定性保障
  • 限流熔断:控制客户端的访问次数和访问频率,在网关上配置一个流量阈值,当流量到达阈值后,网关能直接拦截请求。
  • 可灰度可回滚可监控:网关可以对Api变更进行稳定性控制,实现Api变更发布的可灰度可回滚可监控。
4、安全管控
  • 统一鉴权: 无论是内网接口还是外网接口,都需要进行用户身份认证。网关可以实现身份认证鉴权逻辑,统一管理用户安全认证。
  • 数据安全:网关可进行数据加解密,实现敏感数据的脱敏处理。
5、协议转换

Api网关作为流量入口,通过协议转换可以整合基于不同风格不同技术实现的微服务,对外部客户端提供统一服务。

6、Api配置管理

对不同业务的Api和服务进行配置和管理,提供基本信息配置和Api文档生成等后台管理能力。

3 常见的API网关

市面上常见Api网关有以下这些:

在这里插入图片描述

3.1 Nginx

Nginx是一个高性能的HTTP和反向代理服务器。Nginx一方面可以做反向代理,另外一方面可以做静态资源服务器,接口使用Lua动态语言可以完成灵活的定制功能。并且Nginx采用异步非阻塞方式来处理请求,这样的机制使得Nginx能够轻松应对百万级的并发请求。

3.2 Zuul

Zuul 是 Netflix 开源的一个API网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型之一。

Zuul 的核心是一系列的过滤器,这些过滤器可以完成以下功能:

  • 统一鉴权 + 动态路由 + 负载均衡 + 压力测试
  • 审查与监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 多区域弹性:跨越 AWS Region 进行请求路由,旨在实现 ELB(Elastic Load Balancing,弹性负载均衡)使用的多样化,以及让系统的边缘更贴近系统的使用者。

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

Zuul1 :基于 Servlet 框架构建,采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。

Zuul2:运行在异步和无阻塞框架上,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。

3.3 Spring Cloud Gateway

Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1,它基于Spring5.0 + SpringBoot2.0 + WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul。官⽅测试,Spring Cloud GateWay是Zuul的1.6倍,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。

Spring Cloud Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、⽇志监控等,并且Gateway还内置了限流过滤器,实现了限流的功能。

3.4 Kong

Kong是一款基于OpenResty(OpenResty 是Nginx的衍生版本,是一个基于 Nginx 的可伸缩的 Web 平台)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个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。

3.5 Traefic

Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。

重要特性:

  • 它非常快,无需安装其他依赖,通过Go语言编写的单一可执行文件;
  • 多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd;
  • 支持支持Rest API、Websocket、HTTP/2、Docker镜像;
  • 监听后台变化进而自动化应用新的配置文件设置;
  • 配置文件热更新,无需重启进程;
  • 后端断路器、负载均衡、容错机制;
  • 清爽的前端页面,可监控服务指标。

3.6 Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

Tengine特性

  • 继承Nginx-1.18.0的所有特性,兼容Nginx的配置;
  • 支持HTTP的CONNECT方法,可用于正向代理场景;
  • 支持异步OpenSSL,可使用硬件如:QAT进行HTTPS的加速与卸载;
  • 增强相关运维、监控能力,比如异步打印日志及回滚,本地DNS缓存,内存监控等;
  • Stream模块支持server_name指令;
  • 更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;

原文地址:https://blog.csdn.net/weixin_53580595/article/details/142771929

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!