本文整理自蚂蚁金服高级技术专家贾岛在 12 月 28 日 Service Mesh Meetup 杭州站现场分享。nginx
2020.2019.12.18,MOSN 项目负责人、蚂蚁金服应用网络组负责人涵畅宣布 MOSN 完成从 SOFAStack 的孵化,将启用独立 Group 进行后续运做,欢迎你们共同建设社区。git
MOSN 是一款使用 Go 语言开发的网络代理软件,做为云原生的网络数据平面,旨在为服务提供多协议,模块化,智能化,安全的代理能力。MOSN 是 Modular Open Smart Network-proxy 的简称,能够与任何支持 xDS API 的 Service Mesh 集成,亦能够做为独立的4、七层负载均衡,API Gateway,云原生 Ingress 等使用。github
项目地址:https://github.com/mosn/mosn后端
在 Service Mesh 微服务架构中,咱们经常会听到东西流量和南北流量两个术语。蚂蚁金服开源的 Service Mesh Sidecar:MOSN(Modular Observable Smart Network)已经屡次与你们见面交流,以往的议题重点在东西流量的服务发现与路由,那么蚂蚁金服在南北流量上的思考是怎样的?安全
本次分享,将从蚂蚁金服 API 网关发展历程来看,Mesh 化的网关架构是怎样的、解决了什么问题、双十一的实践表现以及咱们对将来的思考。服务器
今天的分享分为三个部分:restful
上面这张图是一个云原生,南北+东西流量的架构图,这里面包含了核心的一些组件,我快速介绍一下:网络
上面的架构你们都比较了解了,从上面的描述你们也看出来了,API Gateway 和 Service Mesh 的 Sidecar 不少能力都是相似的,好比都是一个网络代理,都具有负载均衡,都具有一些限流和鉴权能力。下面,咱们将作一个 API Gateway 和 Service Mesh 的对比。架构
从本质概念上来说,API Gateway 用一句话归纳:「Exposes your services as managed APIs」,将内部的服务以更加可控可管理的方式暴露出去,这里的关键词是「暴露」和「可控」。Service Mesh 用一句话归纳:「A infrastructure to decouple the application network from your service code」,一种将服务代码与应用网络解耦的基础设施,这里的关键词是「解耦」。app
在流量上,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 代理的内部流量,因为通常处于内网环境,这些控制通常状况下都是弱依赖。
你们能够看到,API Gateway 和 Service Mesh 实际上有不少共同点,也有不少区别。那 API Gateway Mesh 究竟是如何定义的呢?那要介绍下,咱们对 Service Mesh 的真正理解!
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 的定义是: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 网关的发展历程来看。
支付宝 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年末,中心化的网关暴露出不少问题,好比:
基于上述的问题,咱们打算干掉形式上的网关,这样就引入了下一代的网关架构:去中心化网关。
咱们将中心化的网关进行了拆分,将逻辑简单的路由模块迁移到 spanner 负载均衡器上,将网关复杂的鉴权、LDC 路由、安全等逻辑抽象成一个 gateway.jar,业务集成这个 Jar 包就具有了网关的能力,这样业务系统之间作到了隔离,中心化的网关变动风险也不会影响到这些系统,这些系统自己就是一个「网关」,大促容量的问题也再也不是问题。
一个新的架构,解决了一些问题,可是也会引入一些新的问题。
去中心化架构平稳运行了2年,接入了30多个系统(全量系统在数百个),承载了60%-80%的流量,为何只接入30个系统?由于目前的去中心化网关架构存在不少问题,导入推广比较困难:
看到这里,你们是否是感受跟 Service Mesh 解决的问题差很少:解耦网关代码和业务代码、独立升级、支持异构系统。因此咱们将去中心化的网关 Jar 集成到 Service Mesh 的 Sidecar 中,引入了下一代网关架构:Mesh 化网关架构。
总结一下:
下面介绍下蚂蚁金服 API Gateway Mesh 的架构和落地过程当中的问题。
上图是 API Gateway Mesh 的架构图,其中有3个流:
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
新技术的上线,绝对不是一件简单的事!
互联网公司与传统软件公司最大的区别就是敏捷,咱们会将更多的精力放在三板斧的实现上。一般,咱们为了作一个功能可能花了30%的工做量,可是要花70%的工做量来作灰度、回滚、监控的建设。
在 API Gateway Mesh 上线的过程当中,咱们如何作灰度和快速回滚的?
这里,我举一个例子,Spanner 为新网 Sidecar 切流的流程。咱们支持经过百分比切流,能够作到慢速度的灰度和快速的回滚。另外,MOSN 的 Sidecar 注入不是一次性全集群接入的,咱们经过 Label 打标的方式,支持集群部分单机集成 MOSN 的切流验证。
上面介绍的是蚂蚁金服在实践 API Gateway Mesh 的一些经验,接下来,我想跟你们分享,云原生下一些标准的南北向流量解决方案的选择问题。
上图是业界主流的3种南北向方案,第一种是 K8s Ingress,功能比较简单;第二种是 Istio Gateway,具有了比 Ingress 更多的路由等功能;第三种是功能更增强大的 API Gateway,能够更加精细化的管控接口和流量,能够根据本身业务的特色选择适合本身的南北向流量产品。
下面,介绍下 MOSN 的多面性。
前面讲过 Service Mesh 的 Sidecar,不只仅只用于南北流量的 RPC,实际上它能够作全部流量的 Sidecar。
将来,MOSN 的定位就是云原生全功能网络代理,能够和 LB 部署在一块儿做为 LB Sidecar;能够独立部署做为中心化网关;能够和业务 POD 部署做为去中心化网关或 MessageQueue Client;也能够做为跨云通讯网关。
Service Mesh 已来,还不赶忙上车!以上就是本期的所有分享内容。
靳文祥(花名贾岛),蚂蚁金服高级技术专家贾岛,2011年毕业后加入支付宝无线团队,一直从事移动网络接入、API 网关、微服务等相关的研发工做,目前负责蚂蚁金服移动网络接入架构设计与优化。
https://tech.antfin.com/community/activities/1056/review/962
公众号:金融级分布式架构(Antfin_SOFA)