精华内容
下载资源
问答
  • 为您提供MOSN云原生网络数据平面下载,MOSN是一款使用Go语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN是Modular Open Smart Network-proxy的简称...
  • 为您提供MOSN云原生网络数据平面下载,MOSN是一款使用Go语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN是Modular Open Smart Network-proxy的简称...
  • 为您提供MOSN云原生网络数据平面下载,MOSN是一款使用Go语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN是Modular Open Smart Network-proxy的简称...
  • 为您提供MOSN云原生网络数据平面下载,MOSN是一款使用Go语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN是Modular Open Smart Network-proxy的简称...
  • 云原生计算基金会(CNCF)发布的《云原生网络功能一致性指南》,52页PPT详细阐述了现有网络功能向云原生网络功能(CNF)演进的方向、一致性要求以及CNCF能够提供的支持和协作。 1、很多电信运营商已经表达了从VNF...
  • 作者简介Arthur,Stephen,Jaff,Weir,几位均来自携程云平台基础设施和网络研发团队,目前专注于网络和云原生安全相关的开发。Cilium 是近两年最火的云原生网络方案之...

    作者简介

     

    Arthur,Stephen,Jaff,Weir,几位均来自携程云平台基础设施和网络研发团队,目前专注于网络和云原生安全相关的开发。

    Cilium 是近两年最火的云原生网络方案之一。Cilium 的核心基于 eBPF,有两大亮点:基于 eBPF 的灵活、高性能网络,以及基于 eBPF 的 L3-L7 安全策略实现。

    携程 2019 年开始在生产环境使用 Cilium,本文将介绍 Cilium 在携程的落地情况,以及我们基于 Cilium 的、覆盖虚拟机、物理机和容器的云原生安全的一些探索。

    一、网络演进简要回顾

    从 2013 年到 2018 年,我们经历了物理机到虚拟机再到容器的基础设施演进,但网络技术栈基本都是沿用 Neutron+OVS —— 即使对我们(前期)的 Kubernetes 集群也是如此。但业务开始往 Kubernetes 迁移之后,这套 Neutron+OVS 的网络方案越来越捉襟见肘,尤其是在部署密度更高、规模更大的容器面前,这种大二层网络模型的软件和硬件瓶颈暴露无遗 [1]。

    为了解决这些问题,更重要的,为了满足云原生业务的各种需求(例如,支持Kubernetes 的 Service 模型),我们调研了很多较新的网络方案,综合评估之后,选择了 Cilium+BGP 的组合 [3]。

    Fig 1-1. Networking solutions over the past years [2]

    Cilium+BGP 方案 2019 年底正式在生产环境落地,我们打通了 Cilium 网络和现有网络,因此能灰度将容器从 Neutron 迁移到 Cilium。


    二、云原生网络实践

    作为 Cilium 的早期用户之一,我们对 Cilium 的实现和部署做了一些修改或定制化,以使这套方案能平滑地落地到现有的基础设施之中,例如 [2],

    1)用 docker-compsoe + salt 来部署,而不是采用默认的 daemonset+configmap 方式。

    这样每台 node 上的 cilium-agent 都有独立配置,我们能完全控制发布灰度,将 变更风险降到最低。

    2)用 BIRD 作为 BGP agent,而不是采用默认的 kube-router。

    kube-router 开箱即用,但缺少对 ECMP、BFD 等高级功能的支持,不符合我们生产环境的要求。

    3)为了保证某些业务的平滑迁移,我们开发了 StatefulSet/AdvancedStatefulSet 固定 IP 的支持(需要 sticky 调度配合)。

    4)定制化了监控和告警。

    5)其他一些自定义配置。

    我们之前的一篇文章 [2] 对此有较详细的介绍,有兴趣可以移步。下面讨论几个之前介绍较少或者没有覆盖到的主题。


     

    2.1 BGP 建连模型

    Cilium+BIRD 方案中,以宿主机为界,网络可以大致分为两部分,如图 2-1 所示。

    Fig 2-1. High level topology of the Cilium+BGP solution [2]

    1)宿主机内部网络:由 Cilium(及内核协议栈)负责,职责包括:

    • 为容器创建和删除虚拟网络。

    • 为容器生成、编译和加载 eBPF。

    • 处理同宿主机内容器之间的网络通信。

    2)跨宿主机网络:由 BGP(及内核路由模块)负责,职责包括:

    • 与数据中心网络交换路由(PodCIDRs)。

    • 对出宿主机的流量进行路由。

    对于跨宿主机部分,需要确定要采用哪种 BGP peering 模型,这个模型解决的问题包括 :

    1)BGP agent 的职责,是作为一个全功能路由控制服务,还是仅用作 BGP speaker?

    2)宿主机和数据中心的哪些设备建立 BGP 邻居?

    3)使用哪种 BGP 协议,iBGP 还是 eBGP?

    4)如何划分自治域(AS),使用哪种 ASN(自治域系统编号)方案?

    取决于具体的网络需求,这套 BGP 方案可能很复杂。基于数据中心网络能提供的能力及实际的需求,我们采用的是一种相对比较简单的模型:

    1)每台 node 运行 BIRD,仅作为 BGP speaker。

    • Node 在上线时会自动分配一个 /25 或 /24 的 PodCIDR。

    • BIRD 和数据中心网络中的两个邻居建立 BGP 连接。

    • BIRD 将 PodCIDR 通告给邻居,但不从邻居接受任何路由。

    2)数据中心网络只从 node 接受 /25 或 /24 路由宣告,但不向 node 宣告任何路由。

    3)整张网络是一张三层纯路由网络(pure L3 routing network)。

    这种模型的简单之处在于:

    1)数据中心网络从各 node 学习到 PodCIDR 路由,了解整张网络的拓扑,因此 Pod 流量在数据中心可路由。

    2)Node 不从数据中心学习任何路由,所有出宿主机的流量直接走宿主机默认路由(到数据中心网络),因此宿主机内部的路由表不随 node 规模膨胀,没有路由条目数量导致的性能瓶颈。

    Fig 2-2. BGP peering model in 3-tier network topology

    在路由协议方面:

    • 老数据中心基于“接入-汇聚-核心”三级网络架构,如图 2-2 所示,

      • 节点和核心交换机建立 BGP 连接。

      • 使用 iBGP 协议交换路由。

    • 新数据中心基于 Spine-Leaf 架构,

      • 节点和直连的 Leaf 交换机(置顶交换机)建立 BGP 连接。

      • 使用 eBGP 协议交换路由。

    我们已经将这方面的实践整理成文档,见 Using BIRD to run BGP [3]。


     

    2.2 典型流量转发路径:从 Pod 访问 Service

    来看一下在这套方案中,典型的流量转发路径。

    假设从一个 Pod 内访问某个 Service,这个 Service 的后端位于另一台 Node,如下图所示:

    Fig 2-3. Traffic path: accessing Service from a Pod [4]

    主要步骤:

    1)在 Node1 上的 Pod1 里面访问某个 Service (curl <ServiceIP>:<port>)。

    2)eBPF 处理 Service 抽象,做客户端负载均衡:选择某个后端,然将包的目的 IP 地址从 ServiceIP 换成后端 PodIP(即执行 DNAT)。

    3)内核路由决策:查询系统路由表,根据包的目的 IP 地址确定下一跳;对于这个例子匹配到的是默认路由,应该通过宿主机网卡(或 bond)发送出去。

    4)包到达宿主机网卡(bond),通过默认路由发送到宿主机的默认网关(配置在数据中心网络设备上)。

    5)数据中心网络对包进行路由转发。由于此前数据中心网络已经从各 Node 学习到了它们的 PodCIDR 路由,因此能根据目的 IP 地址判断应该将包送到哪个 Node。

    6)包达到 Node 2 的网卡(bond):一段 eBPF 代码负责提取包头,根据 IP 信息找到 另一段和目的 Pod 一一对应的 eBPF 代码,然后将包交给它。

    7)后一段 eBPF 代码对包执行 入向策略检查,如果允许通过,就将包交给 Pod4。

    8)包到达 Pod4 的虚拟网卡,然后被收起。

    我们有一篇专门的文章详细介绍整个过程,见 [4]。


     

    2.3 集群边界 L4/L7 入口解决方案

    在 Kubernetes 的设计中,ServiceIP 只能在集群内访问,如果要从集群外访问 Service 怎么办?例如,从 baremetal 集群、OpenStack 集群,或者其他 Kubernetes 集群访问?这属于集群边界问题。

    K8s 为这些场景提供了两种模型:

    1)L7 模型:称为 Ingress,支持以 7 层的方式从集群外访问 Service,例如通过 HTTP API 访问。

    2)L4 模型: 包括 externalIPs Service、LoadBalancer Service,支持以 4 层的方 式访问 Service,例如通过 VIP+Port。

    但是,K8s 只提供了模型,没提供实现,具体的实现是留给各厂商的。例如,假如你使用的是 AWS,它提供的 ALB 和 ELB 就分别对应上面的 L7 和 L4 模型。在私有云,就需要我们自己解决。

    我们基于 Cilium+BGP+ECMP 设计了一套四层入口方案。本质上这是一套四层负载均衡器(L4LB),它提供一组 VIP,可以将这些 VIP 配置到 externalIPs 类型或 LoadBalancer 类 型的 Service,然后就可以从集群外访问了。

    Fig 2-4. L4LB solution with Cilium+BGP+ECMP [5]

    基于这套四层入口方案部署 istio ingress-gateway,就解决了七层入口问题。从集群外访问时,典型的数据转发路由如下:

    Fig 2-5. Traffic path when accesing Service from outside the Kubernetes cluster [5]

    我们之前有篇博客详细介绍这个主题,见 [5]。


    三、云原生安全尝试

    Cilium 提供的两大核心能力:

    1)基于 eBPF 的灵活、动态、高性能网络。

    2)L3-L7 安全策略:CiliumNetworkPolicy 是对 K8s 的 NetworkPolicy 的扩展。

    在落地了网络功能后,针对安全需求,我们在尝试落地基于 Cilium 的安全。


     

    3.1 Cilium 安全策略

    首先来看一个简单的例子,看看 CiliumNetworkPolicy (CNP) 长什么样 [6]:

    apiVersion: "cilium.io/v2"kind: CiliumNetworkPolicymetadata:  name: "clustermesh-ingress-l4-policy"  description: "demo: allow only employee to access protected-db"spec:  endpointSelector:    matchLabels:      app: protected-db  ingress:  - toPorts:    - ports:      - port: "6379"        protocol: TCP    fromEndpoints:      - matchLabels:          app: employee
    
    
    上面的 yaml:
    
    
    
    

    1)创建一个 CNP,可以指定 name 和 description 等描述字段。

    2)对带 app=protected-db 标签(labels)的 endpoints(pods)执行这个 CNP。

    3)在执行 CNP 的时候,只对入向(ingress)流量做控制,并且限制如下流量来源:

      • 协议是 TCP,并且端口是 6379.

      • 流量来自带 app:employee labels 的 endpoints(pods)。

      可以看到,CNP 非常灵活,使用起来也很方便。但真实世界要远比想象中复杂,要真正落地 Cilium 安全策略,还存在很多挑战。


       

      3.2 落地挑战

      下面举两个例子,相信这些问题在很多公司都需要面对,并不是我们独有的。


      多集群问题

      如果你所有的应用都运行在 Cilium 集群中,并且客户端和服务端都收敛到一个集群(大部分公有云厂商都推荐一个 region 只部署一套 K8s 集群,所有访问都收敛到这套集群),那落地起来会简单很多。

      但大部分有基础设施演进的公司恐怕都不满足这个假设,实际的情况很可能是:业务分散在多个集群。


      混合基础设施

      多集群还不是最大的问题,因为业界多少还有一些多集群解决方案。

      更严重的一个问题是:业务不仅分散在不同集群,而且在不同平台。例如对我们来说,现在有:

      1)Bare metal 集群

      2)OpenStack 集群

      3)基于 Neutron+OVS 的 Kubernetes 集群

      4)基于 Cilium+BGP 的 Kubernetes 集群

      虽然我们计划将所有容器从 Neutron 网络迁移到 Cilium 网络,但另外两种,bare metal 和 OpenStack 集群,还是会长期存在的,虽然规模可能会逐渐减小。


       

      3.3 整体方案设计

      我们目前的一个整体方案:在服务端容器做入向安全策略,客户端可以来自任何平台、任何集群:

      1)这将范围框定到了已经在 Cilium 网络的服务端容器,是一个不错的起点。

      2)传统网络里的服务端容器,会逐渐迁移到 Cilium 网络。

      3)BM 和 VM 的服务端实例,第一阶段先不考虑安全控制。

      那接下来的问题就是:服务端如何具备对所有类型、所有集群的客户端进行限制的能力?我们的解决方案是:

      1)首先,用 Cilium 提供 ClusterMesh 将已有 Cilium 集群连接起来;

      2)然后,“扩展” ClusterMesh,让它能感知到 mesh 之外的 endpoints,即 BM、BM 和 Neutron Pods。

      下面分别解释这两点。


      3.3.1 用 ClusterMesh 做 Cilium 集群互连

      Fig 3-1. Vanilla Cilium ClusterMesh [6]

      ClusterMesh [7] 是 Cilium 自带的一个多集群解决方案。如果所有应用都在 Cilium 集群 里,那这种方式可以解决跨集群的安全策略问题,即,application 实例可以分布在不同的集群。

      这样说来,使用 ClusterMesh 似乎是理所当然的,但其实它并不是我们当初的第一选择。因为多集群还有其他方案,本质上做的事情就是如何在多个集群之间同步元数据,并且做到集群变动的实时感知。

      1)出于多个内部需求,当时有考虑自己做这样一套元数据同步方案,它能解决包括 Cilium 在内的多个需求。

      2)并未看到业界大规模使用 ClusterMesh 的案例,所以对它的可用性还存疑。

      但后来综合对比了几种选项之后,觉得 ClusterMesh 还是值得尝试的。

      关于 ClusterMesh 的实地(功能)测试,可以参考我们之前的一篇博客 [6]。


      3.3.2 扩展 ClusterMesh,感知 mesh 外实例

      这里的外部实例(external endpoints)包括 Neutron Pod、VM、BM。

      基于对 Cilium 的理解,我们判断只要将外部实例信息以 Cilium 能感知的方式(格式)同步到 Cilium 集群,那在入向(inbound),Cilium 对这些实例的控制能力,与对原生 Cilium 实例的控制能力并无区别。换句话说,我们“骗一下” Cilium,让它认为这些实例都是 Cilium endpoints/pods。

      为此我们开发了一个组件,使得 OpenStack 平台、Bare metal 平台和Neutron-powered Kubernetes 平台能将它们的实例创建/销毁/更新信息同步更新到 Cilium 集群,如下图所示:

      Fig 3-2. Proposed security solution over hybrid infrastructures

      结合 3.3.1 & 3.3.2,在这套“扩展之后的” ClusterMesh 中,每个 Cilium agent 都对全局实例(container/vm/bm)有着完整的、一致的视图,因此能在 Cilium Pod 的入向对各种类型的客户端做安全控制。目前计划支持的是 L3-L4 安全策略,未来考虑支持 L7。

      这套方案已经通过了功能验证,正在进行正式开发和测试,计划年底开始灰度上线。


      四、总结

      本文总结了我们在基于 Cilium 的云原生网络和云原生安全方面的一些探索和实践。更多技术细节,可参考下面一些链接。


      参考文献

      [1] Ctrip Network Architecture Evolution in the Cloud Computing Era

      [2] Trip.com: First Step towards Cloud Native Networking.

      [3] Cilium Doc: Using BIRD to run BGP

      [4] Life of a Packet in Cilium: Discovering the Pod-to-Service Traffic Path and BPF Processing Logics

      [5] L4LB for Kubernetes: Theory and Practice with Cilium+BGP+ECMP

      [6] Cilium ClusterMesh: A Hands-on Guide

      [7] Cilium Doc: clustermesh

      【推荐阅读】

       “携程技术”公众号

        分享,交流,成长

      展开全文
    1. 杭州站活动邀请了 Apache APISIX 项目 VP 温铭、又拍云平台开发部高级工程师莫红波、蚂蚁金服技术专家王发康、有赞中间件开发工程师张超,分享云原生落地应用的经验心得,以下是王发康《云原生网络代理(MOSN)的...

      本文系云原生应用最佳实践杭州站活动演讲稿整理。杭州站活动邀请了 Apache APISIX 项目 VP 温铭、又拍云平台开发部高级工程师莫红波、蚂蚁金服技术专家王发康、有赞中间件开发工程师张超,分享云原生落地应用的经验心得,以下是王发康《云原生网络代理(MOSN)的进化之路》分享内容。

      王发康(毅松), 蚂蚁金服可信原生技术部技术专家,专注于高性能网络服务器研发,MOSN、Tengine 开源项目核 心成员,目前关注云原生 ServiceMesh、Nginx、Istio等相关领域。

      今天主要分享 MOSN 在蚂蚁金服的 Service Mesh 大规模落地后,通过对接 UDPA 打造为 Istio 的数据面之一,其在演进过程中遇到的问题及思考,我从以下三方面展开:

      • MOSN 介绍

      • 云原生演进

      • 总结与展望

      MOSN 介绍

      我先从 MOSN 的诞生背景、MOSN 在蚂蚁集团的发展历程、MOSN 的架构解析和落地情况等维度向大家介绍 MOSN。

      MOSN 诞生背景

      说到 Service Mesh 为什么会出现,我们需要先回顾服务演进历程,大体经历如下阶段:

      **单体服务:**早期网站小、流量少,业务简单,可在同一个服务中完成所有部署;

      **分布式:**当用户达到一定规模且日益增长,需要进行服务拆分;

      **微服务:**随着服务数量的持续增加,出现了服务治理的需求,如限流、鉴权、熔断等,于是一些治理组件便被以 SDK 插件的形式集成到不同的应用中;

      **Service Mesh:**由于服务治理的 SDK 多语言、中间件组件开发适配成本高,以及其本身较弱的服务治理能力,开始尝试将 SDK 和业务剥离,解耦出一个单独的 Sidecar,从而解决多语言开发、业务迭代等难题。

      总的来看,业务侧有如下痛点:

      • 多语言,中间件组件开发适配成本高

      • SDK 升级困难

      • 服务治理能力弱

      • 技术不通用,无法复用

      现有业界方案:

      • Envoy (C++)

      • Linkerd (活跃度较低)

      • NginxMesh (活跃度低)

      基于上述业务的痛点以及对业界相应的解决方案评估过后,最终我们决定自主研发 MOSN。MOSN(ModularOpen Smart Network) 是用 GoLang 语言开发的网络代理软件,作为云原生的网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。

      MOSN 发展历程

      MOSN 从 2017 年 12 月开始 Service Mesh 技术调研,到产品孵化,历经重重困难,最终通过 2019 年双 11 规模化验证,实现蚂蚁集团核心支付链路覆盖。MOSN 在内部落地后,我们认为借力开源也要反哺开源,因此着手进行 CloudNative 生态融合,和业界多种开源标准组件联合走标准化道路,从而实现共享并最大化的释放其技术红利。

      MOSN 在整个蚂蚁集团的发展历程

      下图为 MOSN 全局功能视图,作为网络数据平面,MOSN 如今已具备支持路由、负载均衡、多协议等多功能,另外也包括可观察性和 Admin 管理等。

      MOSN 全局功能视图

      MOSN 架构解析

      MOSN 整体框架采用分而治之的架构思想,如图所示 MOSN 整个架构共分四层:

      MOSN 架构图

      -Network:最底层是网络层,负责接收数据包,Listener_filter(original_dst)、network_filter(tcp、faultinject)

      • Protocol:多协议层(HTTP 系、SOFARPC、Dubbo),提供自定义协议能力(Xprotocol)

      • Stream:Stream_filter(health_check、faultinject)

      • Proxy:提供 proxy 框架(分阶段处理、router、loadbalancer、connection pool)

      每一层通过工厂设计模式向外暴露其接口,方便用户灵活的注册自身的需求,采用协程池的方式使得用户以同步的编码风格就可以实现异步功能特性。鉴于 MOSN 使用 GoLang 语言,支持用同步的方式表达异步的动作,因而 MOSN 较为容易的实现了 read 和 proxy 两大类协程,具体流程见 MOSN 的协程池模式示意图:

      MOSN 协程架构图

      通过上述框架设计,MOSN 竞争优势大大提高,其核心能力如下:

      • 热生效:配置热生效(xDS);二进制平滑升级(连接迁移)是核心竞争优势

      • 多协议(Xprotocol):支持 HTTP 系、SOFARPC、Dubbo

      • 流量管理及路由:headers/uri 分流;连接池、健康检查、熔断保护、故障注入;TLS/国密

      • 转发能力:四层及七层;SWRR、Random、EDF、Maglev etc

      • 可观察性:连接、请求、流量

      MOSN 内存&连接池

      MOSN 为了降低 Runtime GC 带来的卡顿,自身做了内存池的封装,方便多种对象高效的复用内存。为了提升服务网格之间的建连能力,我们设计封装了多种协议的连接池,方便的实现连接复用及管理。

      MOSN 落地情况

      2019 年 MOSN在蚂蚁落地效果

      2019 年 MOSN 已经经过双 11 规模化验证,实现蚂蚁集团核心支付链路全覆盖,效果惊人。当然大家可能会有疑问,引入 Service Mesh 后比以前的链路多一条,会不会产生新的开销?答案是不一定。MOSN 在落地实现的过程中将 SDK 的业务逻辑复制到 MOSN,相当于从左手倒到右手,同时还进行了优化。事实上我们当时还发现有些业务引入 Service Mesh 之后,内存消耗更少。

      云原生演进

      前面我们了解了 MOSN 在蚂蚁集团数据面落地的情况,我们其实一直有一个小梦想——希望更多人使用 MOSN ,所以我们做了标准化云原生演进,打通周边的生态合作,下面详细展开。

      Could Native Arch

      如下图所示,在整个云原生架构中,最下层是基础设施(包含硬件、网络资源、机房等),上一层是基于硬件抽象出的 Kubernetes 进行容器资源的调度管理,再上面一层是 Service Mesh、Serverless ,Istio 在这一层发挥功能,而 MOSN 相当于是在 Istio 里扮演数据面的角色。

      Istio 简介

      任何一项技术都是伴随业务痛点诞生的,在介绍 Istio 之前我们也来看一下为什么 Istio 会出现。最早的时候都是物理机管理资源,之后由于微服务拆分出现了 Docker,但任何一项技术解决一个问题,肯定又会带来新的问题,当然新的问题会加速新技术出现,所以 Docker 之后诞生了 Kubernetes 。Kubernetes 完美解决了 Docker 的管理、调度、编排等问题,但也只管理了机器资源。作为写业务的人,我们也期望应用能够进行微服务治理,于是 Istio 应运而生了。

      Istio 具有服务互连 、 流量安全 、 流量控制 、 可观测性等功能,它的出现弥补了 Kubernetes 在服务治理上的短板,二者可以紧密合作,充分发挥其功能优势,从而实现微服务网格管理。

      MOSN with Istio

      经过 MOSN 社区近几个月的不断努力,MOSN 已经成功适配 Istio。7 月 28 日 Istio 官方发表了本人署名的文章《Istio 数据平面的另一个选择 —— MOSN》,说明 MOSN 是可以作为数据面被选择使用的,感兴趣可以点击查看 https://istio.io/latest/blog/2020/mosn-proxy。在 Service Mesh 领域,使用Istio 作为控制平面已成为主流,如下图所示可以看出在 Istio 的架构中,我们是将 MOSN 作为 Istio 的数据面,通过借助 Istio 实现服务治理。

      成为云原生标准 Sidecar 是我们为 MOSN 定的目标,为此我们成立了 Istio、MOSN、Dubbo 相关的 Working Group,让社区更多的开发工作人员参与进来。

      下图展示了 MOSN 适配 Istio 整个功能列表,值得一提的是相当多的功能都是外部开发者贡献的。

      目前 MOSN 已经适配了 Istio1.5.X 版本,可以引入其进行服务治理。不过使用前我们可以先了解下 Istio 中的 Virtual Service 是如何映射到 MOSN 的 router 配置项的。如下图所示,Istio 的 Virtual Service 基于请求 Header 路由,MOSN 通过 xDS 协议从 Istio 获取到对应的资源进行相关配置的转换,然后当 MOSN 真正的接收到业务请求后,对请求进行 Header 匹配,做对应的路由转发处理。

      在初步适配 Istio 之后,我们也进行了 Bookinfo 实例测试。如图是一个经典的多语言服务案例,早期没有 Service Mesh,需要用到 SDK 多语言来写,开发成本高、升级难度大。但当通过 Istio 做服务管理后,MOSN(图中棕色区域) 不仅可以做 Ingress Gateway,还可作为 Sidecar,有效解决此前技术痛点。

      事实上在通过 MOSN 作为 Istio 的数据平面运行 Bookinfo 实例后,目前已实现下列多项服务治理通用能力:

      • 按 version 路由能力

      • 按照权重路由能力

      • 按照特定 header 路由能力

      • 故障注入能力

      • 服务熔断自护能力

      • 透明劫持能力

      • 超时重试机制

      • etc

      大家如果感兴趣可以通过演示教程《MOSN withIstio》 https://www.katacoda.com/mosn/courses/scenarios/mosn-with-istio 进一步了解。

      开源生态建设

      在实现 MOSN 适配 Istio 后,我们并未拘泥于 Istio,而是和社区的很多项目进行沟通合作,例如 Dubbo、Sentinel、Skywalking。

      MOSN with Dubbo

      MOSN 可以解决 Kubernetes 体系和非 Kubernetes体系下的 Dubbo 服务治理难题。如图中所示,方案 1 中非 Kubernetes 体系服务治理场景中,可以引入 MOSN 集成 Dubbo-go 支持 pub/sub,复用原有的服务注册中心实现治理;方案 2 则是针对服务体系已 Kubernetes 化场景,通过支持 Dubbo 在 Istio下的路由,从而实现其服务治理。

      MOSN with Sentinel

      限流是服务治理中重要功能之一,而 Sentinel 是阿里巴巴开源的限流组件,经历过双十一大促考验,所以我们选择通过 MOSN 集成 Sentinel 复用其底层的限流能力,实现单机限流(令牌桶/漏桶结合)、服务熔断保护(服务成功率)、自适应限流(依据机器负载)等功能。下一步我们将丰富限流算法,结合 Istio 联手 UDPA 制定新规则。

      MOSN with Skywalking

      调用依赖以及服务与服务之的调用状态是微服务管理中一个重指标,MOSN 通过和 Skywalking 合作,集成 Skywalking 底层的 SDK,实现调用链路拓扑展示、QPS 监控、细粒度 RT 展示。未来,我们也会朝着 Dubbo Tracing 支持方向持续演进。

      标准化演进

      除了开源生态适配外,MOSN 也在尝试标准化。大家都知道「标准」和「规范」很重要,例如谷歌提议 UDPA 规范,在数据面之上的一层标准 API 解耦控制面和数据面通信;而微软则提出 ServiceMesh Interface,在控制面之上的一层标准 API 解耦控制面和上层应用/工具,这些规范的背后都是为了遵守“防止锁定,可方便用户灵活切换”原则。

      因此在 MOSN 在适配 Istio 以及 Dubbo、Skywalking 等组件后,我们认为不仅要适配别人,也要标准,这需要我们关注并积极参与开源社区建设。事实上在适配 Istio 的过程中,我们已经在和 Istio 官方沟通,既参与 Istio 的开发,也参与了 UDPA 讨论及标准制定。

      而在综合 MOSN 和 Istio 官方的讨论后,MOSN 社区主导并会参与 Istio 中数据面解耦的事情(比如测试集、镜像构建等),这样让 Istio 先变得更容易集成第三方的数据面,即 MOSN 社区的用户更方便的集成 Istio 使用。MOSN with Istio 适配的 Roadmap 中新增如下事项:

      • 推动 Istio 的镜像构建和数据面解耦

      • 推动 Istio 的测试框架和数据面解耦

      就第一个问题,我们向 Istio 社区贡献 PR,帮助 Istio 数据面和控制面的镜像构建实现解耦,使其更容易集成第三方的数据面。而在 7 月 14 号 Istio TOC(Istio 技术委员会)成员 @Shriram Rajagopalan 也回复我们“也是支持 Istio 中支持多数据面的方案,而且也建议先把 MOSN 做为实验性第三方数据平面纳入到 Istio 的官方博客中,方便用户来试用”,这说明 MOSN 已经充分得到 Istio 官方认可。

      在标准化演进过程中,我们和 Istio 官方商议,提出基于 UDPA 领域制定规范的建议:

      • 限流 Proto:限流 key 的定义、观察者模式、限流后的 Action 抽象;

      • 通用的 Router Proto:不局限于 HTTP 系、层级路由支持、路由条件的可扩展性增强;

      总结与展望

      MOSN 开源社区目前高速发展,**借力开源、反复开源贯穿始终,在实践的道路上一步步的标准化演进。**如图所示的 MOSN 开源框架中,MOSN 上层有 Fasthttp、Istio、UDPA,MOSN 在使用的同时对其进行新功能开发并回馈给它们。

      未来 MOSN 云原生演进会在以下四大领域展开:

      • 可编程: 面向业务层的 DSL,灵活、方便的控制请求的处理行为

      • 微服务运行时 OS:Dapr 模式,面向 MOSN 编程促使服务更轻、更小、启动更快

      • 被集成:符合 UDPA 规范,可被 Istio 、Kuma 集成通用工具链剥离,方便其他项目复用

      • 更多形态支持:Cache Mesh,Message Mesh,Block-chain Mesh

      以上是我今天的全部内容分享,更多 MOSN 信息和最新动态可以通过下列渠道了解:

      MOSN 官网 http://mosn.io

      MOSN Github http://github.com/mosn/mosn

      Service Mesh https://www.servicemesher.com

      展开全文
    2. MOSN是一款使用Go语言开发的网络代理软件,作为云原生网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN是Modular Open Smart Network-proxy的简称。MOSN可以与任何支持xDS API的Service...
    3. CNCF推出云原生网络功能(CNF)Testbed 开源计划验证了在Kubernetes上运行ONAP网络功能对电信运营商的好处 巴塞罗那,2019年2月25日 - 移动世界大会 - 支持Kubernetes®和Prometheus™等开源技术的的CNCF®(云...

      CNCF推出云原生网络功能(CNF)Testbed

      开源计划验证了在Kubernetes上运行ONAP网络功能对电信运营商的好处

      巴塞罗那,2019年2月25日 - 移动世界大会 - 支持Kubernetes®和Prometheus™等开源技术的的CNCF®(云原生计算基金会®)今天宣布与LF Networking(LFN)合作的开源云原生网络功能(CNF)Testbed。在巴塞罗那举行的移动世界大会上,CNCF正在演示相同的网络代码,在OpenStack上以虚拟网络功能(VNF)方式运行,以及在Kubernetes上以CNF方式运行,通过避免虚拟化开销来展示性能改进。

      “CNF正在成为未来的网络架构,其原因与容器和Kubernetes成为企业计算的标准平台的原因相同。”CNCF执行总监Dan Kohn说。“我们很高兴继续与LF Networking合作,为电信公司及其供应商提供一种在VNF和CNF之间进行可复制比较的方法。”

      CNF Testbed使组织能够可靠地测试ONAP或其自己的网络代码的网络功能,以VNF和CNF的方式,在相同底层硬件上比较运行在Kubernetes和OpenStack之间的性能和容错性。随着电信架构从VNF演变为CNF,其优势包括通过改进的打包节省成本,提高开发速度,以及单个CNF、机器甚至数据中心的故障恢复能力。

      ONAP作为LF Networking的一部分,为实时、政策驱动的物理和虚拟网络功能的编排和自动化提供了全面的平台。在去年宣布了ONAP现在是cncf.ci项目涵盖的一部分,CNCF运行该项目以在裸机上运行的K8集成、测试和部署CNCF和LF项目。CNF Testbed使用ONAP虚拟客户端设备(vCPE)用例中的几个开源VNF,并将代码重新打包为CNF容器。

      “很高兴看到ONAP和Kubernetes这两个增长最快的Linux基金会项目的协作,作为支持下一代架构的网络和云平台。”Linux基金会网络、边缘和物联网总经理Arpit Joshipura表示。“我们很高兴能够协助CNF Testbed展示行业从VNF转向CNF的道路。”

      CNF Testbed利用社区基础设施实验室(Community Infrastructure Lab),该实验室利用裸机托管公司Packet慷慨提供的信用额度。Testbed继续关注持续集成(CI)和可复制性,这些都是Kubernetes发展的标志。Kubernetes项目每个工作日运行超过10,000个CI工作,这是通过去年从Google向CNCF捐赠的900万美元谷歌云平台信用额度来实现。不需要信任CNF Testbed的初始结果,任何人都可以使用开源CNF Testbed存储库的副本和用于访问Packet的API密钥来复制结果。

      有兴趣了解更多关于CNF的组织,可以参与每月两次的BoF会议。详细信息在CNF Testbed仓库可以找到。


      KubeCon + CloudNativeCon和Open Source Summit大会日期:

      • 会议日程通告日期:2019 年 4 月 10 日
      • 会议活动举办日期:2019 年 6 月 24 至 26 日

      KubeCon + CloudNativeCon和Open Source Summit赞助方案
      KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请
      KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国

      展开全文
    4. 本文根据 SOFAChannel#13 直播分享整理,主题:云原生网络代理 MOSN 多协议机制解析,查看视频回顾,https://tech.antfi...

      本文根据 SOFAChannel#13 直播分享整理,主题:云原生网络代理 MOSN 多协议机制解析,查看视频回顾,https://tech.antfin.com/community/live/1131。

      作者:无钩,目前主要从事蚂蚁金服网络代理相关的研发工作,也是 MOSN 的 Committer。

      • MOSN 开源地址:https://github.com/mosn/mosn

      • MOSN 官网:https://mosn.io

      今天我要和大家分享的是《云原生网络代理 MOSN 多协议机制解析》,并介绍对应的私有协议快速接入实践案例以及对 MOSN 实现多协议低成本接入的设计进行解读。

      我们将按以下顺序进行介绍:

      • 多协议机制产生的背景与实践痛点;

      • 常见的协议扩展思路初探;

      • SOFABolt 协议接入实践;(重点)

      • MOSN 多协议机制设计解读;(重点)

      • 后续规划及展望;

      其中第三点「接入实践」是今天分享的重点,希望能给大家就「如何在 MOSN 中快速扩展私有协议接入」有一个具体的感受。另外「MOSN 如何实现多协议框架」也是很多人关心和问题,我们将摘选几个技术功能,对其背后的设计思考进行解读。

      MOSN 简介

      云原生网络代理 MOSN 定位是一个全栈的网络代理,支持包括网络接入层(Ingress)、API Gateway、Service Mesh 等场景,目前在蚂蚁金服内部的核心业务集群已经实现全面落地,并经受了 2019 年双十一大促的考验。今天要向大家介绍的是云原生网络代理 MOSN 核心特性之一的多协议扩展机制,目前已经支持了包括 SOFABolt、Dubbo、TARS 等多个协议的快速接入。

      MOSN:https://github.com/mosn/mosn

      多协议机制产生的背景与实践痛点

      首先介绍一下多协议机制产生的背景。

      前面提到,蚂蚁金服 2019 年双十一核心链路百分之百 Mesh 化,是业界当时已知的最大规模的 Service Mesh 落地,为什么我们敢这么做?因为我们具备能够让架构平滑迁移的方案。”兼容性”是任何架构演进升级都必然要面对的一个问题,这在早已实践微服务化架构的蚂蚁金服内部同样如此。为了实现架构的平滑迁移,需要让新老节点的外在行为尽可能的表现一致,从而让依赖方无感知,这其中很重要的一点就是保持协议兼容性。

      因此,我们需要在 Service Mesh 架构下,兼容现有微服务体系中的通信协议——也就是说需要在 MOSN 内实现对目前蚂蚁金服内部通信协议的扩展支持。

      基于 MOSN 本身的扩展机制,我们完成了最初版本的协议扩展接入。但是在实践过程中,我们发现这并不是一件容易的事情:

      • 相比编解码,协议自身的处理以及与框架集成才是其中最困难的环节,需要理解并实现包括请求生命周期、多路复用处理、链接池等等机制;

      • 社区主流的 xDS 路由配置是面向 HTTP 协议的,无法直接支持私有协议,存在适配成本;

      基于这些实践痛点,我们设计了 MOSN 多协议框架,希望可以降低私有协议的接入成本,加快普及 ServiceMesh 架构的落地推进。

      常见的协议扩展思路初探

      前面介绍了背景,那么具体协议扩展框架要怎么设计呢?我们先来看一下业界的思路与做法。

      协议扩展框架 - Envoy

      注:图片来自 Envoy 分享资料

      第一个要介绍的是目前发展势头强劲的 Envoy。从图上可以看出,Envoy 支持四层的读写过滤器扩展、基于 HTTP 的七层读写过滤器扩展以及对应的 Router/Upstream 实现。如果想要基于 Envoy 的扩展框架实现 L7 协议接入,目前的普遍做法是基于 L4 filter 封装相应的 L7 codec,在此基础之上再实现对应的协议路由等能力,无法复用 HTTP L7 的扩展框架。

      协议扩展框架 - Nginx

      第二个则是老牌的反向代理软件 Nginx,其核心模块是基于 Epoll/Kqueue 等 I/O 多路复用技术之上的离散事件框架,基于事件框架之上构建了 Mail、Http 等协议模块。与 Envoy 类似,如果要基于 Nginx 扩展私有协议,那么也需要自行对接事件框架,并完整实现包括编解码、协议处理等能力。

      协议扩展框架 - MOSN

      最后回过头来,我们看一下 MOSN 是怎么做的。实际上,MOSN 的底层机制与 Envoy、Nginx 并没有核心差异,同样支持基于 I/O 多路复用的 L4 读写过滤器扩展,并在此基础之上再封装 L7 的处理。但是与前两者不同的是,MOSN 针对典型的微服务通信场景,抽象出了一套适用于基于多路复用 RPC 协议的扩展框架,屏蔽了 MOSN 内部复杂的协议处理及框架流程,开发者只需要关注协议本身,并实现对应的框架接口能力即可实现快速接入扩展。

      三种框架成本对比

      最后对比一下,典型微服务通信框架协议接入的成本,由于 MOSN 针对此类场景进行了框架层面的封装支持,因此可以节省开发者大量的研发成本。

      SOFABolt 协议接入实践

      初步了解多协议框架的设计思路之后,让我们以 SOFABolt 协议为例来实际体验一下协议接入的过程。

      SOFABolt 简介

      这里先对 SOFABolt 进行一个简单介绍,SOFABolt 是一个开源的轻量、易用、高性能、易扩展的 RPC 通信框架,广泛应用于蚂蚁金服内部。

      SOFABolt:https://github.com/sofastack/sofa-bolt

      基于 MOSN 的多协议框架,实际编写了 7 个代码文件,一共 925 行代码(包括 liscence、comment 在内)就完成了接入。如果对于协议本身较为熟悉,且具备一定的 MOSN/Golang 开发经验,甚至可以在一天内就完成整个协议的扩展,可以说接入成本是非常之低。

      Github: https://github.com/mosn/mosn/tree/master/pkg/protocol/xprotocol/bolt

      下面让我们进入正题,一步一步了解接入过程。

      Step1:确认协议格式

      第一步,需要确认要接入的协议格式。为什么首先要做这个,因为协议格式是一个协议最基本的部分,有以下两个层面的考虑:

      • 任何协议特性以及协议功能都能在上面得到一些体现,例如有无 requestId/streamId 就直接关联到协议是否支持连接多路复用;

      • 协议格式与报文模型直接相关,两者可以构成逻辑上的映射关系;而这个映射关系也就是所谓的编解码逻辑;

      以 SOFABolt 为例,其第一个字节是协议 magic,可以用于校验当前报文是否属于 SOFABolt 协议,并可以用于协议自动识别匹配的场景;第二个字节是 type,用于标识当前报文的传输类型,可以是 Request / RequestOneway / Response 中的一种;第三个字节则是当前报文的业务类型,可以是心跳帧,RPC 请求/响应等类型。后面的字段就不一一介绍了,可以发现,理解了协议格式本身,其实对于协议的特性支持和模型编解码就理解了一大半,因此第一步协议格式的确认了解是重中之重,是后续一切工作开展的前提。

      Step2:确认报文模型

      顺应第一步,第二步的主要工作是确认报文编程模型。一般地,在第一步完成之后,应当可以很顺利的构建出相应的报文模型,SOFABolt 例子中可以看出,模型字段设计基本与协议格式中的 header / payload 两部分相对应。有了编程模型之后,就可以继续进行下一步——基于模型实现对应的框架扩展了。

      Step3:接口实现 - 协议

      协议扩展,顾名思义,是指协议层面的扩展,描述的是协议自身的行为(区别于报文自身)。

      目前多协议框架提供的接口包括以下五个:

      • Name:协议名称,需要具备唯一性;

      • Encoder:编码器,用于实现从报文模型到协议传输字节流的映射转换;

      • Decoder:解码器,用于实现从协议传输字节流到报文模型的映射转换;

      • Heartbeater:心跳处理,用于实现心跳保活报文的构造,包括探测发起与回复两个场景;

      • Hijacker:错误劫持,用于在特定错误场景下错误报文的构造;

      Step4:接口实现 - 报文

      前面介绍了协议扩展,接下里则是报文扩展,这里关注的是单个请求报文需要实现的行为。

      目前框架抽象的接口包括以下几个:

      • Basic:需要提供 GetStreamType、GetHeader、GetBody 几个基础方法,分别对应传输类型、头部信息、载荷信息;

      • Multiplexing:多路复用能力,需要实现 GetRequestId 及 SetRequestId;

      • HeartbeatPredicate:用于判断当前报文是否为心跳帧;

      • GoAwayPredicate:用于判断当前报文是否为优雅退出帧;

      • ServiceAware:用于从报文中获取 service、method 等服务信息;

      举个例子

      这里举一个例子,来让大家对框架如何基于接口封装处理流程有一个体感:服务端心跳处理场景。当框架收到一个报文之后:

      • 根据报文扩展中的 GetStreamType 来确定当前报文是请求还是响应。如果是请求则继续 2;

      • 根据报文扩展中的 HeartbeatPredicate 来判断当前报文是否为心跳包,如果是则继续 3;

      • 当前报文是心跳探测(request + heartbeat),需要回复心跳响应,此时根据协议扩展中的 Heartbeater.Reply 方法构造对应的心跳响应报文;

      • 再根据协议扩展的 Encoder 实现,将心跳响应报文转换为传输字节流;

      • 最后调用 MOSN 网络层接口,将传输字节流回复给发起心跳探测的客户端;

      当协议扩展与报文扩展都实现之后,MOSN 协议扩展接入也就完成了,框架可以依据协议扩展的实现来完成协议的处理,让我们实际演示一下 SOFABolt 接入的 example。

      Demo 地址:https://github.com/mosn/mosn/tree/master/examples/codes/sofarpc-with-xprotocol-sample

      MOSN 多协议机制设计解读

      通过 SOFABolt 协议接入的实践过程,大家对如何基于 MOSN 来做协议扩展应该有了一个初步的认知。那么 MOSN 多协议机制究竟封装了哪些逻辑,背后又是如何思考设计的?接下来将会挑选几个典型技术案例为大家进行解读。

      协议扩展框架

      协议扩展框架 - 编解码

      最先介绍的是编解码机制,这个在前面 SOFABolt 接入实践中已经简单介绍过,MOSN 定义了编码器及解码器接口来屏蔽不同协议的编解码细节。协议接入时只需要实现编解码接口,而不用关心相应的接口调用上下文。

      协议扩展框架 - 多路复用

      接下来是多路复用机制的解读,这也是流程中相对不太好理解的一部分。首先明确一下链接多路复用的定义:允许在单条链接上,并发处理多个请求/响应。那么支持多路复用有什么好处呢?

      以 HTTP 协议演进为例,HTTP/1 虽然可以维持长连接,但是单条链接同一时间只能处理一个请求/相应,这意味着如果同时收到了 4 个请求,那么需要建立四条 TCP 链接,而建链的成本相对来说比较高昂;HTTP/2 引入了 stream/frame 的概念,支持了分帧多路复用能力,在逻辑上可以区分出成对的请求 stream 和响应 stream,从而可以在单条链接上并发处理多个请求/响应,解决了 HTTP/1 链接数与并发数成正比的问题。

      类似的,典型的微服务框架通信协议,如 Dubbo、SOFABolt 等一般也都实现了链接多路复用能力,因此 MOSN 封装了相应的多路复用处理流程,来简化协议接入的成本。让我们跟随一个请求代理的过程,来进一步了解。

      1. MOSN 从 downstream(conn=2) 接收了一个请求 request,依据报文扩展多路复用接口 GetRequestId 获取到请求在这条连接上的身份标识(requestId=1),并记录到关联映射中待用;

      2. 请求经过 MOSN 的路由、负载均衡处理,选择了一个 upstream(conn=5),同时在这条链接上新建了一个请求流(requestId=30),并调用文扩展多路复用接口 SetRequestId 封装新的身份标识,并记录到关联映射中与 downstream 信息组合;

      3. MOSN 从 upstream(conn=5) 接收了一个响应 response,依据报文扩展多路复用接口 GetRequestId 获取到请求在这条连接上的身份标识(requestId=30)。此时可以从上下游关联映射表中,根据 upstream 信息(connId=5, requestId=30) 找到对应的 downstream 信息(connId=2, requestId=1);

      4. 依据 downstream request 的信息,调用文扩展多路复用接口 SetRequestId 设置响应的 requestId,并回复给 downstream;

      在整个过程中,框架流程依赖的报文扩展 Multiplexing 接口提供的能力,实现了上下游请求的多路复用关联处理,除此之外,框架还封装了很多细节的处理,例如上下游复用内存块合并处理等等,此处限于篇幅不再展开,有兴趣的同学可以参考源码进行阅读。

      统一路由框架

      接下来要分析的是「统一路由框架」的设计,此方案主要解决的是非 HTTP 协议的路由适配问题。我们选取了以下三点进行具体分析:

      • 通过基于属性匹配(attribute-based)的模式,与具体协议字段解耦;

      • 引入层级路由的概念,解决属性扁平化后带来的线性匹配性能问题;

      • 通过变量机制懒加载的特定,按需实现深/浅解包;

      统一路由框架 – 基于属性匹配

      首先来看一下典型的 RDS 配置,可以看到其中的 domains、path 等字段,对应的是 HTTP 协议里的域名、路径概念,这就意味着其匹配条件只有 HTTP 协议才有字段能够满足,配置结构设计是与 HTTP 协议强相关的。这就导致了如果我们新增了一个私有协议,无法复用 RDS 的配置来做路由。

      那么如何解决配置模型与协议字段强耦合呢?简单来说就是把匹配字段拆分为扁平属性的键值对(key-value pair),匹配策略基于键值对来处理,从而解除了匹配模型与协议字段的强耦合,例如可以配置 key: $http_host,也可以配置 key:$dubbo_service,这在配置模型层面都是合法的。

      但是这并不是说匹配就有具体协议无关了,这个关联仍然是存在的,只是从强耦合转换为了隐式关联,例如配置 key: $http_host,从结构来说其与 HTTP 协议并无耦合,但是值变量仍然会通过 HTTP 协议字段来进行求值。

      统一路由框架 - 层级路由

      在引入「基于属性的匹配」之后,我们发现了一个问题,那就是由于属性本身的扁平化,其内在并不包含层级关系。如果没有层级关系,会导致匹配时需要遍历所有可能的情况组合,大量条件的场景下匹配性能近似于线性的 O(n),这显然是无法接受的。

      举例来说,对于 HTTP 协议,我们总是习惯与以下的匹配步骤:

      • 匹配 Host(:authority) ;

      • 匹配 Path ;

      • 匹配 headers/args/cookies ;

      这其实构成了一个层级关系,每一层就像是一个索引,通过层级的索引关系,在大量匹配条件的情况下仍然可以获得一个可接受的耗时成本。但是对于属性(attribute),多个属性之间并没有天然的层级关系(相比于 host、path 这种字段),这依赖于属性背后所隐式关联的字段,例如对于 Dubbo 协议,我们希望的顺序可能是:

      • 匹配 $dubbo_service

      • 匹配 $dubbo_group

      • 匹配 $dubbo_version

      • 匹配 $dubbo_attachments_xx

      因此在配置模型上,我们引入了对应的索引层级概念,用于适配不同协议的结构化层级路由,解决扁平属性的线性匹配性能问题。

      统一路由框架 - 浅解包优化

      最后,介绍一下浅解包优化的机制。利用 MOSN 变量懒加载的特性,我们可以在报文解析时,先不去解析成本较高的部分,例如 dubbo 协议的 attachments。那么在代理请求的实际过程中,需要使用到 attachments 里的信息时,就会通过变量的 getter 求值逻辑来进行真正的解包操作。依靠此特性,可以大幅优化在不需要深解包的场景下 dubbo 协议代理转发的性能表现,实现按需解包。

      解读总结

      最后,对设计部分的几个技术案例简单总结一下,整体的思路仍然是对处理流程进行抽象封装,并剥离可扩展点,从而降低用户的接入成本。

      在协议扩展支持方面:

      • 封装编解码流程,抽象编解码能力接口作为协议扩展点

      • 封装协议处理流程,抽象多路复用、心跳保活、优雅退出等能力接口作为协议扩展点

      在路由框架方面:

      • 通过改为基于属性匹配的机制,与具体协议字段解耦,支持多协议适配;

      • 引入层级路由机制,解决属性扁平化的匹配性能问题;

      • 利用变量机制懒加载特性,按需实现深/浅解包;

      后续规划及展望

      更多流模式支持、更多协议接入

      当前 MOSN 多协议机制,已经可以比较好的支持像 Dubbo、SOFABolt 这样基于多路复用流模型的微服务协议,后续会继续扩展支持的类型及协议,例如经典的 PING-PONG 协议、Streaming 流式协议,也欢迎大家一起参与社区建设,贡献你的 PR。

      社区标准方案推进

      与此同时,我们注意到 Istio 社区其实也有类似的需求,希望设计一套协议无关的路由机制——”Istio Meta Routing API”。其核心思路与 MOSN 的多协议路由框架基本一致,即通过基于属性的路由来替代基于协议字段的路由。目前该草案还处于一个比较初级的阶段,对于匹配性能、字段扩展方面还没有比较完善的设计说明,后续 MOSN 团队会积极参与社区方案的讨论,进一步推动社区标准方案的落地。

      以上就是本期分享的全部内容,如果大家对 MOSN 有问题以及建议,欢迎加入 MOSN 社区与我们交流。

       推荐阅读 

      点击 阅读原文 查看更多

      展开全文
    5. 使用FD.io/VPP进行云原生网络连接Frank BrocknersCisco首席技术与架构办公室架构师 视频首先为我们介绍了当今微服务和容器带来的诸多改变,随...
    6. 今天为大家分享的是云原生网络代理 MOSN 的扩展机制,希望通过这次分享以后,能让大家了解 MOSN 的可编程扩展能力,可以基于 MOSN 的扩展能力,按照自己实际的业务需求进行二次开发。 将从以下几个方面,对 MOSN 的...
    7. 今天要和大家分享的是《云原生网络代理 MOSN 多协议机制解析》, 并介绍对应的私有协议快速接入实践案例以及对 MOSN 实现多协议低成本接入的设计进行解读。 将按以下顺序进行介绍: 多协议机制产生的背景与实践痛点...
    8. 英特尔宣布将为互联网服务领导厂商日本乐天市场(Rakuten)提供技术支持,用于建设一种新的云原生网络。该网络将从无线接入网(RAN)到核心网完全实现虚拟化,并将在发布时...
    9. MOSN 是一款使用 Go 语言开发的网络代理软件,作为云原生网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN 是 Modular Open Smart N...
    10. 导读:本文是 8 月 15 号在深圳 GIAC 全球互联网架构大会,云原生专场的现场分享实录。王发康(毅松)蚂蚁集团可信原生技术部 技术专家,专注于高性能网络服务器研发,是 MOSN、T...
    11. Cilium 创始人兼CTO Thomas Graf 近日撰文《How Alibaba ...近期,阿里团队在SIG Cloud-Provider-Alibaba的会议上介绍了阿里容器服务的新的高性能容器网络方案并且发布了一篇博客介绍。你知道吗,这个方案基于.
    12. MOSN 是一款使用 Go 语言开发的网络代理软件,作为云原生网络数据平面,旨在为服务提供多协议、模块化、智能化、安全的代理能力。MOSN 是 Modular Open Smart N...
    13. MOSN 是一款使用 Go 语言开发的网络代理软件,作为云原生网络数据平面,旨在为服务提供多协议,模块化,智能化,安全的代理能力。MOSN 是 Modular Open Smart N...
    14. 2月14日,英特尔宣布将为互联网服务领导厂商日本乐天市场(Rakuten)提供技术支持,用于建设一种新的云原生网络。该网络将从无线接入网(RAN)到核心网完全实现虚拟化,并将在发布时采用创新的5G系统架构。该网络的重要...
    15. 凌云时刻 · 技术 导读:... Cloud Native Infrastructures Meetup 精彩回顾 趣头条 Spark Remote Shuffle Service 最佳实践 ECS 助手,实现上运维自动化 长按扫描二维码关注凌云时刻 每日收获前沿技术与科技洞见

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 1,071
    精华内容 428
    热门标签
    关键字:

    云原生网络