MOSN 是一款使用 Go 语言开发的 Service Mesh 数据平面代理,2018 年 7 月由蚂蚁金服开源,开源地址 https://github.com/sofastack/sofa-mosn,MOSN 旨在为服务提供分布式、模块化、可观察和智能化的代理能力。MOSN 是 Modular Observable Smart Network 的简称。MOSN 可以与任何支持 xDS API 的 Service Mesh 集成,亦可以作为独立的四、七层负载均衡使用。未来 MOSN 将支持更多云原生场景,并支持 Nginx 的核心转发功能。
本文根据蚂蚁金服烈元 2019 年 11 月 30 日在 Gopher China Meetup 北京站上的分享整理而成,查看分享回顾,同时本文已更新到 MOSN 官方文档上。
MOSN 主要划分为如下模块,包括了网络代理具备的基础能力,也包含了 xDS 等云原生能力。
MOSN 支持云原生统一数据面 API(UDPA),支持全动态配置更新。
xDS 是 Envoy 创建的一个关键概念,它是一类发现服务的统称,其包括如下几类:
正是通过对 xDS 的请求来动态更新 Envoy 配置,另外还有个 ADS(Aggregated Discovery Service)通过聚合的方式解决以上 xDS 的更新顺序问题。
MOSN 作为底层的高性能安全网络代理,支撑了 RPC、消息(Messaging)、网关(Gateway)等业务场景。
MOSN 支持以下两种 IO 模型:
MOSN 的 netpoll 模型如上图所示,协程数量与链接数量成正比,大量链接场景下,协程数量过多,存在以下开销:
RawEpoll 模型如上图所示,使用 epoll 感知到可读事件之后,再从协程池中为其分配协程进行处理,步骤如下:
MOSN 的协程模型如下图所示。
常规模型一个 TCP 连接将有 Read/Write 两个协程,我们取消了单独的 Write 协程,让 workerpool 工作协程代替,减少了调度延迟和内存占用。
MOSN 通过使用同一的编解码引擎以及编/解码器核心接口,提供协议的 plugin 机制,包括支持:
MOSN 通过提供 network filter 注册机制以及统一的 packet read/write filter 接口,实现了 Network filter 扩展机制,当前支持:
MOSN 通过提供 stream filter 注册机制以及统一的 stream send/receive filter 接口,实现了 Stream filter 扩展机制,包括支持:
通过测试,原生的 Go 的 TLS 经过了大量的汇编优化,在性能上是 Nginx(OpenSSL)的80%,Boring 版本的 Go(使用 cgo 调用 BoringSSL)因为 cgo 的性能问题, 并不占优势,所以我们最后选择使用原生 Go 的 TLS,相信 Go Runtime 团队后续会有更多的优化,我们也会有一些优化计划。
Go vs Nginx 测试结果如下图所示:
为了满足金融场景的安全合规,我们同时也对国产密码进行了开发支持,这个是 Go Runtime 所没有的。虽然目前的性能相比国际标准 AES-GCM 还是有一些差距,大概是 50%,但是我们已经有了后续的一些优化计划,敬请期待。
支持国密的性能测试结果如下图所示:
MOSN 开源地址:https://github.com/sofastack/sofa-mosn
ServiceMesher 社区是由一群拥有相同价值观和理念的志愿者们共同发起,于 2018 年 4 月正式成立。
社区关注领域有:容器、微服务、Service Mesh、Serverless,拥抱开源和云原生,致力于推动 Service Mesh 在中国的蓬勃发展。
社区官网:https://www.servicemesher.com