Tinder如何使用SpringCloud构建500个微服务的API网关?

22-11-03 banq

Tinder如何使用 Spring Cloud Gateway 集中其 500 多个微服务的非常棒的文章:

Tinder API网关(TAG)是Tinder的关键框架之一,它解决了暴露公共API和执行严格的授权和安全规则的需要。它的设计是为了满足Tinder的定制需求,完美地适应其当前的云计算基础设施,并可以根据需要进行扩展,无需任何外部支持即可维护。它还实现了RAC(Route As Configuration),帮助开发者更快地将他们的模块运往生产。有各种功能使TAG成为一个独特的解决方案,但在我们深入研究之前,让我们看看为什么Tinder需要一个定制网关。

我们在Tinder有500多个微服务,这些微服务通过引擎盖下的服务网状结构相互对话以满足不同的数据需求。所有面向外部的API都托管在TAG上。我们需要一个能够集中所有这些服务的网关解决方案,让我们从维护到部署有更多的控制权。定制的网关还有助于确保服务在公开暴露于外部世界之前经过安全审查。

像Recommendation APIs这样的服务也会得到频繁的功能更新,无论是在后端还是在客户端。这只是一个例子;我们还有其他几个关键服务,如Match APIs、Revenue APIs等,需要一个简化的流程,以便更快地运往生产。因此,我们需要一个定制的网关解决方案,可以帮助我们以最小的努力配置外部路由,以加快发布过程。

从安全方面看API网关,Tinder在190个国家使用,从世界各地获得各种流量。有来自真实用户的流量,也有来自不良分子的流量。想象一下,扫描和避免可能攻击这些服务的漏洞是多么重要。黑客试图找到进入企业系统的裂缝,以便他们能够窃取任何有价值的信息,而他们的一个入口点就是网关。我们需要一个定制的网关解决方案,可以帮助我们识别这种流量,并避免可能的漏洞。

TAG之前的挑战
在TAG出现之前,我们利用了多个API网关解决方案,每个应用团队使用不同的第三方API网关解决方案。由于每一个网关都是建立在不同的技术堆栈上,管理它们成为一项繁琐的工作。更重要的是,在不同网关之间共享可重复使用的组件存在兼容性问题。这往往会导致将代码运送到生产中的延迟。此外,不同的API网关有维护费用。

我们正试图通过寻找来解决一些主要的问题:

  • 一个解决方案,将所有面向外部的服务置于一个保护伞之下
  • 一个可以被任何应用团队用来拆分他们的API网关以独立扩展他们的应用的人工制品
  • 一个框架,可以为应用程序提供作为Kubernetes微服务与其他Kubernetes服务一起运行的能力。
  • 一个可以支持配置驱动的API网关开发的设计,以提高开发速度
  • 一个可以根据Tinder的定制需求进行扩展的通用组件
  • 添加请求/响应转换
  • 为各种功能定制中间件逻辑,如机器人检测、模式注册等

我们还想控制框架级别的开发和支持,这样我们就可以按照我们想要的方式构建网关。所有这些功能都是设计TAG的动机。

现有的API网关解决方案
在公共领域有许多开源和商业网关解决方案。其中一些确实很重,而且专注于B2B整合,有些部署和维护起来非常复杂。现有的解决方案包括亚马逊AWS网关、APIgee、Tyk.io、Kong、Express API Gateway和KrakenD,但由于种种原因,这些解决方案并不是最佳选择。

  • 其中一些解决方案没有很好地与我们现有的Envoy网状解决方案集成
  • 其中有几个是重度配置,使用内置插件来支持不同的功能,如秒杀、服务呼出等。它们的采用有一个陡峭的学习曲线,不能很好地适应我们目前的应用/网络堆栈
  • 一些解决方案对我们大量使用的语言支持较少
  • 最后,我们需要在需要时迅速建立自己的插件和过滤器的灵活性。

注:所有这些观察都是基于这些产品的官方网站上的文档而得出的。

让我们探讨一下TAG
TAG是一个基于JVM的框架,建立在Spring Cloud Gateway之上。应用团队可以使用TAG来创建自己的API Gateway实例,只需编写配置即可。它集中了所有面向外部的API,并在Tinder执行严格的授权和安全规则。TAG扩展了Spring Cloud Gateway的网关和全局过滤器等组件,以提供通用和预建的过滤器。

这些过滤器可以被应用团队用来满足各种需求。

  • 加权路由
  • 请求/响应的转换
  • HTTP到GRPC的转换,以及更多
  • 从开发人员的角度来看,TAG的创建是将他们的经验作为设计的中心,为此,TAG支持配置驱动的开发。


TAG的设计有助于提高开发人员的速度,使用特定环境的YAML或JSON配置轻松设置路由和服务,而无需编写任何代码,并通过在应用路由中共享过滤器来帮助他们重复使用组件。它利用了Spring Cloud Gateway的所有主要组件,为Tinder的开发者建立了定制的框架级支持。

