蚂蚁金服 API Gateway Mesh 思考与实践

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 本次分享,将从蚂蚁金服 API 网关发展历程来看,Mesh 化的网关架构是怎样的、解决了什么问题、双十一的实践表现以及我们对未来的思考。同时, MOSN 完成从 SOFAStack 的孵化,将启用独立 Group 进行后续运作,欢迎大家共同建设社区。

Service Mesh Meetup 现场照

本文整理自蚂蚁金服高级技术专家贾岛在 12 月 28 日 Service Mesh Meetup 杭州站现场分享。

MOSN 完成孵化, 启用独立 Group

2020.2019.12.18,MOSN 项目负责人、蚂蚁金服应用网络组负责人涵畅宣布 MOSN 完成从 SOFAStack 的孵化,将启用独立 Group 进行后续运作,欢迎大家共同建设社区。

MOSN 是一款使用 Go 语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议,模块化,智能化,安全的代理能力。MOSN 是 Modular Open Smart Network-proxy 的简称,可以与任何支持 xDS API 的 Service Mesh 集成,亦可以作为独立的四、七层负载均衡,API Gateway,云原生 Ingress 等使用。

项目地址:https://github.com/mosn/mosn

导语

在 Service Mesh 微服务架构中,我们常常会听到东西流量和南北流量两个术语。蚂蚁金服开源的 Service Mesh Sidecar:MOSN(Modular Observable Smart Network)已经多次与大家见面交流,以往的议题重点在东西流量的服务发现与路由,那么蚂蚁金服在南北流量上的思考是怎样的?

本次分享,将从蚂蚁金服 API 网关发展历程来看,Mesh 化的网关架构是怎样的、解决了什么问题、双十一的实践表现以及我们对未来的思考。

导读

今天的分享分为三个部分:

  1. API Gateway Mesh 的定义:我在 Google 上搜了下 API Gateway Mesh 这个词,找到的都是 API Gateway vs Service Mesh,大家估计也会很好奇:这个词具体的定义是怎样的呢?所以我们下面会做将 API Gateway 和 Service Mesh 做个对比,然后讲一下我个人对这个词有理解和思考。
  2. API Gateway Mesh 在蚂蚁金服的实践:今年阿里巴巴核心系统 100% 云原生化,撑住了双11的世界级流量洪峰,这其中,蚂蚁金服的 Service Mesh 大放光彩,核心链路全上 Mesh,数万容器规模,我们 API Gateway 在其中也承担了部分钱包链路和支付链路 100% 的请求。这个章节,我会从蚂蚁金服 API 网关的发展历程来看,我们为什么做 API Gateway Mesh,我们的架构是如何的,以及我们在过程中的一些风险和考验。
  3. 云原生下 API Gateway 的思考:大家现在都在讲云原生,但是真正实践云原生的过程中,会越到各种各样的问题,怎么样的 API Gateway 方案和形态是最合适你们的业务的?在云原生的架构中,Service Mesh,API Gateway 都是最核心的组件之一,我们对于云原生下的 API Gateway 在 Service Mesh 架构中的定位是如何思考的?还有,未来我们的一些计划是怎样的?都会在这个章节跟大家分享一下。

API Gateway Mesh 的定义

API Gateway in Service Mesh

上面这张图是一个云原生,南北+东西流量的架构图,这里面包含了核心的一些组件,我快速介绍一下:

  • LBingress:负责 ssl 卸载、入口流量的负载均衡,通常会做一些简单的路由;
  • API Gateway:负责更偏向业务的 API 验签、限流、协议转换、用户会话、负载均衡等逻辑;
  • Sidecar in POD:业务系统中的 Sidecar,代理机房内东西流量的转发,一般走内部的 RPC(比如SOFARPC Dubbo Thrift SpringCloud),这里面的流量全部通过 Service Mesh 的 Sidecar Proxy 来承载,这个 Sidecar 负责路由(单元化灰度金丝雀),负载均衡、服务鉴权等等;
  • Control Plane:流量控制「大管家」,云原生里目前最主流的方案是 Istio,负责路由策略、安全、鉴权等等下发和控制;

