蚂蚁金服网络代理演进之路支持国密算法 WAF 流量镜像 多协议 SOFARPC Dubbo HTTP1.1/2 平滑升级 性能 单跳CPU增加5%消耗 0.2ms RT 蚂蚁金服100+应用,10w+容器已经mesh化,部分业务链路通过下沉, RT降低了7%,平稳支撑了618大促。SOFAMosn https://github.com/sofastack/sofa-mosn Written in go SOFAMosn是一个云原生安全网络代理 MOSN 通过使用同一的编解码引擎以及编/解码器核心接口,提供协议的 plugin 机制,包括支持 • SofaRPC • HTTP1.x,/HTTP2.0 • Dubbo ü NetworkFilter 扩展 MOSN 通过提供 network filter 注册机制以及统一的 packet read/write filter 接口,实现了 Network filter 扩展机制, 当前支持: • Fault injection ü StreamFilter 扩展 MOSN 通过提供 stream filter 注册机制以及统一的 stream send/receive filter 接口,实现了 Stream filter 扩展机制, 包括支持: • 流量镜像,RBAC鉴权SOFAMosn能力扩展 心跳检查在Service Mesh场景下网络代理有着不同于接入层的挑战 • 无0 码力 | 46 页 | 19.93 MB | 6 月前3
SOFAMOSN持续演进路径及实践分享协议自动识别 Ø 链式路由扩展 Ø 完善流量管理策略,包括 Retry、DirectResponse、 HTTP Header add/delete、 流控、故障注入等 Ø 支持必要的admin接口性能 0.1.0 0.2.0 0.3.0 0.4.0 Ø 内存复用框架 Ø Slab style buffer Ø Raw-Epoll模式 Ø 读合并 Ø 协程池化 Ø 调度均衡 Ø 0实现问题: 1. syscall read较多,效率低下 2. 每个stream分配单独的goroutine处理, 调度开销高 3. 临时对象多,GC占比高 4. 基本实现了RFC中MUST部分,部分功 能需求上不匹配,如GRPC trailer实现技术案例 – HTTP/2.0优化 优化思路:适配MOSN框架,复用官方实现核心结构体和解析流程 Ø 框架适配 ü IO框架 ü 内存复用框架 Service p Client模拟方式:通过蚂蚁内部压测平台建立10w条SOFARPC链接 p 压测内容: 1K 请求/响应持续演进实践总结 ü 架构上,从一开始就遵循分层设计,模块解耦,统一编程模型接口,保证足够的架 构扩展性。 ü 性能上,针对IO、协议、内存、协程进行持续优化。相比最初版本,SOFARPC 协 议上对 0.1.0 版本 QPS 提升了 50%,内存使用减少了 40%;HTTP/20 码力 | 29 页 | 7.03 MB | 6 月前3
蚂蚁金服Service Mesh渐进式迁移方案(Sidecar模式) 部署在 非k8s上 Service Mesh (Istio模式) 应用终极形态 应用现状 1 1 1 2 2 2 3 4 4 4 比较理想,绝大部分 投入最终都将保留 Service Mesh (Sidecar模式) Service Mesh (Istio模式) 带完善的控制 平面,如Istio 只有Sidecar, 直接集成周边 所有编程语言/平台都支持的 ü 产品的长期方向 • SOFAMesh和SOFAMosn中已经基于x-protocol实现了DNS通用寻址方式 • 为了兼容RPC应用和k8s(微服务)的服务注册模型,需要为每个RPC接口提供DNS支持 • 未来Serverless中的Function也计划提供DNS寻址支持 • 可能会有更广泛的使用场景 ü 演进思路 • 简化原有SDK (短期需求) • 同时引入域名和DNS,实现通用寻址 SOASOA时代的寻址:服务发现和服务注册 Interface2 Interface1 Interface3 SOA架构:单进程多接口 服务注册中心 注册interface3 注册interface2 注册interface1 client 1. 查找interface2 以接口为 单位注册 客户端调用参考配置和示例代码:0 码力 | 40 页 | 11.13 MB | 6 月前3
Service Mesh的实践分享胖客户端 Sidecar(物理机) Daemonset(云) Cluster(HTTP) 接入难度 容易。打入依赖包即可 容易。需依赖SDK 容易。需依赖SDK 编码难度 容易。IDL接口规范 容易。IDL接口规范 难。需要自行处理HTTP请求和 响应(目前还没有生成HTTP sdk) 应用侵入性 侵入性大。复杂客户端会给 应用造成负担,包括资源占 用、依赖冲突等等 侵入性小。SDK只有简单的寻址和序列化/ 对容器的影响 影响大。Pod中增加sidecar容器,加大整个Pod的资源需 求,对K8s的调度形成压力,特别是在资源紧张的情况下; 而且还容器导致资源浪费(sidecar的使用率问题) 影响小。宿主机预留部分资源启动daemonset 即可 运维难度 难度大。Sidecar故障会影响同一个pod的业务容器,同 生共死 难度小。Sidecar故障可以将流量临时切到 remote proxy解决 升级难度 路由、Hash路由、基于权重的路 由、熔断、健康探测、超时重试、 限流降级等等 • 契约化治理,服务接口变更diff并 通知上游 • 环境无关,物理机、云、测试机 器、本机都能跑实践中踩过的坑 我是作者名称ZooKeeper的强耦合 • 初始设计没有抽象服务注册发现和服务配 置的接口,直接操作ZK并且依赖了ZK的特 性和原语 • ZK弊端显现 • 跨机房多活问题 • 性能问题 •0 码力 | 30 页 | 4.80 MB | 6 月前3
Service Mesh 在蚂蚁金服生产级安全实践Service Account 支持多种Sidecar 通过Citadel Agent 获取证书使用可信身份服务构建敏感数据下发通道 背景介绍 通过应用Pod 中增加一个安全 Sidecar,以API接口的形式为APP及其他Sidecar 提供基础的身 份颁发、身份验证功能 解耦应用的业务逻辑与认证授权逻辑,减少开发量; 提供密码学安全的认证授权逻辑,提高安全性; 全网统一的认证授权方式,去凭证,减少攻击面; 力,及可问责能 力(accountability)。使用可信身份服务构建敏感数据下发通道 身份获取 应用 A 构造 HTTP 请求,调用 安全Sidecar 提供的 JWT-SVID 颁发接口获取 JWT-SVID。 安全Sidecar 通过 Downward API 获取 Pod 身份,并转换成 SPIFFE ID。 安全Sidecar 通过密钥将 SPIFFE ID 签发为 从应用 A 发起的调用上下文中获取 JWT-SVID,并构造 HTTP 请求,调用安全Sidecar提供的 JWT- SVID 验证接口。 安全Sidecar通过密钥对 JWT-SVID 进行验签。 从 JWT-SVID 的 Body 部分中获取 SPIFFE ID。 将 SPIFFE ID 内容解释为几个关键属性 (例如租户 ID、应用名等),并返回给应用 B。 应用0 码力 | 19 页 | 808.60 KB | 6 月前3
Service Mesh 高可用在企业级生产中的实践Multi-Datacenter 注册中心 - Consul11/总页数 注册中心 - Consul • Consul 架构12/总页数 注册中心 - Consul • 注册中心容灾 服务端容灾 • 部分节点宕机 • 网络分区 客户端容灾 • 注册中心完全不可用13/总页数 注册中心 - Consul Servers Quorum Size Failure Tolerance 1 1 0 服务限流 • 拒绝策略 • 延迟处理 • 特权处理 常用限 流策略24/总页数 治理策略 & 高可用 • 微服务高可用设计手段 - 服务限流 • 固定、滑动时间窗口限流 • 适合微服务接口 • 选定的时间粒度上限流 • 令牌桶、漏桶限流 • 适合阻塞限流 • 超过最大访问频率后,请求阻塞等待或者直接拒绝(等待时间=0) 常用限 流算法25/总页数 治理策略 & 高可用 •0 码力 | 38 页 | 1.38 MB | 6 月前3
SOFAMesh的通用协议扩展Pattern 通过 CRD 扩展新的能力 • …MESH 落地碰到的问题 • 客户端服务发现与负载均衡无法与 ISTIO 一起工作 • ENVOY 不支持微服务使用的通信协议 • RPC 服务使用的接口,方法,参数语义无法匹配 ISTIO 的路由模 型 • 一个应用上部署了多个 RPC 服务,每个服务有自己的版本 • …ISTIO 控制平面路由的抽象模型 INBOUND OUTBOUNDSOFA DUBBO • 开发 DUBBO 服务的 XDS 配置下发 • 开发 DUBBO 服务的路由规则 XDS 适配 • 开发 DUBBO 协议支持(开箱即用模式下也可以省掉)DNS 寻址目标 • 允许应用把接口当做域名来访问远端服务 • 支持在 Kubernetes DNS 之上构建更结构化的域名体系 • 支持跨集群的服务寻址 • 支持单应用多服务的部署模型 bolt://com.yourcompany Service Create RPC ServiceCRD 定义 RPC Service 对应一个微服务,对应 RPC 框架中的接口定义 一个应用可能包含多个 RPC Service RPC Service 关联到一个 Kubernetes 服务 RPC Service 的域名就是其接口X-PROTOCOL 通用协议扩展目标 • Kubernetes Native,高性能,低侵入性的通用 Mesh 落地方案0 码力 | 28 页 | 4.73 MB | 6 月前3
Service Mesh是下一代SDN吗:从通信角度看Service Mesh的发展Ø 北向接口 • 面向业务和运维 • 具有较高的抽象层次,比较容易提取统一的控制面标准? • 主要面向layer 7及以上? • SMI能否统一控制面标准?如何避免成为最小公分母,扩展支持其它协议? Ø 南向接口 • 面向流量和路由配置 • xDS v2将统一数据面标准? • xDS接口包含有较多实现相关内容:Listener, Filter, 能否可以成为一个通用的接口协议? 是 是否会出现Envoy之外的大量数据面实现? • 建议:对xDS接口进行改进,去掉实现相关内容 Ø Service Mesh的发展 • 控制面对数据面软硬件的统一控制能力? • 通过控制面API接入各种丰富的应用场景 - 下一个热点?总体架构-高层视图 DexMesh控制面 MSB-SDClient MSB-Consul Jaeger DexMesh数据面 Pod Microservice0 码力 | 27 页 | 11.99 MB | 6 月前3
蚂蚁金服ServiceMesh数据平面 SOFAMosn深层揭秘Ø定义可编程的网络模型,核心方法,监控指标 Ø定义可扩展的插件机制PROTOCOL 5 Ø定义编解码核心数据结构 üMesh处理三段式:Headers + Data + Trailers Ø定义协议Codec核心接口 ü编码:对请求数据进行编码并根据控制指令发送数据 ü解码:对IO数据进行解码并通过扩展机制通知订阅方 •定义扩展机制通知解码事件STREAMING 6 Ø定义Stream模型 ü 向上确保协议行为一致性 ü 为网络协议请求/响应提供可编程的抽象载体 ü 考虑PING-PONG,PIPELINE,分帧STREAM三种典型流程特征 Ø定义Stream生命周期,核心事件 Ø定义Stream层编/解码核心接口 ü 核心数据结构复用Protocol层 Ø定义可扩展的插件机制 Ø对于满足请求Stream池化的需求 Ø需处理上层传入的状态事件PROXY 7 Ø基于Stream抽象提供多协议转发能力 Ø执行Stream扩展Filters Pool send encode Q u e u e C模块划分 11要点总结 12 Ø模块化,分层解耦 Ø统一的编程模型接口 Ø可扩展的事件驱动模型 Ø可扩展的路由/后端管理机制 Ø更好的吞吐量3 能力核心能力 1 网络处理 •网络编程接口 •链接管理 •事件机制 •Metrics 收集 •TCP 代理 •TLS 支持 •TProxy 支持 •平滑 reload0 码力 | 44 页 | 4.51 MB | 6 月前3
Service Mesh的延伸 — 论道Database Meshconsistency - 最终一致性分布式事务:分类 XA 最大努力送达 Saga TCC 业务改造 无 无 实现补偿接口 实现TCC接口 回滚 支持 不支持 支持 支持 一致性 强一致 最终一致 最终一致 最终一致 隔离性 原生支持 不支持 不支持 Try接口支持 并发性能 严重衰退 无影响 无影响 略微衰退 适合场景 短事务 并发较低 事务最终成功 高并发 长事务 应用方控制并发0 码力 | 35 页 | 4.56 MB | 6 月前3
共 19 条
- 1
- 2













