作者:
- Vijayvangapandu 维贾亚·万加潘杜,杰出的软件工程师
- Siva 佩里亚萨米·西瓦,资深软件工程师
- Nishant Mittal,资深软件工程师
- Tejas Nomulwar,资深软件工程师
Tinder API Gateway (TAG) 是 Tinder 中一个关键的框架,用于满足公开 API 的需求,并严格实施授权和安全规则。它与 Tinder 当前的云基础设施完美契合,并可根据需要轻松扩展并维护,无需外部支持。它还实现了 RAC(Route As Configuration),这可以帮助开发人员更快地将模块部署到生产环境。TAG 具有许多特性使其成为一个独特的解决方案,但在我们探讨其独特特性之前,先来看看 Tinder 为何需要一个定制网关。
我们在 Tinder 拥有超过 500 个微服务,这些微服务通过底层的服务网格进行通信,以满足各种数据需求。所有外部的 API 都部署在 TAG 上。我们需要一个网关解决方案来集中这些服务,从而在维护和部署过程中提供更多控制。自定义网关还确保服务在公开暴露于外部世界之前通过安全审查。
像推荐服务 API 这样的服务也会经常收到后端和客户端的频繁功能更新。这只是许多例子中的一个;我们还有其他多个关键服务,例如匹配服务 API、收入服务 API 等,需要一个流程化的部署方案来更快地部署到生产环境中。因此,我们需要一个定制网关,能够帮助我们轻松配置外部路由,从而加快发布过程。
从安全角度来看,API Gateway,Tinder被用于190个国家,并从世界各地接收的流量。既有真实用户的,也有恶意行为者的。想象一下,扫描并避免可能攻击这些服务的漏洞有多重要。黑客试图找到进入企业系统的漏洞以窃取任何有价值的信息,其中网关就是一个重要的入口点。我们需要一个自定义的网关解决方案来帮助我们识别这类流量并避免可能的漏洞。
TAG面临的挑战在 TAG 出现之前,我们使用了多个不同的 API 网关解决方案,每个应用团队使用不同的第三方 API 网关解决方案。由于每个网关都是基于不同的技术栈构建的,管理它们变得非常繁琐,这让团队感到困扰。更重要的是,不同网关之间共享可重用组件存在兼容性问题,这通常会导致代码发布延迟。此外,不同的网关还带来了额外的维护负担。
我们还注意到API间会话管理不一致,因为API网关尚未集中化,如图1所示。
图1展示了Tinder在TAG之前的API之间的会话管理情况。
我们试图通过以下方式解决一些主要问题:
- 将所有对外服务统一管理的解决方案
- 任何团队都可以用的工件,帮助团队独立扩展其API网关,以适应应用的扩展
- 一个框架,可以提供让应用以Kubernetes微服务的形式运行的能力,与其他Kubernetes服务一起
- 支持配置驱动的API网关开发,提高开发速度
- 可以根据Tinder的具体需求进行扩展的通用组件
- 增加请求和响应的转换功能
- 定制的中间件逻辑,支持功能如机器人检测和模式注册等
我们也希望能控制框架层面的开发和支持,以便我们能按自己的方式构建网关。所有这些功能都是设计TAG的初衷。
现有的网关解决方案
在公共领域中有很多开源和商业的网关解决方案。其中一些解决方案非常侧重于B2B集成,因此较为庞大和复杂;还有一些部署和维护起来非常复杂。现有的一些解决方案包括亚马逊AWS Gateway、APIgee、Tyk.io、Kong、Express API Gateway和KrakenD在内的一些解决方案也不尽理想,原因有以下几点:
- 这些解决方案中,有些与我们现有的Envoy网格解决方案集成得不够好
- 其中一些配置繁琐,依赖内置插件来支持不同的功能,如峰值遏制、服务调用等。它们的采用具有陡峭的学习曲线,且与我们当前的应用程序/网络栈不太兼容
- 一些解决方案对我们在日常工作中大量使用的语言支持较少
- 最后,我们需要快速构建我们自己的插件和过滤器的灵活性
注意: 所有这些观察结果均依据这些产品官方站点上的文档。该博客的参考部分包含了这些文档。
让我们一起探索TAGTAG 是一个基于 JVM 的框架,建立在 Spring Cloud Gateway 之上。应用团队可以通过编写配置来使用 TAG 创建自己的 API 网关实例。它集中了所有对外的 API,并强制执行严格的授权和安全规则。TAG 扩展了 Spring Cloud Gateway 中的网关和全局过滤器组件,提供通用和预构建的过滤器功能。
应用团队可以使用这些过滤器来满足各种需求:
- 加权路由
- 请求与响应的转换
- HTTP到GRPC转换,等等功能
从开发人员的角度来看,TAG 是根据他们的经验来设计的,因此,TAG 支持配置驱动开发。
通过设计,TAG 帮助提升开发人员的效率,无需编写任何代码即可便捷地设置基于环境特定的 YAML 或 JSON 配置的路由和服务,并帮助他们通过在应用路由间共享过滤器来重用组件。它充分利用了 Spring Cloud Gateway 的所有主要组件,为 Tinder 开发人员提供自定义框架级支持。
我們開發TAG的其他幾個原因是:
- 完全控制开发自定义组件,并分享和使用这些组件作为配置
- 请求和响应扫描功能
- 让模式注册表自动生成API文档
- 包括检测漏洞,如机器人检测和实时流量检测
- 动态路由:我们正在TAG上构建一个管道,它将帮助无需部署应用程序集群即可动态更新路由及其相关配置
- TAG将支持未来的举措,例如API标准化和审计流程
- 它确保了跨不同应用程序的会话管理的一致性和统一性体验,因为它只需要开发一次,然后在所有使用TAG创建的API网关之间共享
图2 — TAG的高层次设计
如图2所示,高级设计包括如下组件:
- 路由 — 开发者可以使用“路由作为配置”(RAC)来公开他们的接口;我们后面会详细解释如何在TAG中设置这些路由。
- 服务发现 — TAG使用服务网格来查找每个路由背后的后端服务。
- 内置过滤器 — 我们已在TAG中给Tinder的应用团队提供了内置过滤器;
例如:setPath,setMethod等。 - 自定义过滤器 — 应用团队可以编写自己的自定义逻辑,如果有必要的话,并通过配置在路由中实现。自定义过滤器在路由级别(即每个路由)应用;例如:在调用后端服务之前验证请求的自定义逻辑。
- 全局过滤器 — 全局过滤器就像自定义过滤器那样,但它们是全局的,一旦设置了服务级别的配置,就会自动应用于所有路由。
例如:应用于特定应用程序的所有路由的身份验证过滤器或指标过滤器。
以下是TAG在应用启动时搭建所有路由的步骤:
图3 — 应用启动时,TAG处理流程图
步骤 1: TAG 触发 Gateway Watcher 的运行,调用 Gateway Config Parser 来解析 YAML 文件
步骤 2: 网关配置解析器验证并解析环境特定的 YAML 配置文件。
步骤 3: 网关管理器查找预过滤器、自定义过滤器和全局过滤器,并为路由 ID 创建一个映射。
步骤 4: 网关路由定位器从配置中为每一路由加载断言及其相关过滤器至 Spring Cloud Gateway
步骤 5: 网关控制器接着构建所有路由并准备网关接收流量
Spring Cloud Gateway 让 TAG 可以预先配置所有路由和过滤器,并在运行时好像执行它们。因为这种设计,TAG 在运行时不会增加任何配置处理的延迟。这使得 TAG 能够轻松扩展并处理高流量。
标签在现实生活中的应用:Tinder中的标签实际应用
图4 — TAG请求处理
在上述TAG配置中执行一个请求(如图4所示)将经历以下步骤:
第一步:反向地理IP定位
RGIL 在 TAG 中作为一个全局过滤器实现。使用 RGIL 过滤器将客户端请求的 IP 映射到三位字母的国家代码(如USA)。我们利用 RGIL 进行速率限制、请求封禁等操作。
步骤 2: 请求/回应扫描 ...
一个异步事件被发布以捕获请求语义。请求/响应扫描全局过滤器仅捕获请求的模式结构,而不捕获数据属性。Amazon MSK 用于安全地流传输数据,这些数据可以被下游应用程序消费,用于各种用途,如自动生成模式(如Schema生成)、检测机器人等。
步骤三: 作为过滤器的会话控制
一个全球中央过滤器是用TAG编写的,用于验证、更新并控制会话管理。
步骤 4:谓词匹配步骤
通过谓词匹配,将传入请求路径与已部署的某个路由进行匹配。
步骤 5: 服务发现
TAG 的服务发现模块会利用 Envoy 来查找与端点匹配的出站映射关系。
步骤 6: 预处理
一旦识别出路由,请求将通过此路由的预过滤链。预过滤器会在请求被转发到后端服务前执行。执行完这些预过滤器后,请求会被转发。按路由加权路由和HTTP到GRPC转换是TAG中可用的一些预构建过滤器,例如按路由加权路由和HTTP到GRPC转换。还可以编写自定义过滤器,比如说裁剪请求头。
第七步骤:后处理
收到后端服务的响应后,响应会经过为此路由配置的后置过滤器链。这些过滤器在收到后端服务的响应后执行。记录错误信息就是这种后置过滤器的一个例子。
步骤八:返回回复
完成所有后置过滤器之后,最终响应将被返回给客户端。
注:
- 前置过滤器/后置过滤器可以包含自定义逻辑或任何类型的请求/响应转换
- 可以配置前置过滤器/后置过滤器的顺序执行,因此确保了它们的运行顺序
Tinder 的应用程序团队正在使用 TAG 作为构建他们自己的 API网关实例的标准框架,只需编写他们特定应用程序的配置即可。这些实例可以根据需要独立扩展。TAG 也被其他 Match Group 品牌如 Hinge、OkCupid、PlentyOfFish、Ship 等所使用。因此,TAG 为 Tinder 提供了 B2C 和 B2B 的流量服务。以下是对 TAG 如今在 Tinder 中如何使用的一般描述。
图5 — 由TAG驱动的Tinder API Gateway(API网关)
在这篇博客中,我们回顾了TAG出现前的情况,我们创建TAG的原因,以及TAG是如何帮助Tinder有效地处理大量流量的。希望你喜欢这篇博客!在接下来的博客中,我们将更深入地探讨如何在TAG中设置路由的配置。
参考文献:共同学习,写下你的评论
评论加载中...
作者其他优质文章