1. 什么是API网关(API Gateway)?
在微服务体系结构中,客户端可能与多个前端服务进行交互。
API 网关位于客户端与服务之间。 它充当反向代理,将来自客户端的请求路由到服务。 它还可以执行各种横切任务,例如身份验证、SSL 终止和速率限制。 如果未部署网关,则客户端必须直接向前端服务发送请求。 但是,直接向客户端公开服务会造成一些潜在问题:
- 可能需要编写复杂的客户端代码。 客户端必须跟踪多个终结点,并以弹性方式处理故障。
- 会在客户端与后端之间造成耦合。 客户端需要知道如何分解各个服务。 因此,客户端维护和服务重构会变得更困难。
- 单个操作可能需要调用多个服务。 这可能导致客户端和服务器之间的多次网络往返,从而显著增加了延迟时间。
- 每个面向公众的服务必须处理身份验证、SSL 和客户端速率限制等问题。
- 服务必须公开客户端友好的协议,例如 HTTP 或 WebSocket。 这就限制了通信协议的选择。
- 包含公共终结点的服务是潜在的受攻击面,必须得到强化。
网关可以通过将客户端与服务分开,来帮助解决这些问题。 网关可以执行许多不同的功能,但我们不一定需要所有这些功能。 这些功能可划分到以下设计模式:
- 网关路由: 使用网关作为反向代理,通过第 7 层路由将请求路由到一个或多个后端服务。 网关为客户端提供单一终结点,可帮助将客户端与服务分开。
- 网关聚合:使用网关可将多个单独请求聚合成一个请求。 当单个操作需要调用多个后端服务时,可以应用此模式。 客户端将一个请求发送到网关。 网关会将请求分派到不同的后端系统,然后聚合结果并将其发回给客户端。 这有助于减少客户端与后端之间的通信频率。
- 网关卸载:使用网关可将单个服务的功能卸载到网关,尤其适合用于解决横切问题。 可能有效的做法是将这些功能整合到一个位置,而不是让每个服务负责实现这些功能。 对于需要专业技能才能正确实现的功能(例如身份验证和授权),这种做法尤其有效。
下面是可卸载到网关的一些功能示例:
- SSL 终止
- Authentication
- IP 允许列表或阻止列表
- 客户端速率限制(限制)
- 日志记录和监视
- 响应缓存
- Web 应用程序防火墙
- GZIP 压缩
- 为静态内容提供服务
2.选择网关技术
现在的一些网关技术:traefix、Nginx、OpenResty、Kong、Zuul、Spring Cloud Gateway等。下面主要介绍traefix、Nginx、OpenResty三种网关技术。
2.1traefix
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镜像;
- 监听后台变化进而自动化应用新的配置文件设置;
- 配置文件热更新,无需重启进程;
- 后端断路器、负载均衡、容错机制;
- 清爽的前端页面,可监控服务指标。
2.2Nginx
Nginx是⼀款轻量级的Web服务器、反向代理服务器,由于它的内存占⽤少,启动极快,⾼并发能⼒强,在互联⽹项⽬中⼴泛应⽤。一般Nginx的上层还有一个负载均衡器,如LVS,对Nginx做负载均衡。
重要特性:
- Nginx以事件驱动的⽅式编写,所以有⾮常好的性能;
- 在性能上,Nginx占⽤很少的系统资源,能⽀持更多的并发连接,达到更⾼的访问效率;
- 在功能上,Nginx是优秀的代理服务器和负载均衡服务器;
- 在安装配置上,Nginx安装简单、配置灵活;
- Nginx支持热部署,启动速度特别快,可以在不间断服务的情况下对软件版本或配置进行升级;nginx -s reload。
在微服务的体系之下,Nginx被越来越多的项目所采用,作为网关来使用,配合Lua做限流、熔断等控制。
2.3OpenResty
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。