上面的架构大家都比较了解了,从上面的描述大家也看出来了,API Gateway 和 Service Mesh 的 Sidecar 很多能力都是类似的,比如都是一个网络代理,都具备负载均衡,都具备一些限流和鉴权能力。下面,我们将做一个 API  Gateway 和 Service Mesh 的对比。

API  Gateway vs Service Mesh 

API Gateway vs Service Mesh

从本质概念上来讲,API Gateway 用一句话概括:「Exposes your services as managed APIs」,将内部的服务以更加可控可管理的方式暴露出去,这里的关键词是「暴露」和「可控」。Service Mesh 用一句话概括:「A infrastructure to decouple the application network from your service code」,一种将服务代码与应用网络解耦的基础设施,这里的关键词是「解耦」。

在流量上,API Gateway 是管理南北流量的,而 Servcie Mesh 中的 Sidecar 一般情况下是用来负载东西流量的Proxy。两者都具备负责均衡的能力,API Gateway 一般情况下是通过 lvs 、nginx 中心化的一个负载均衡器,我们管这个叫硬负载;而 Service Mesh 一般情况下是通过服务发现,Sidecar 之间是点对点的调用,我们叫软负载。

通信协议上,API Gateway 一般对外接收开放的通信协议,一般是 HTTP、gRPC 等,而且可能涉及到协议的转换,将 HTTP 转换成内部的 RPC 协议,而 Service Mesh 代理的内部流量一般是内部的私有 RPC 协议(WebService、Dubbo、SOFABolt、Thrift 等等)。在鉴权、流控、安全等控制流量的层面上,对于 API Gateway 来讲都是强依赖的,这样才体现「可控」的特点,而 Service Mesh 代理的内部流量,由于一般处于内网环境,这些控制一般情况下都是弱依赖。

我们对 Service Mesh 的真正理解

大家可以看到,API Gateway 和 Service Mesh 实际上有很多共同点,也有很多区别。那 API Gateway Mesh 到底是如何定义的呢?那要介绍下,我们对 Service Mesh 的真正理解!

Service Mesh is Patterns

Service Mesh 中的 Sidecar 就是这样一辆边车摩托车,Sidecar 将 Service Code 和内部通信 RPC 逻辑解耦掉。但是 Sidecar 的座位上,不仅仅可以坐「内部通信的 RPC」,也可以将其他中间件放到这辆 Sidecar 中,API Gateway + Sidecar = API Gateway Mesh,我们也可以把 MessageQueue Client 放在 Sidecar 中,就是 Message Mesh。

所以,大家看,其实 Service Mesh 是一种模式和架构,关键词就是「解耦」你的服务代码和你的「中间件」。

API Gateway Mesh 定义

API Gateway Mesh 的定义

所以 API Gateway Mesh 的定义是:An infrastructure to expose your services as a managed APIs in the form of a decoupled sidecar proxy,以解耦 Sidecar 的形式,将你的服务代码暴露成可控的 API 基础设施。

OK,到目前为止,API Gateway Mesh 的定义解释清楚了,但是我们为什么要这样架构我们的 API Gateway?这样做解决了什么问题?解释这些问题,要从支付宝 API 网关的发展历程来看。

蚂蚁金服 API Gateway Mesh 实践

支付宝移动网关的前身

支付宝移动网关的前身

支付宝 APP 第一版2009年发布的,2009年还是功能机(Nokia Symbian)的天下,APP 移动端还不是流量的主入口,所以 APP 服务器的架构也是很简单的,所有业务代码都堆积在一个叫 Mobile 的系统中,对外提供 https restful 服务,这样的架构优点就是简单粗暴。随着时间的推迟,2013年移动互联网崛起,智能机(Android&iOS)普及开来,公司越来越多的业务转向移动端,一个 Mobile 系统已经成为研发的瓶颈,另外单体系统的稳定性问题也凸现出来。

2013年,公司提出「ALL IN」无线的战略,那个时候产生了移动微服务网关(2014年马丁大叔提出了微服务概念),主要是解决多业务团队协作的问题。

