MoE 系列(五)|Envoy Go 扩展之内存安全

envoymesh:使用envoy go-control-plane进行kubernetes原型轻量级网格 使节 警告:正在积极开发中 Envoy网格是建立在之上的实验性简单服务网格,具有以下功能: 基于sidecar的服务网格架构 轻量级安装,针对Kubernetes 开箱即用的遥测,授权检查和L7路由功能 直接访问以自定义应用程序级网络行为 目标 最小化为Envoy代理机队实施的控制飞机 用于协调配置推出的ADS 实施本机Envoy扩展点(访问日志,指标,外部授权) 局限性 该项目广泛使用jsonnet来快速构建Envoy API处理逻辑的原型。 在应用程序部署中不支持运行状况检查。 制作说明 envoymesh使用标准的go工具。 要求: golang 1.9.2或以上 Godep (推荐)jsonnet或go-jsonnet 使用build.sh脚本为sidecar和控制器二进制文件生成并推送容器。 对于本地发展: # Start the controller go 立即下载

d054a0f31173779aaa4bbdec9a40350b.gif

文|朱德江(GitHub ID:doujiang24)

MOSN 项目核心开发者

蚂蚁集团技术专家

d2e2f778d13772dc8ce3a2c75af55c6a.png

专注于云原生网关研发的相关工作

本文 1782 字 阅读 5 分钟

前面几篇介绍了 Envoy Go 扩展的基本用法,接下来几篇将介绍实现机制和原理。

Envoy 是 C++ 实现的,那 Envoy Go 扩展,本质上就相当于把 Go 语言嵌入 C++ 里了。

在 Go 圈里,将 Go 当做嵌入式语言来用的,貌似并不太多见,这里面细节还是比较多的。比如:

  1. Envoy 有一套自己的内存管理机制,而 Go 又是一门自带 GC 的语言。

  2. Envoy 是基于 libevent 封装的事件驱动,而 Go 又是包含了抢占式的协程调度。

为了降低用户开发时的心智负担,我们提供了三种安全保障。有了这三层保障,用户写 Go 来扩展 Envoy 的时候,就可以像平常写 Go 代码一样简单,而不必关心这些底层细节。

三种安全

1. 内存安全

用户通过 API 获取到的内存对象,可以当做普通的 Go 对象来使用。

比如,通过 Headers.Get 得到的字符串,在请求结束之后还可以使用,而不用担心请求已经在 Envoy 侧结束了,导致这个字符串被提前释放了。

2. 并发安全

当启用协程的时候,我们的 Go 代码将会运行在另外的 Go 线程上,而不是在当前的 Envoy worker 线程上,此时对于同一个请求,则存在 Envoy worker 线程和 Go 线程的并发。

但是,用户并不需要关心这个细节,我们提供的 API 都是并发安全的,用户可以不感知并发的存在。

3. 沙箱安全

这一条是针对宿主 Envoy 的保障,因为我们并不希望某一个 Go 扩展的异常,把整个 Envoy 进程搞崩溃。

目前我们提供的是,Go Runtime 可以 recover 的有限沙箱安全,这通常也足够了。

更深度的,Runtime 不能 recover 的,比如 Map 并发访问,则只能将 Go So 重载,重建整个 Go Runtime 了,这个后续也可以加上。

内存安全实现机制

要提供安全的内存机制,最简单的办法,也是(几乎)唯一的办法,就是复制。但是,什么时候复制、怎么复制,还是有一些讲究的。这里权衡的目标是降低复制的开销,提升性能。

这里讲的内存安全,还不涉及并发时的内存安全,只是 Envoy(C++)和 Go 这两个语言运行时之间的差异。

PS:以前用 OpenResty 的时候,也是复制的玩法,只是有一点区别是,Lua String 的 Internal 归一化在大内存场景下,会有相对较大的开销;Go String 则没有这一层开销,只有 Memory Copy + GC 的开销。

复制时机

首先是复制时机,我们选择了按需复制,比如 Header,Body Data 并不是一开始就复制到 Go 里面,只有在对应的 API 调用时,才会真的去 Envoy 侧获取&复制。

如果没有被真实需要,则并不会产生复制,这个优化对于 Header 这种常用的,效果倒是不太明显,对于 Body 这种经常不需要获取内容的,效果则会比较的明显。

复制方式

