当前位置:首页 > 技术分析 > 正文内容

MOSN:一款主要使用 Go 语言开发的云原生网络代理平台

ruisui885个月前 (02-07)技术分析25

#挑战30天在头条写日记#

MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源并经过双 11 大促几十万容器的生产级验证。 MOSN 为服务提供多协议、模块化、智能化、安全的代理能力,融合了大量云原生通用组件,同时也可以集成 Envoy 作为网络库,具备高性能、易扩展的特点。 MOSN 可以和 Istio 集成构建 Service Mesh,也可以作为独立的四、七层负载均衡,API Gateway、云原生 Ingress 等使用。

核心能力

  • Istio 集成集成 Istio 1.10 版本,可基于全动态资源配置运行
  • 核心转发自包含的网络服务器支持 TCP 代理支持 UDP 代理支持透明劫持模式
  • 多协议支持 HTTP/1.1,HTTP/2支持基于 XProtocol 框架的多协议扩展支持多协议自动识别支持 gRPC 协议
  • 核心路由支持基于 Domain 的 VirtualHost 路由支持 Headers/Path/Prefix/Variable/DSL 等多种匹配条件的路由支持重定向、直接响应、流量镜像模式的路由支持基于 Metadata 的分组路由、支持基于权重的路由支持基于路由匹配的重试、超时配置支持基于路由匹配的请求头、响应头处理
  • 后端管理 & 负载均衡支持连接池管理支持长连接心跳处理支持熔断、支持后端主动健康检查支持 Random/RR/WRR/EDF 等多种负载均衡策略支持基于 Metadata 的分组负载均衡策略支持 OriginalDst/DNS/SIMPLE 等多种后端集群模式,支持自定义扩展集群模式
  • 可观察性支持格式可扩展的 Trace 模块,集成了 jaeger/skywalking 等框架支持基于 prometheus 的 metrics 格式数据支持可配置的 AccessLog支持可扩展的 Admin API集成 Holmes,自动监控 pprof
  • TLS支持多证书匹配模式、支持 TLS Inspector 模式支持基于 SDS 的动态证书获取、更新机制支持可扩展的证书获取、更新、校验机制支持基于 CGo 的国密套件
  • 进程管理支持平滑升级,包括连接、配置的平滑迁移支持优雅退出
  • 扩展能力支持基于 go-plugin 的插件扩展模式的支持基于进程的扩展模式支持基于 WASM 的扩展模式支持自定义扩展配置支持自定义的四层、七层Filter扩展

MOSN 的核心概念解析

MOSN 主要划分为如下模块,包括了网络代理具备的基础能力,也包含了 xDS 等云原生能力。

xDS(UDPA)支持

MOSN 支持云原生统一数据面 API(UDPA),支持全动态配置更新。

xDS 是 Envoy 创建的一个关键概念,它是一类发现服务的统称,其包括如下几类:

  • CDS:Cluster Discovery Service
  • EDS:Endpoint Discovery Service
  • SDS:Secret Discovery Service
  • RDS:Route Discovery Service
  • LDS:Listener Discovery Service

正是通过对 xDS 的请求来动态更新 Envoy 配置,另外还有个 ADS(Aggregated Discovery Service)通过聚合的方式解决以上 xDS 的更新顺序问题。

业务支持

MOSN 作为底层的高性能安全网络代理,支撑了 RPC、消息(Messaging)、网关(Gateway)等业务场景。

IO 模型

MOSN 支持以下两种 IO 模型:

  • Golang 经典 netpoll 模型:goroutine-per-connection,适用于在连接数不是瓶颈的情况。
  • RawEpoll 模型:也就是 Reactor 模式,I/O 多路复用(I/O multiplexing)+ 非阻塞 I/O(non-blocking I/O)的模式。对于接入层和网关有大量长链接的场景,更加适合于 RawEpoll 模型。

netpoll 模型

MOSN 的 netpoll 模型如上图所示,协程数量与链接数量成正比,大量链接场景下,协程数量过多,存在以下开销:

  • Stack 内存开销
  • Read buffer 开销
  • Runtime 调度开销

RawEpoll 模型

RawEpoll 模型如上图所示,使用 epoll 感知到可读事件之后,再从协程池中为其分配协程进行处理,步骤如下:

  1. 链接建立后,向 Epoll 注册 oneshot 可读事件监听;并且此时不允许有协程调用 conn.read,避免与 runtime netpoll 冲突。
  2. 可读事件到达,从 goroutine pool 挑选一个协程进行读事件处理;由于使用的是 oneshot 模式,该 fd 后续可读事件不会再触发。
  3. 请求处理过程中,协程调度与经典 netpoll 模式一致。
  4. 请求处理完成,将协程归还给协程池;同时将 fd 重新添加到 RawEpoll 中。