微服务网关架构

微服务网关架构

我们在这套网关架构中,设计了蚂蚁金服无线 RPC 协议(类似于 gRPC),支持客户端 iOS、Android 多语言 RPC 代码生成能力,屏蔽了网络通信细节,加入了更多安全、鉴权、监控的能力。由于传统 Servlet 的线程模型与后端系统 RT 很敏感,我们将 API Gateway 的通信全部改成了 Netty 异步化。为了解决 HTTP 通信在移动弱网下的不友好,我们设计了基于 TCP 的私有长连接协议。这样一个架构支撑了3-4年的业务快速发展。

但是在2016年底,中心化的网关暴露出很多问题,比如:

  • 网关更变风险的问题:网关的逻辑变更发布一旦有问题,将会影响所有业务;
  • 业务分级隔离的问题:核心业务的 API 希望和非核心业务的接口做资源上隔;
  • 大促容量评估的问题:每年双11、新春红包活动,上万 API 接口的 QPS 很难评估,不同 API 的 RT、BodySize、QPS 对于网关性能的影响都是不同的,为了网关入口的稳定性,一般情况下,都会疯狂的扩容;

去中心化网关

基于上述的问题,我们打算干掉形式上的网关,这样就引入了下一代的网关架构:去中心化网关。

去中心化网关架构

我们将中心化的网关进行了拆分,将逻辑简单的路由模块迁移到 spanner 负载均衡器上,将网关复杂的鉴权、LDC 路由、安全等逻辑抽象成一个 gateway.jar,业务集成这个 Jar 包就具备了网关的能力,这样业务系统之间做到了隔离,中心化的网关变更风险也不会影响到这些系统,这些系统本身就是一个「网关」,大促容量的问题也不再是问题。

一个新的架构,解决了一些问题,但是也会引入一些新的问题。

去中心化架构平稳运行了2年,接入了30多个系统(全量系统在数百个),承载了60%-80%的流量,为什么只接入30个系统?因为目前的去中心化网关架构存在很多问题,导入推广比较困难:

  • 接入困难:gateway.jar 依赖了数十个 Jar,另外还存在配置,而且新的版本还在不停加新的依赖;
  • Jar 包冲突:一个案例,gateway.jar 依赖 Netty 低版本,某个中间件升级间接升级了这个 Netty 版本,导致网关 Jar 的功能异常;
  • 升级困难:最开始的时候,我们有想过去中心化网关带来的版本多、升级难的问题,但是当时天真的认为,网关发展了这么多年,已经很稳定,不需要经常变更了,而且即使变更,让需要更新的系统升级一下就好了。但是事情总是想象的太美好:一旦有升级,业务方都要说:开发集成、回归测试,没时间!新功能无法普及,全网升级更本超级高;
  • 异构系统支持:支付宝有部分业务是 Node.js 技术栈的,Node.js 中间件团队非常牛逼,花了1-2个月时间用 JavaScript 把网关的 Java 的代码翻译了一遍,但是后面放弃了更新了,新功能不可能全部 copy 一遍,成本太高,而且研发同学没有成就感...

看到这里,大家是不是感觉跟 Service Mesh 解决的问题差不多:解耦网关代码和业务代码、独立升级、支持异构系统。所以我们将去中心化的网关 Jar 集成到 Service Mesh 的 Sidecar 中,引入了下一代网关架构:Mesh 化网关架构。

Mesh 化网关架构

Mesh 化网关架构

总结一下:

  • 微服务网关架构:解耦业务和网关;
  • 去中心化网关架构:解决稳定性、业务分级隔离、大促容量评估等问题;
  • Mesh 化网关架构:解决了去中心化升级难,异构系统支持等问题;

蚂蚁金服 API Gateway Mesh 架构

下面介绍下蚂蚁金服 API Gateway Mesh 的架构和落地过程中的问题。

蚂蚁金服 API Gateway Mesh 架构