另一个则是复制方式,比如 Header 获取上,我们采用的是在 Go 侧预先申请内存,在 C++ 侧完成赋值的方式,这样我们只需要一次内存赋值即可完成。

这里值得一提的是,因为我们在进入 Go 的时候,已经把 Header 的大小传给了 Go,所以我们可以在 Go 侧预先分配好需要的内存。

不过呢,这个玩法确实有点 tricky,并不是 Go 文档上注明推荐的用法,但是也确实是我们发现的最优的解法了。

如果按照 Go 常规的玩法,我们可能需要一次半或两次内存拷贝,才能保证安全,这里有个半次的差异,就是我们下回要说的并发造成的。

另外,在 API 实现上,我们并不是每次获取一个 Header,而是直接一次性把所有的 Header 全复制过来,在 Go 侧缓存了。这是因为大多数场景下,我们需要获取的 Header 数量会有多个,在权衡了 CGO 的调用开销和内存拷贝的开销之后,我们认为一次性全拷贝是更优的选择。

最后

相对来说,不考虑并发的内存安全,还是比较简单的,只有复制最安全,需要权衡考虑的则更多是优化的事情了。

比较复杂的还是并发时的安全处理,这个我们下回再聊。

了解更多…

MOSN Star 一下✨:
https://github.com/mosn/mosn

  本周推荐阅读  

0de8d79d61c8ef2f55bad571d254d367.png

MoE 系列(一)|如何使用 Golang 扩展 Envoy

c9d9cbedffa8b4a8e8cd25ff81962a2f.png

MoE 系列(二)|Golang 扩展从 Envoy 接收配置

6145fc98dfb99290e95bb1565a830339.png

MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置

60b1fc76dd590b9785bf7256f38ffa7e.png

MoE 系列(四)|Go 扩展的异步模式

c26738547baaf4815756411bb32efc96.jpeg

