基于 OpenResty 的接口网关设计

本文讲述基于 OpenResty 的接口网关设计,主要谈及接口网关的请求路由与安全认证(IP 与 URI 白名单、加解密与验签名流程等)这两部分内容,其中涉及到的 Nginx、OpenResty等相关内容会作简单介绍 。
〇、前言笔者曾参与开发两个接口网关的项目,一个是基于 Tomcat 的应用提供的网关服务,另一个是基于 OpenResty 的 Nginx 应用提供的网关服务 。经过两个网关项目的开发,笔者在接口网关开发方面稍微积累了一些经验,故在此把这些经验分享出来一起交流学习 。由于基于 OpenResty 的 Nginx 网关普遍被认为是更优的方案,故本文主要针对基于 OpenResty 的 Nginx 网关进行讲述 。当然,由于不同的并发数量级,不同的业务场景,接口网关的设计多种多样,本文所述其中较为简单且轻量级的一种 。
一、什么是接口网关 

基于 OpenResty 的接口网关设计

文章插图
 
 
1.1 定位
接口网关,顾名思义,是企业 IT 在系统边界上提供给外部访问内部接口服务的统一入口 。这里的外部可以指客户端、浏览器或者第三方应用等,在这种情况下,接口网关可以有多种定位:
  • 提供后端服务面向 Web App 或者 Mobile App 的 APIGateway
  • 作为开放平台面向 Partner 的 OpenAPI
在笔者的工作中,同样把面向客户端的网关称作 APIGateway,把作为开放平台提供给第三方服务的网关称作 OpenApi 。本文主要以 OpenApi 作为接口网关为例来讲述 。
1.2 功能
作为企业 IT 系统的统一入口,接口网关可提供请求路由与组合、协议转换、安全认证、服务鉴权、流量控制与日志监控等服务 。在笔者的工作中,主要在接口网关上实现了请求路由与安全认证的功能,题目中所说的“设计”,主要是指请求路由与安全认证方面,暂不涉及流量控制或日志监控等其他方面的设计 。
二、为什么需要接口网关正如上文所言,网关接口为企业应用提供了丰富的功能,而笔者在工作中开发的接口网关主要提供请求路由与安全认证的功能,那么在回答“为什么需要接口网关”的时候,需要对这两者多加阐述 。
2.1 请求路由
【基于 OpenResty 的接口网关设计】企业提供内外两网,在没有接口网关时,提供外部服务的应用需要部署在外网 。随着服务的增多,部署在外网的应用越来越多,在服务的安全压力与维护成本增大的情况下,需要一个统一的接口网关“隔离”内外服务 。企业提供的服务(无论内部服务还是外部服务)均部署在内网,而由部署在外网的网关接受请求,并路由到内网服务 。在这种情况下,既有利于对外屏蔽企业内部服务部署细节,提供统一的服务访问地址,又便于管理与维护内外部服务接口,便于演进与重构服务 。这是接口网关提供请求路由的作用 。
2.2 安全认证
在没有接口网关时,企业对外服务直接由外部访问,身份验证与数据加解密等工作都需要每一个对外服务本身去处理,增加了服务本不该有的职责,并且增加了服务开发的难度与工作量 。实际在大多数情况下,可以将身份验证与数据加解密等安全工作可以从服务抽离,统一由接口网关负责处理 。接口网关作为入口,对外验证调用方的 IP,身份以及接口访问权限等,并且可以解密数据后再将请求路由到服务 。这是接口网关提供安全认证的功能 。
以上是实际工作中涉及的为什么需要接口网关的其中两个原因,当然原因远不止此,有兴趣的读者可以阅读其他文章,比如 《谈API网关的背景、架构以及落地方案》 或者 《微服务:从设计到部署》(英文原文:Microservices: From Design to Deployment) 。接下来的章节我们开始探讨如何开发接口网关 。
三、如何开发接口网关我们先看看工作中设计的提供请求路由与安全认证功能的接口网关的架构 。
不过在介绍接口网关的设计之前,我们先来了解一下关于 Nginx 与 OpenResty 的基础知识 。
3.1 Nginx 与 OpenResty 简介
3.1.1 Nginx 简介
Nginx 是世界第二大 Web 服务器,仅次于 Apache,然而由于其极高的性能可处理海量的互联网请求,现在已经成为业界高性能 Web 服务器的代名词 。
它的主要特征是高性能、高扩展性、高可靠性、低内存消耗、单机支持 10 万以上的并发连接,支持热部署,以及使用最自由的 BSD 许可协议 。其中,Nginx 可以处理高并发压力下的并发请求的原因如下:


推荐阅读