协程模型

MOSN 的协程模型如下图所示。

  • 一条 TCP 连接对应一个 Read 协程,执行收包、协议解析;
  • 一个请求对应一个 worker 协程,执行业务处理,proxy 和 Write 逻辑;

常规模型一个 TCP 连接将有 Read/Write 两个协程,我们取消了单独的 Write 协程,让 workerpool 工作协程代替,减少了调度延迟和内存占用。

能力扩展

协议扩展

MOSN 通过使用统一的编解码引擎以及编/解码器核心接口,提供协议的 plugin 机制,包括支持:

  • SOFARPC
  • HTTP1.x/HTTP2.0
  • Dubbo

NetworkFilter 扩展

MOSN 通过提供 network filter 注册机制以及统一的 packet read/write filter 接口,实现了 Network filter 扩展机制,当前支持:

  • TCP proxy
  • Fault injection

StreamFilter 扩展

MOSN 通过提供 stream filter 注册机制以及统一的 stream send/receive filter 接口,实现了 Stream filter 扩展机制,包括支持:

  • 流量镜像
  • RBAC 鉴权

TLS 安全链路

通过测试,原生的 Go 的 TLS 经过了大量的汇编优化,在性能上是 Nginx(OpenSSL)的80%,Boring 版本的 Go(使用 cgo 调用 BoringSSL)因为 cgo 的性能问题, 并不占优势,所以我们最后选择使用原生 Go 的 TLS,相信 Go Runtime 团队后续会有更多的优化,我们也会有一些优化计划。

Go vs Nginx 测试结果如下图所示:

  • Go 在 RSA 上没有太多优化,go-boring(CGO)的能力是 Go 的两倍。
  • p256 在 Go 上有汇编优化,ECDSA 优于go-boring。
  • 在 AES-GCM 对称加密上,Go 的能力是 go-boring 的 20 倍。
  • 在 SHA、MD 等 HASH 算法也有对应的汇编优化。

支持国密的性能测试结果如下图所示:


下载安装

使用 go get -u mosn.io/mosn 命令或者将项目代码克隆到 $GOPATH/src/mosn.io/mosn 目录中。

项目地址:

https://github.com/mosn/mosn

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1765.html

标签: pprof
分享给朋友:

“MOSN:一款主要使用 Go 语言开发的云原生网络代理平台” 的相关文章

费用报销管控紧抓三个要点,网上报销系统助力企业做好报销管理

财务人员在进行费用报销管控时,多多少少会遇到一些棘手的情况。费用报销管控的要点是什么?这是很对财务朋友非常关心的一个问题,今天就给大家讲解一下费用报销管控的3个要点!关键点一:要求员工把报销单上面的关键信息填写完整那么报销单上的关键信息有哪些呢?不同的费用类型,关键信息不一样,比如交通费发票,火车票...

Linux世界的多样性:yum和apt的对比,让你感受不同发行版的特色

yum和apt是两种常用的Linux软件包管理器,它们都可以用来安装、更新和删除软件包。但是,它们之间也有一些重要的区别,本文将对它们进行分析对比。yum是Yellowdog Updater Modified的缩写,它是基于RPM(Red Hat Package Manager)的软件包管理器,主要...

适合旧电脑2022年值得推荐的 10 款轻量级 Linux 发行版

推荐 10 款轻量级Linux 发行版,它们是 2022 年的轻量级、对旧硬件友好的 Linux 发行版。1、Linux LiteLinux Lite 是一款基于#ubuntu# 和 Debian 的、正在不断开发和完善的 Linux 发行版,极好看的 Xfce 桌面,并基于 Ubuntu,采用了...

云时代,Linux和容器为王,微软推出自己的发行版Azure Linux

看到今天的微软,其前CEO史蒂夫.鲍尔默肯定会后悔在15年前说过的一句话“Linux 是一种癌症(Linux is a cancer)”。 因为今天的微软不光靠Linux赚的钵满盆满,而且还发行了自己的Linux发行版Azure Linux。为了提高其云服务和容器化服务水平,其Azure公有云平台提...

15款测试html5响应式的在线工具

手机、平板灯手持设备的增多,网站要顺应变化,就必须要做响应式开发,响应式网站最大的特点在于可以在不同设备下呈现不同的布局,是基于html5+css3技术,目前越来越多的网站开始采用了响应式设计,而下面15款工具可以方便测试你的html5响应式效果。Responsinatorhttp://www.re...

Vue学习笔记之动态路由的参数传递应用及技巧

路由的参数传递:①通过params的类型· 配置路由格式:/router/:id· 传递的方式:在path后面跟上对应的值· 传递后形成的路径:/router/list,/router/profile这个就是前两篇中提到的"动态路由"中有应用过这个方法:②通过query的类型(对象方...