ego-demo:Go中的Envoy过滤器 演示 这是一个演示示例,说明如何使用Go的功能基于为Envoy构建Golang筛选器。 尽管可能足以帮助理解此方法的大多数挑战和好处,但它的边缘仍然有些粗糙。 设计原则 为Go开发人员提供Go-native体验 尽可能支持零拷贝数据访问 未调理的接口:尽可能使使者C ++接口类反映 成功案例 使用零复制并利用Envoy的protobuf验证机制从C到Go解析并传递过滤器配置 零拷贝和强并行接口设计的C和Go之间的通信 允许以最少的纪律使用goroutines( Pin / Post / Unpin ) 创建新过滤器而无需接触C代码(“提升”新的使节界面时除外) 通过Envoy的内置客户端支持与SDS的交互 挑战性 该项目仍处于起步阶段,还有一些技术难题尚待解决。 依赖周期 为了从C调用Go函数,首先需要构建go库(因为这会生成所需的C标头)。 但是,Go库也依赖于C库(以方便对特使 立即下载

相关推荐

DGX Spark上PyTorch GPU环境配置实战:CUDA 13.0与ARM架构全流程

在深度学习中,CUDA作为GPU加速计算的底层基础,其版本与深度学习框架(如PyTorch)的匹配直接影响模型训练的效率与稳定性。GPU环境配置不仅涉及驱动、CUDA工具链与框架运行时的协同,还依赖于硬件架构与预构建包的兼容性。在AI开发机Ubuntu系统上,正确对齐CUDA版本、计算能力架构及安装源,是避免环境故障、发挥硬件算力的关键。无论是面向个人AI超算还是通用GPU服务器,掌握版本对齐、路径隔离与验证方法,都能大幅提升开发效率。本文以DGX Spark为例,详解从环境摸底到PyTorch GPU版本

weixin_29483277的博客 219

MoE 系列(一)|如何使用 Golang 扩展 Envoy

文|朱德江(GitHub ID:doujiang24)MOSN 项目核心开发者蚂蚁集团技术专家专注于云原生网关研发的相关工作本文2680字 阅读 7分钟本文作为 MoE 系列第一篇,主要介绍用 Golang 扩展 Envoy 的极速开发体验。一、背景MoE(MOSN on Envoy)是 MOSN 团队提出的技术架构,经过近两年的发展,在蚂蚁内部已经得到了很好的验证;并且去年我们也将底层的 ...

金融级分布式架构 746

2025-03-21(DS复习): Databricks 的技术架构

Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。

baidu_24377669的博客 1428

Go语言的Envoy与API网关

1.背景介绍 1. 背景介绍 Go语言的Envoy与API网关是一种高性能、可扩展的网络代理和API管理解决方案。Envoy是一个由LinkedIn开发的开源项目,旨在提供一种可插拔的、高性能的网络代理层,用于支持服务到服务的通信。API网关则是一种用于管理、安全化和路由API请求的解决方案。 在微服务架构中,服务之间需要通过网络进行通信。这种通信需要处理的问题包括负载均衡、故障转移、安全性...

AI天才研究院 1537

3D视觉引导技术在机器人焊接中的应用

通过对比传统的2D视觉和3D视觉技术在焊接领域的应用差异,探讨了3D视觉引导技术在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势。本文对3D视觉引导技术在机器人焊接中的应用进行了深入探讨,总结了其在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势,并通过应用案例展示了其在焊接路径规划、焊缝检测和焊接质量控制等方面的重要作用。1. 提高焊接精度:3D视觉引导技术能够精确测量焊接工件的三维形状和位置,为机器人提供精准的焊接路径规划和跟踪,从而提高焊接精度。三、3D视觉引导技术概述。

2302_79273122的博客 1836

IMU预积分--详细推导过程

IMU预积分推导

weixin_51547017的博客 2万+

开启云原生 MOSN 新篇章 — 融合 Envoy 和 GoLang 生态

注:本文是王发康(毅松)在 2021 GopherChina 上演讲的文字稿,相关分享 PPT 可自行到 MOSN meetup 下载。MOSN meetup 地址:https://git...

金融级分布式架构 581

淘宝x-mini-wua生成机制与硬件信息关联性深度解析

本文深度解析了淘宝x-mini-wua的生成机制与硬件信息的关联性,详细介绍了其作为设备指纹令牌的核心作用及技术实现细节。通过分析基础硬件层、环境特征层和行为特征层的数据采集,揭示了淘宝如何利用AES加密和分级加密策略防止破解,并探讨了其安全防护与对抗策略。

weixin_29243279的博客 230

# Envoy + Go:构建高性能微服务网关的实践与创新设计在现代云原生架构中,**Envoy** 作为一款开源的边缘和

本文展示了如何利用 Go 编写高效的 Envoy 自定义过滤器,并通过 WASM 方式无缝集成进现有网关体系。整个过程无需复杂依赖,仅靠 Go 的标准库即可完成核心逻辑开发,且具有极高的性能表现。微服务之间的 API 网关;多租户环境下的请求隔离;快速实现限流、熔断、日志埋点等通用功能。📌 最佳实践提示:每个插件应尽量保持职责单一;利用 Envoy 的 stats 和 tracing 功能进行监控;生产环境务必启用 TLS 和身份认证!

taozodew123的博客 289

OpenSpec 从入门到精通:AI 时代的最佳 SDD 范式

同样都是「先写规范再写代码」的开源 SDD 框架,OpenSpec(https://github.com/fission-ai/openspec) 展现出了极高的工程性价比,无论是使用 Claude Code、Cursor 还是 Aider,都可以无缝接入 OpenSpec 的规格管理层。这些问题需要人来做判断,AI 做不了这个主。整个流程跑下来,OpenSpec 产出的效果还是令人满意的,一些前期没有考虑到的细节 AI 都补上了,生成的相关文档也有利于开发人员的知识对齐,可以尝试在团队内部推广。

qq_39093474的博客 929

告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案

set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 422

Go 语言,如何做逆向类型推导?

文|朱德江(GitHub ID:doujiang24)MOSN 项目核心开发者蚂蚁集团技术专家专注于云原生网关研发的相关工作。本文2241字 阅读8分钟PART. 1引言在上回的文章《Go 内存泄漏,pprof 够用了么?》中说到,从一个 core 文件生成内存引用关系火焰图时,虽然可以从 core 文件中读到所有的内存对象,但是并不知道它们的类型信息。这是因为 Go 作为静态类型语言,在...

金融级分布式架构 633

UG\NX二次开发 分割曲线

分割曲线没有ufun函数?那就换一种思路实现。

王牌飞行员_里海的博客 1145

MoE 系列(二)|Golang 扩展从 Envoy 接收配置

上一篇我们用一个简单的示例,体验了用 Golang 扩展 Envoy 的极速上手。这次我们再通过一个示例,来体验 Golang 扩展的一个强大的特性:从 Envoy 接收配置。

金融级分布式架构 583

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MoE 系列(七)| Envoy Go 扩展之沙箱安全

文|朱德江(GitHub ID:doujiang24)MOSN 项目核心开发者蚂蚁集团技术专家专注于云原生网关研发的相关工作本文707字 阅读3分钟在本系列的第 5 篇《MoE 系列(五)|Envoy Go 扩展之内存安全》中我们介绍了内存安全如何实现。第 6 篇《MoE 系列(六)| Envoy Go 扩展之并发安全》又谈到了并发场景下的内存安全。今天,我们来到了安全性的最后一篇:...

金融级分布式架构 224

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MoE 系列(四)|Go 扩展的异步模式

文|朱德江(GitHub ID:doujiang24)MOSN 项目核心开发者蚂蚁集团技术专家专注于云原生网关研发的相关工作本文3085字 阅读8分钟在《MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置》中我们体验了用 Istio 做控制面,给 Go 扩展推送配置,这次我们来体验一下,在 Go 扩展的异步模式下,对 Goroutine 等全部 Go 特性的支持。异步模式之前,...

金融级分布式架构 277

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MoE 系列[六] - Envoy Go 扩展之并发安全

文|朱德江(GitHub ID:doujiang24)MOSN 项目核心开发者蚂蚁集团技术专家专注于云原生网关研发的相关工作本文1313字 阅读4分钟前一篇介绍了 Envoy Go 扩展的内存安全,相对来说,还是比较好理解的,主要是 Envoy C++ 和 Go GC 都有自己一套的内存对象的生命周期管理。这篇聊的并发安全,则是专注在并发场景下的内存安全,相对来说会复杂一些。并发的原因首先...

金融级分布式架构 178

MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置

Istio 提供了 EnvoyFilter CRD,所以,用 Istio 来配置 Go 扩展也比较方便,apply 这段配置,Basic Auth 就开启了。下一篇,我们将介绍,如何在 Go 扩展中使用异步协程。至此,我们已经体验了整个 Envoy Go 的开发&使用流程,在云原生时代,人均 Golang 的背景下,相信可以很好的完成网关场景的各种定制需求。之前我们介绍过,Go 扩展是单独编译为 so 文件的,所以,我们需要把 so 文件,挂载到 Ingress Gateway 中。

金融级分布式架构 1060

开启云原生 MOSN 新篇章 — 融合 Envoy 和 Golang 生态

注:本文是王发康(毅松)在 2021 GopherChina 上演讲的文字稿,相关分享 PPT 可自行到 MOSN meetup 下载。MOSN meetup 地址:https://git...

梦醒人间 1007

SOFA Weekly|SOFAArk 会议预告、社区本周贡献 & issue 精选

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics 监控...

金融级分布式架构 501

SOFA Weekly|SOFA 聊天室、issue 精选

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics 监控...

金融级分布式架构 178

【开源之夏 2023】欢迎报名 MOSN 社区项目!

MOSN 为服务提供多协议、模块化、智能化、安全的代理能力,融合了大量云原生通用组件,同时也可以集成 Envoy 作为网络库,具备高性能、易扩展的特点。开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展,培养和发掘更多优秀的开发者。Envoy 是当前最流行的网络代理之一,Go 扩展是 MOSN 社区为 Envoy 增加的 Go 生态基础,也是 MOSN 社区 MoE 框架的基础。(分支、版本、合并请求等)

金融级分布式架构 268

MOSN 发布 v1.0 版本!

MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源并经过双 11 大促几十万容器的生产级验证。经过 4 年的蓬勃发展,在 11 位 Commiter、100 多位Contributor 和整个社区的共同努力下,经历 27 个小版本的迭代...现在 MOSN 1.0 版本正式发布了!一个足够...

金融级分布式架构 423

SOFA Weekly|SOFA 大事记、Layotto 社区会议回顾与预告、社区本周贡献

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics 监控...

金融级分布式架构 616
上一篇: 直播倒计时 1 天 | SOFAChannel#33《Occlum x EDMM=更安全好用的机密计算 LibOS》
下一篇: MoE 系列(五)|Envoy Go 扩展之内存安全
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值