01#
背景介绍
1.1 出口网关是什么
1.2 为什么要做出口网关
1、在爱奇艺会员对外合作业务中,需要访问合作方的 API 接口,随着安全要求的提升,越来越多的合作方对调用方的IP地址实行白名单策略,并且爱奇艺的服务都是在爱奇艺云服务平台进行的部署,业务更新比较频繁,每次更新都会更改IP地址,不可能在每次更新时让第三方进行IP白名单的同步,因此需要实现调用外部接口的统一出口网关。
2、在传统的网络架构下,需为每台应用服务器实例分别申请外网访问权限。实际运维中,这种方法因涉及到服务扩容或迁移操作时的访问权限更新问题,易造成疏漏,从而导致故障,因此需要通过给出口网关配置外网访问权限,内部服务统一通过出口网关访问外网,来规避此问题。
最开始设计出口网关的时候是使用的 Nginx 正向代理来实现此功能,这个方案的问题在于每次新增一个接口都需要调整 Nginx 的路由配置,并且 Nginx 的路由分发只支持静态配置,不能动态增减路由,这就需要在每次配置之后进行 reload,这会增加人工运维的成本,同时 Nginx 正向代理也无法实现流量隔离。
因此,经过调研我们采用 APISIX 作为网关服务的核心,通过 APISIX 插件实现安全防护、流量管控、协议适配等功能,并接入监控系统,同时通过
安全插件
接入安全团队提供的安全
控制系统
,并且实现了一个界面化的地址转换服务来实现从 Origin URL 到 APISIX URL 的转换,以便开发人员使用。
1.3 使用出口网关带来的收益是什么
使用出口网关可以为合作方提供固定的公网IP地址,而无需关注内部服务的具体部署方式,避免大量无效沟通。
02#
技术设计与实现
2.1 整体架构
-
APISIX 的路由复杂度是 O (k),K 指 URI 长度,和路由数量无关,例如有一百万条路由,APISIX 路由的时间复杂度都是一样的; -
APISIX 的 IP 匹配时间复杂度是 O (1),不会随着大量 IP 判断而导致 CPU 资源跑满,不管有多少IP都是一次命中。
APISIX插件库:
https://apisix.apache.org/zh/docs/apisix/plugins/batch-requests/
-
ip-restriction:IP 限制插件,可以通过将 IP 地址列入白名单或黑名单来限制对服务或路由的访问。 -
ua-restriction:可以通过将指定 User-Agent
列入白名单或黑名单的方式来限制对服务或路由的访问。。 -
referer-restriction:允许用户将 Referer
请求头中的域名列入白名单或黑名单来限制该域名对服务或路由的访问。 -
consumer-restriction:允许用户根据 Route、Service、Consumer 或 Consumer Group 来设置相应的访问限制。 -
key-auth:用于向 Route 或 Service 添加身份验证密钥(API key)。 -
jwt-auth:用于将 JWT 身份验证添加到 Service 或 Route 中。
-
limit-req:使用 漏桶算法 限制单个客户端对服务的请求速率。 -
limit-conn:用于限制客户端对单个服务的并发请求数。当客户端对路由的并发请求数达到限制时,可以返回自定义的状态码和响应信息。 -
limit-count:使用固定时间窗口算法,主要用于限制单个客户端在指定的时间范围内对服务的总请求数,并且会在 HTTP 响应头中返回剩余可以请求的个数。 -
request-id:通过 APISIX 为每一个请求代理添加 unique ID 用于追踪 API 请求。
-
grpc-transcode:可以在 HTTP 和 gRPC 请求之间进行转换。 -
response-rewrite:支持修改上游服务或 APISIX 返回的 Body 和 Header 信息。
2.2 易用性设计
一键化接入界面:
2.3 高可用设计
2.4 可扩展性设计
APISIX 目前已发布了大量插件,并且支持自定义插件,同时支持插件的热加载。
2.5 整体效果
也许你还想看
本文分享自微信公众号 - 爱奇艺技术产品团队(iQIYI-TP)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。