有了这些服务定义,Airbnb 开始构建数据服务层。
例如,他们从家庭数据服务开始,这是 Airbnb 业务的底子层。当前的单轨设置使用 Rails 中的 Active Record 数据访问库从表中访问数据。
他们在 Active Record 级别拦截传入的请求,而且不路由到数据库,而是将这些请求发送到新的家庭数据服务。然后,家庭数据服务负责路由到数据存储。
下图表现了这种方法。
在这个版本的迁徙之旅中,单轨列车被彻底淘汰了。
客户端向 API 网关发出请求,该网关充当负责中心件和路由的服务层。网关填充请求上下文并将请求路由到 SOA 网络,此中各种服务负责表示逻辑和数据访问逻辑。
Web 客户端的处置惩罚方式略有不同。有一个专门的服务来处置惩罚 Web 请求。
为什么需要它?
此服务通过调用 API 网关并以所需格式填充收到的响应,将 HTML 返回到 Web 客户端。API 网关负责所有中心件功能并通过 SOA 网络传播请求。
下图试图展示这种情况:
正如我们从上一节看到的,迁移到 SOA 为 Airbnb 工程团队带来了多重挑战。
例如,单个请求现在会分散到多个服务,从而增长失败的几率。此外,将数据模型分离到多个数据库中有利于服务级别的同等性,但这会使事务性更难以实施。
随着时间的推移,服务编排也变得越来越复杂。由于有数百名工程师在构建服务,Airbnb 需要更多的 EC2 实例。终极,这促使其转向使用 Kubernetes。
为了让工程团队轻松构建服务,Airbnb 的底子办法团队在此过程中创建了许多构建模块。
API 框架
Airbnb 创建了一个使用 Thrift 语言构建的内部 API 框架。
所有 Airbnb 服务均使用该框架来定义可以相互通信的清楚 API。
例如,假设服务 A 想要与服务 B 通信。服务 B 工程师只需使用简单的 Thrift 语言定义端点,框架就会自动天生端点逻辑来处置惩罚常见内容,例如模式验证、可观察性指标等。
此外,它还创建一个多线程 RPC 客户端,服务 A 可以使用它来与服务 B 通信。该客户端处置惩罚各种功能,例如重试逻辑、错误传播和传输。
这有什么好处呢?
工程师可以专注于处置惩罚焦点业务逻辑,而不必花时间担心服务间通信的细节。
为了进步开发职员的工作服从,Airbnb 底子办法团队还开发了 API Explorer,工程师可以在此中浏览不同的服务,确定要调用哪些端点,甚至使用 API 游乐场来相识怎样调用这些端点。
使用 Spinnaker 进行自动 Canary 分析