以下是我们开发TAG的一些其他原因。
  • 完全控制开发自定义组件,并将其作为配置共享和使用
  • 请求和响应扫描
  • 用于自动生成API文档的模式注册表
  • 为了检测漏洞,如机器人检测和实时流量检测
  • 动态路由:我们正在TAG上建立一个管道,这将有助于动态更新路由及其相关配置,而不需要部署应用程序集群。
  • TAG将使未来的举措,如API的标准化和审计过程。
  • 它在不同的应用程序中执行一致和统一的会话管理经验,因为它是一次开发,并在所有API网关(使用TAG创建)中共享。



高级设计
组件:

  • 路由 - 开发人员可以使用Route As a Config (RAC)来暴露他们的端点;我们将在后面详细介绍TAG中的路由是如何设置的。
  • 服务发现 - TAG使用服务网为每个路由发现后端服务。
  • 预建过滤器 - 我们在TAG中添加了内置的过滤器,供Tinder的应用团队使用。例如:setPath、setMethod等。
  • 自定义过滤器 - 我们增加了对自定义过滤器的支持,这样应用团队就可以根据需要编写自己的自定义逻辑,并在路由中使用配置来实现它们。自定义过滤器在路由级别应用(即每个路由);例如:在调用后端服务之前验证请求的自定义逻辑。
  • 全局过滤器 - 全局过滤器就像自定义过滤器一样,但它们是全局性的,也就是说,如果在服务级别配置,它们会自动应用到所有的路由。例如。认证过滤器或指标过滤器适用于特定于某一应用的所有路由。


下面是TAG如何在应用程序启动时建立所有路由的步骤:
  • 第1步:TAG触发Gateway Watcher,调用Gateway Config Parser来加载YAML文件
  • 第2步:Gateway Config Parser验证并解析特定环境的YAML配置文件
  • 第3步:网关管理器查找预过滤器、自定义过滤器和全局过滤器,并创建一个路由ID和这些过滤器的地图。
  • 第4步:Gateway路由定位器从地图上为每条路由加载谓词及其相关的过滤器到Spring Cloud Gateway中。
  • 第5步:网关管理器然后建立所有的路由,并准备好网关以接收流量。


Spring Cloud Gateway便于TAG预先配置所有的路由和过滤器,并在运行时似乎执行它们。由于这种设计,TAG在运行时不会增加任何配置处理延迟。这有助于TAG扩大规模,轻松地处理高流量。

在上述TAG配置中执行一个请求,会有以下步骤"
  • 第1步:反向地理IP查询(RGIL)

RGIL是作为TAG的一个全局过滤器来实现的。使用RGIL过滤器,客户端请求的IP被映射到三位数的阿尔法国家代码。我们将RGIL用于速率限制、请求禁止和其他目的。
  • 第2步:请求/响应扫描


发布一个异步事件来捕获请求语义。请求/响应扫描全局过滤器只捕获请求的模式,而不是数据属性。亚马逊MSK被用来安全地传输数据,这些数据可以被下游的应用程序消费,用于各种用例,如自动模式生成、僵尸检测等。
  • 第3步:会话管理作为一个过滤器


在TAG中编写了一个集中的全局过滤器来验证/更新和控制会话管理。
  • 第4步:谓词匹配

使用谓词匹配将传入请求的路径与部署的路由之一相匹配。
  • 第5步:服务发现


TAG中的服务发现模块使用Envoy为匹配的端点查找出口映射。
  • 第6步:预过滤


一旦确定了路由,那么请求就会经过为该路由配置的预过滤链。预过滤器是在请求被转发到后端服务之前执行的过滤器。一旦预过滤器的列表被执行,请求就被转发。每个路由的加权路由和HTTP到GRPC的转换是TAG中的一些预建过滤器。人们还可以编写自定义过滤器,如修剪请求头。
  • 第7步:后置过滤器


在收到后端服务的响应后,该响应将通过为该路由配置的后置过滤器链。后置过滤器是在收到后端服务的响应后执行的过滤器。记录错误是后置过滤器的一个例子。
  • 第8步:返回响应


在完成后置过滤器的列表后,最终的响应被返回给客户端。

注意:
  • 前过滤器/后过滤器可以包含自定义逻辑或任何类型的请求/响应转换。
  • 人们可以配置预过滤器/后过滤器的运行顺序



总结
Tinder的应用团队将TAG作为一个标准框架,只需编写特定的应用配置,就可以建立自己的API Gateway实例。这些实例可以根据需要单独扩展。TAG也被Match集团的其他品牌使用,如Hinge、OkCupid、PlentyOffish、Ship等。因此,TAG为Tinder提供B2C和B2B流量。以下是目前TAG在Tinder中的使用情况的总体描述。

在这篇博客中,我们探讨了TAG存在之前的状态,为什么我们要创建TAG,以及TAG是如何帮助Tinder提供大规模的流量服务。 

1