陋室铭

API网关

API网关的作用

提供统一的入口来访问内部的API,隔离外部访问与内部系统。集成了非业务性的功能(安全检查、频次限制、API监控、日志上报等),API生命周期管理、请求的转发
、合成、协议转换、服务发现等多种功能。

API网关的职能

  • 请求接入
    作为所有API接口服务请求的接入点,管理所有的接入请求

  • 业务聚合
    作为所有后端业务服务的聚合点,所有的业务服务都可以在这里被调用

  • 中介策略
    实现安全、验证、路由、过滤、流控、缓存等策略,进行一些必要的中介处理

  • 统一管理
    提供配置管理工具,对所有API服务的调用生命周期和相应的中介策略进行统一管理

网关分类与功能

  1. 流量网关(关注稳定与安全)
  • 全局性流控
  • 日志统计
  • 防止SQL注入
  • 防止Web攻击
  • 屏蔽工具扫描
  • 黑白IP名单
  • 证书/加解密处理
  1. 提供更好的服务
  • 服务级别的流控
  • 服务降级与熔断
  • 路由与负载均衡、灰度策略
  • 服务过滤、聚合与发现
  • 权限验证与用户等级策略
  • 业务规则与参数校验
  • 多级缓存策略

API网关需要考虑的因素

  1. 性能问题
    作为流量入口,所有请求经由网关,对请求进行检查及决策,通过验证后进行反向代理转发到后端的server进行处理。这对性能要求特别高,尤其针对互联网中海量的用户
    要与后端交互,如果不能保证性能,就只能通过堆机器来水平扩容,无疑会加大投入的设备成本。目前业务已有不少高性能方案:在JVM上,基于NIO框架的Spring Cloud Zuul、
    构建在Node.js事件循环,回调机制的IBM、有给予Openresty事件驱动型、协程的KONG,ORANGE、也有基于事件驱动型、协程的Tyk。

  2. 高可用
    API网关不可用将会是致命的影响,要通过冗余部署、自愈、多维度监控告警,确保API网关7*24小时的稳定运行

  3. 扩展性
    API网关是业务性比较强的一个组件,如报文的转换、认证、验证等, 所以它提供了一个脚本架,业务可以自行去扩展及变动

  4. 服务发现
    后端服务的IP存在很大的变动性,尤其是微服务化后应用基于docker,对获取服务的位置提出了挑战

  5. 服务调用
    支持进程间同步及异步的通信模块,可根据后端server情况支持所需要的通信机制

API网关方案

  1. Nginx+Lua
    Nginx 一个高性能的HTTP和反向代理服务器。
    Nginx基本功能:
    • 静态web资源服务器,能够缓存打开的文件描述符
    • 支持http/imap/pop3/smtp的反向代理,支持缓存、负载均衡
    • 支持fastcgi(fpm)
    • 模块化,非DSO机制,支持过滤器zip压缩,SSI以及图像大小调整
    • 支持SSL

Nginx通过插件的扩展功能:

  • 基于名称和IP的虚拟主机
  • 支持keepalive的保持机制
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓存区提高日志存储性能
  • 支持url rewrite
  • 支持路径别名(root或alias)
  • 支持基于IP及用户的访问控制
  • 支持传输速率限制,并发限制

    Nginx在性能和高可用性上的表现:
    Nginx性能极高,Nginx先天的事件驱动型设计、全异步的网络I/O处理机制、极少的进程间切换以及许多优化设计,都使得Nginx天生善于处理高并发压力下的互联网请求。
    Nginx的稳定性也在各大网站得到验证。官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。
    支持热部署,可以不停机更新配置文件、更新日志文件、更新服务器程序版本。

    Nginx的扩展性:
    Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。

    Nginx的易用性:
    Nginx使用最自由的BSD许可协议,允许用户在自己的项目中直接使用或修改Nginx源码,有大量的插件可以利用。但是,Nginx模块需要用C开发,而且必须符合一系列复杂的规则。虽然通过第三方模块,
    可以支持Nginx与Perl、Lua等脚本语言集成工作,但对使用者的要求还是很高。

    Nginx可以说是一款能够工业化API网关,在国内的很多互联网公司,例如阿里、新浪等都得到很好的应用。

  1. SpringCloud Zuul
    Zuul Netflix公司开源的一个API网关组件。提供了认证&鉴权、限流、动态路由、监控、弹性、安全、负载、均衡、协助单点压测、静态响应等边缘服务的框架。

Zuul的基本功能

  • 验证与安全保障:识别面向各类资源的验证要求并拒绝那些与要求不负的请求。
  • 审查与监控:在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
  • 动态路由:以动态方式根据需要将请求路由至不同后端集群处。
  • 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
  • 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
  • Netflix公司还利用Zuul的功能通过金丝雀版本实现精确路由与压力测试。
  • 虽然提供的功能还算丰富,但都比较弱,很难满足高要求的场景。

    Zuul在性能和高可用性上的表现
    Zuul处理每个请求的方式是针对每个请求是用一个线程来处理。通常情况下,为了提高性能,所有请求会被放到处理队列中,从线程池中选取空闲线程来处理该请求。
    2016年底,Netflix将它们的网关服务Zuul进行了升级,全新的Zuul 2将HTTP请求的处理方式从同步变成了异步,以提升其处理性能。

Zuul的扩展性
在Zuul的架构图上可以看出,Zuul更像一个过滤器框架,其自身的路由、日志、反向代理、ddos预防等功能都是通过过滤器来实现的。提供PRE、ROUTING、POST和ERROR四个扩展点,
可以很容易的添加自定义的过滤器。

Zuul的易用性:
Zuul的搭建非常简便,使用和配置也很简单。Zuul的开源社区比较活跃,一直在更新状态,但版本不算太稳定,在使用的过程中,还有一些坑要踩。例如重定向问题、异常处理问题,
还没有解决的很好,需要自己重写一些filter。

  1. Kong
    Kong是Mashape提供的一款API管理软件,它本身是基于Ngnix+lua的,但比nginx提供了更简单的配置方式,数据采用了 ApacheCassandra/PostgreSQL存储,并且提供了一些优秀的插件,
    比如验证,日志,调用频次限制等。

Kong的一个非常诱人的地方就是提供了大量的插件来扩展应用,通过设置不同的插件可以为服务提供各种增强的功能。Kong默认插件插件包括:

  • 身份认证:Kong提供了Basic Authentication、Key authentication、OAuth2.0authentication、HMAC authentication、JWT、LDAP authentication认证实现。
  • 安全:ACL(访问控制)、CORS(跨域资源共享)、动态SSL、IP限制、爬虫检测实现。
  • 流量控制:请求限流(基于请求计数限流)、上游响应限流(根据upstream响应计数限流)、请求大小限制。限流支持本地、Redis和集群限流模式。
  • 分析监控:Galileo(记录请求和响应数据,实现API分析)、Datadog(记录API Metric如请求次数、请求大小、响应状态和延迟,可视化API Metric)、
    Runscope(记录请求和响应数据,实现API性能测试和监控)
  • 转换:请求转换、响应转换

Kong本身也是基于Nginx的,所以在性能和稳定性上都没有问题。Kong作为一款商业软件,在Nginx上做了很扩展工作,而且还有很多付费的商业插件。Kong本身也有付费的企业版,其中包括技术支持、使用培训服务以及API 分析插件。

Nginx适合有较强研发团队,自主开发企业自己的API网关。Kong适合于没有自身研发团队,但需要拥有企业级API网关能力的公司。

icefire wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!