上图是 API Gateway Mesh 的架构图,其中有3个流:

  • 数据流:业务数据通过 Spanner 直接转发到某个系统中 POD 的 Sidecar 中,经过网关内的各种检验逻辑,本地或转发请求到 SOFA 业务逻辑中;
  • 控制流:一般 Service Mesh 中的控制面是 Istio 中的 Pilot 组件,但是由于原生 Pilot 组件在较大体量体况下性能不行,所以我们目前没有走 Pilot,而是直接对接了网关后台管控;
  • Ops 流:是运维的通道,通过 K8s operator sidecar 注入的方式,让业务具备网关 Mesh 的能力;

API Gateway Mesh Based on MOSN

API Gateway Core

API Gateway Mesh 的底座是蚂蚁金服开源的 MOSN Sidecar Proxy,我们基于 MOSN 的模块化扩展能力,升级了一层 Gateway Core Module,包括核心的 Server、Router、Pipeline、Service、Config 等核心模型,集成了 Lua、JavaScript 等动态脚本增强网关的动态能力,基于 MOSN 的协议扩展能力,轻松地实现了蚂蚁金服的 MMTP 私有协议。在 Gateway Core 的上线,通过插拔不同的 Filter 和 Config,扩展出不同场景的网关产品,如蚂蚁金服的无线网关、开放平台网关、金融云网关等等。控制面上我们支持多种形式的配置下发通道,包括 Istio 的 XDS、Amdin RestAPI,K8s ConfigMap 等等。

MOSN:https://github.com/mosn/mosn

新技术的上线,绝对不是一件简单的事!

API Gateway Mesh 落地挑战

  • 功能:因为 MOSN 是基于 Go 语言研发的,所以我们要将 Java 技术栈转向 Go,但不仅仅是照搬 Java 代码,根据 Go 的语言特点,不仅做好功能,更好做好性能;
  • 性能:最终线上压测,我们发现 Mesh 版本比原来的 Java 版本还有一定的性能提升,原因在于我们将序列化方式从 Hessian 改成了 Protobuf,另外 Java 的线程模式切换到 Go 的 goroutine 也带来了一定的性能提升;
  • 运维:运维更想偏于 K8s 云原生的方向;
  • 风险:已知的风险都不是风险,怎么降低未知的风险?

互联网公司与传统软件公司最大的区别就是敏捷,我们会将更多的精力放在三板斧的实现上。通常,我们为了做一个功能可能花了30%的工作量,但是要花70%的工作量来做灰度、回滚、监控的建设。

在 API Gateway Mesh 上线的过程中,我们如何做灰度和快速回滚的?

API Gateway Mesh 灰度能力建设

这里,我举一个例子,Spanner 为新网 Sidecar 切流的流程。我们支持通过百分比切流,可以做到慢速度的灰度和快速的回滚。另外,MOSN 的 Sidecar 注入不是一次性全集群接入的,我们通过 Label 打标的方式,支持集群部分单机集成 MOSN 的切流验证。

云原生下 API Gateway 的思考

云原生南北向流量方案

上面介绍的是蚂蚁金服在实践 API Gateway Mesh 的一些经验,接下来,我想跟大家分享,云原生下一些标准的南北向流量解决方案的选择问题。

云原生南北向流量方案

上图是业界主流的3种南北向方案,第一种是 K8s Ingress,功能比较简单;第二种是 Istio Gateway,具备了比 Ingress 更多的路由等功能;第三种是功能更加强大的 API Gateway,可以更加精细化的管控接口和流量,可以根据自己业务的特点选择适合自己的南北向流量产品。

云原生下 MOSN 的多面性

下面,介绍下 MOSN 的多面性。

云原生下 MOSN 的多面性

前面讲过 Service Mesh 的 Sidecar,不仅仅只用于南北流量的 RPC,实际上它可以做所有流量的 Sidecar。

未来,MOSN 的定位就是云原生全功能网络代理,可以和 LB 部署在一起作为 LB Sidecar;可以独立部署作为中心化网关;可以和业务 POD 部署作为去中心化网关或 MessageQueue Client;也可以作为跨云通信网关。

Service Mesh 已来,还不赶紧上车!以上就是本期的全部分享内容。

作者介绍

靳文祥(花名贾岛),蚂蚁金服高级技术专家贾岛,2011年毕业后加入支付宝无线团队,一直从事移动网络接入、API 网关、微服务等相关的研发工作,目前负责蚂蚁金服移动网络接入架构设计与优化。

本期回顾视频以及分享 PPT 查看地址

https://tech.antfin.com/community/activities/1056/review/962

相关文章
|
2月前
|
缓存 测试技术 API
构建高效后端API:实践与哲学
【9月更文挑战第36天】在数字世界的浪潮中,后端API成为了连接用户、数据和业务逻辑的桥梁。本文将深入探讨如何构建一个既高效又灵活的后端API,从设计理念到实际代码实现,带你一探究竟。我们将通过具体示例,展示如何在保证性能的同时,也不失安全性和可维护性。
|
2月前
|
缓存 数据挖掘 API
商品详情API接口的应用实践
本文探讨了商品详情API接口在电商领域的应用实践,介绍了其作为高效数据交互方式的重要性,包括实时获取商品信息、提升用户体验和运营效率。文章详细描述了API接口的特点、应用场景如商品展示、SEO优化、数据分析及跨平台整合,并提出了缓存机制、分页加载、异步加载和错误处理等优化策略,旨在全面提升电商运营效果。
|
3月前
|
存储 JSON API
深入解析RESTful API设计原则与实践
【9月更文挑战第21天】在数字化时代,后端开发不仅仅是编写代码那么简单。它关乎于如何高效地连接不同的系统和服务。RESTful API作为一套广泛采用的设计准则,提供了一种优雅的解决方案来简化网络服务的开发。本文将带你深入了解RESTful API的核心设计原则,并通过实际代码示例展示如何将这些原则应用于日常的后端开发工作中。
|
18天前
|
XML JSON 缓存
深入理解RESTful API设计原则与实践
在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
|
12天前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
26天前
|
缓存 API 开发者
构建高效后端服务:RESTful API设计原则与实践
【10月更文挑战第43天】在数字化时代的浪潮中,后端服务的稳定性和效率成为企业竞争力的关键。本文将深入探讨如何构建高效的后端服务,重点介绍RESTful API的设计原则和实践技巧,帮助开发者提升服务的可用性、可扩展性和安全性。通过实际代码示例,我们将展示如何将这些原则应用到日常开发工作中,以确保后端服务能够支撑起现代Web和移动应用的需求。
|
25天前
|
存储 JSON 测试技术
构建高效后端API:实践和原则
【10月更文挑战第43天】本文深入探讨了如何设计和实现高效、可维护的后端API,强调了设计哲学、最佳实践和常见陷阱。通过具体示例,我们展示了如何运用这些原则来提高API的性能和可用性。
|
1月前
|
Prometheus 监控 Java
深入探索:自制Agent监控API接口耗时实践
在微服务架构中,监控API接口的调用耗时对于性能优化至关重要。通过监控接口耗时,我们可以识别性能瓶颈,优化服务响应速度。本文将分享如何自己动手实现一个Agent来统计API接口的调用耗时,提供一种实用的技术解决方案。
41 3
|
11天前
|
监控 搜索推荐 测试技术
电商API的测试与用途:深度解析与实践
在电子商务蓬勃发展的今天,电商API成为连接电商平台、商家、消费者和第三方开发者的重要桥梁。本文深入探讨了电商API的核心功能,包括订单管理、商品管理、用户管理、支付管理和物流管理,并介绍了有效的测试技巧,如理解API文档、设计测试用例、搭建测试环境、自动化测试、压力测试、安全性测试等。文章还详细阐述了电商API的多样化用途,如商品信息获取、订单管理自动化、用户数据管理、库存同步、物流跟踪、支付处理、促销活动管理、评价管理、数据报告和分析、扩展平台功能及跨境电商等,旨在为开发者和电商平台提供有益的参考。
19 0
|
1月前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;