Dubbo3.0新特性

news2024/11/25 6:32:04

服务注册模型

注册模型从接口级别服务注册改为 应用级别服务之策

应用级服务发现简介

概括来说,Dubbo3 引入的应用级服务发现主要有以下优势

  • 适配云原生微服务变革。云原生时代的基础设施能力不断向上释放,像 Kubernetes 等平台都集成了微服务概念抽象,Dubbo3 的应用级服务发现是适配各种微服务体系的通用模型。
  • 提升性能与可伸缩性。支持超大规模集群的服务治理一直以来都是 Dubbo 的优势,通过引入应用级服务发现模型,从本质上解决了注册中心地址数据的存储与推送压力,相应的 Consumer 侧的地址计算压力也成数量级下降;集群规模也开始变得可预测、可评估(与 RPC 接口数量无关,只与实例部署规模相关)。

下图是 Dubbo2 的服务发现模型:Provider 注册服务地址,Consumer 经过注册中心协调并发现服务地址,进而对地址发起通信,这是被绝大多数微服务框架的经典服务发现流程。而 Dubbo2 的特殊之处在于,它把 “RPC 接口”的信息也融合在了地址发现过程中,而这部分信息往往是和具体的业务定义密切相关的。

img

而在接入云原生基础设施后,基础设施融入了微服务概念的抽象,容器化微服务被编排、调度的过程即完成了在基础设施层面的注册。如下图所示,基础设施既承担了注册中心的职责,又完成了服务注册的动作,而 “RPC 接口”这部分信息,由于与具体的业务相关,不可能也不适合被基础设施托管。

img

在这样的场景下,对 Dubbo3 的服务注册发现机制提出了两个要求: Dubbo3 需要在原有服务发现流程中抽象出通用的、与业务逻辑无关的地址映射模型,并确保这部分模型足够合理,以支持将地址的注册行为和存储委托给下层基础设施 Dubbo3 特有的业务接口同步机制,是 Dubbo3 需要保留的优势,需要在 Dubbo3 中定义的新地址模型之上,通过框架内的自有机制予以解决。

这样设计的全新的服务发现模型,在架构兼容性、可伸缩性上都给 Dubbo3 带来了更大的优势。

img

在架构兼容性上,如上文所述,Dubbo3 复用下层基础设施的服务抽象能力成为了可能;另一方面,如 Spring Cloud 等业界其它微服务解决方案也沿用这种模型, 在打通了地址发现之后,使得用户探索用 Dubbo 连接异构的微服务体系成为了一种可能。

Dubbo3 服务发现模型更适合构建可伸缩的服务体系,这点要如何理解?

这里先举个简单的例子,来直观的对比 Dubbo2 与 Dubbo3 在地址发现流程上的数据流量变化:假设一个微服务应用定义了 100 个接口(Dubbo 中的服务), 则需要往注册中心中注册 100 个服务,如果这个应用被部署在了 100 台机器上,那这 100 个服务总共会产生 100 * 100 = 10000 个虚拟节点;而同样的应用, 对于 Dubbo3 来说,新的注册发现模型只需要 1 个服务(只和应用有关和接口无关), 只注册和机器实例数相等的 1 * 100 = 100 个虚拟节点到注册中心。 在这个简单的示例中,Dubbo 所注册的地址数量下降到了原来的 1 / 100,对于注册中心、订阅方的存储压力都是一个极大的释放。更重要的是, 地址发现容量彻底与业务 RPC 定义解耦开来,整个集群的容量评估对运维来说将变得更加透明:部署多少台机器就会有多大负载,不会像 Dubbo2 一样, 因为业务 RPC 重构就会影响到整个集群服务发现的稳定性。

Triple 协议

协议说明

Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。相比于原有 Dubbo2 协议,Triple 有以下优势:

  1. 原生和 gRPC 协议互通。打通 gRPC 生态,降低从 gRPC 至 Dubbo 的迁移成本。
  2. 增强多语言生态。避免因 CPP/C#/RUST 等语言的 Dubbo SDK 能力不足导致业务难以选型适配的问题。
  3. 网关友好。网关无需参与序列化,方便用户从传统的 HTTP 转泛化 Dubbo 调用网关升级至开源或云厂商的 Ingress 方案。
  4. 完善的异步和流式支持。带来从底层协议到上层业务的性能提升,易于构建全链路异步以及严格保证消息顺序的流式服务。

Dubbo2 协议现状

众所周知,Dubbo 协议是直接定义在 TCP 传输层协议之上,由于 TCP 高可靠全双工的特点,为 Dubbo 协议的定义提供了最大的灵活性,但同时也正是因为这样的灵活性,RPC 协议普遍都是定制化的私有协议,Dubbo 同样也面临这个问题。在这里我们着重讲一下 Dubbo 在协议通用性方面值得改进的地方,关于协议详细解析请参见官网博客

Dubbo 协议体 Body 中有一个可扩展的 attachments 部分,这给 RPC 方法之外额外传递附加属性提供了可能,是一个很好的设计。但是类似的 Header 部分,却缺少类似的可扩展 attachments,这点可参考 HTTP 定义的 Ascii Header 设计,将 Body Attachments 和 Header Attachments 做职责划分。 Body 协议体中的一些 RPC 请求定位符如 Service Name、Method Name、Version 等,可以提到 Header 中,和具体的序列化协议解耦,以更好的被网络基础设施识别或用于流量管控。 扩展性不够好,欠缺协议升级方面的设计,如 Header 头中没有预留的状态标识位,或者像 HTTP 有专为协议升级或协商设计的特殊 packet。 在 Java 版本的代码实现上,不够精简和通用。如在链路传输中,存在一些语言绑定的内容;消息体中存在冗余内容,如 Service Name 在 Body 和 Attachments 中都存在。

RPC 协议的选择

协议是 RPC 的核心,它规范了数据在网络中的传输内容和格式。除必须的请求、响应数据外,通常还会包含额外控制数据,如单次请求的序列化方式、超时时间、压缩方式和鉴权信息等。

协议的内容包含三部分

  • 数据交换格式: 定义 RPC 的请求和响应对象在网络传输中的字节流内容,也叫作序列化方式
  • 协议结构: 定义包含字段列表和各字段语义以及不同字段的排列方式
  • 协议通过定义规则、格式和语义来约定数据如何在网络间传输。一次成功的 RPC 需要通信的两端都能够按照协议约定进行网络字节流的读写和对象转换。如果两端对使用的协议不能达成一致,就会出现鸡同鸭讲,无法满足远程通信的需求。

RPC 协议的设计需要考虑以下内容:

  • 通用性: 统一的二进制格式,跨语言、跨平台、多传输层协议支持
  • 扩展性: 协议增加字段、升级、支持用户扩展和附加业务元数据
  • 性能:As fast as it can be
  • 穿透性:能够被各种终端设备识别和转发:网关、代理服务器等 通用性和高性能通常无法同时达到,需要协议设计者进行一定的取舍。

HTTP/1.1

比于直接构建于 TCP 传输层的私有 RPC 协议,构建于 HTTP 之上的远程调用解决方案会有更好的通用性,如WebServices 或 REST 架构,使用 HTTP + JSON 可以说是一个事实标准的解决方案。

选择构建在 HTTP 之上,有两个最大的优势:

  • HTTP 的语义和可扩展性能很好的满足 RPC 调用需求。
  • 通用性,HTTP 协议几乎被网络上的所有设备所支持,具有很好的协议穿透性。

但也存在比较明显的问题:

  • 典型的 Request – Response 模型,一个链路上一次只能有一个等待的 Request 请求。会产生 HOL。
  • Human Readable Headers,使用更通用、更易于人类阅读的头部传输格式,但性能相当差
  • 无直接 Server Push 支持,需要使用 Polling Long-Polling 等变通模式

gRPC

上面提到了在 HTTP 及 TCP 协议之上构建 RPC 协议各自的优缺点,相比于 Dubbo 构建于 TCP 传输层之上,Google 选择将 gRPC 直接定义在 HTTP/2 协议之上。 gRPC 的优势由HTTP2 和 Protobuf 继承而来。

  • 基于 HTTP2 的协议足够简单,用户学习成本低,天然有 server push/ 多路复用 / 流量控制能力
  • 基于 Protobuf 的多语言跨平台二进制兼容能力,提供强大的统一跨语言能力
  • 基于协议本身的生态比较丰富,k8s/etcd 等组件的天然支持协议,云原生的事实协议标准

但是也存在部分问题

  • 对服务治理的支持比较基础,更偏向于基础的 RPC 功能,协议层缺少必要的统一定义,对于用户而言直接用起来并不容易。
  • 强绑定 protobuf 的序列化方式,需要较高的学习成本和改造成本,对于现有的偏单语言的用户而言,迁移成本不可忽视

Proposal

最终 Dubbo3 选择了兼容 gRPC ,以 HTTP2 作为传输层构建新的协议,也就是 Triple。

容器化应用程序和微服务的兴起促进了针对负载内容优化技术的发展。 客户端中使用的传统通信协议( RESTFUL或其他基于 HTTP 的自定义协议)难以满足应用在性能、可维护性、扩展性、安全性等方便的需求。一个跨语言、模块化的协议会逐渐成为新的应用开发协议标准。自从 2017 年 gRPC 协议成为 CNCF 的项目后,包括 k8s、etcd 等越来越多的基础设施和业务都开始使用 gRPC 的生态,作为云原生的微服务化框架, Dubbo 的新协议也完美兼容了 gRPC。并且,对于 gRPC 协议中一些不完善的部分, Triple 也将进行增强和补充。

那么,Triple 协议是否解决了上面我们提到的一系列问题呢?

  • 性能上: Triple 协议采取了 metadata 和 payload 分离的策略,这样就可以避免中间设备,如网关进行 payload 的解析和反序列化,从而降低响应时间。
  • 路由支持上,由于 metadata 支持用户添加自定义 header ,用户可以根据 header 更方便的划分集群或者进行路由,这样发布的时候切流灰度或容灾都有了更高的灵活性。
  • 安全性上,支持双向TLS认证(mTLS)等加密传输能力。
  • 易用性上,Triple 除了支持原生 gRPC 所推荐的 Protobuf 序列化外,使用通用的方式支持了 Hessian / JSON 等其他序列化,能让用户更方便的升级到 Triple 协议。对原有的 Dubbo 服务而言,修改或增加 Triple 协议 只需要在声明服务的代码块添加一行协议配置即可,改造成本几乎为 0。

Triple 协议定义

现状

1、完整兼容grpc、客户端/服务端可以与原生grpc客户端打通

2、目前已经经过大规模生产实践验证,达到生产级别

  • 特点与优势

1、具备跨语言互通的能力,传统的多语言多 SDK 模式和 Mesh 化跨语言模式都需要一种更通用易扩展的数据传输格式。

2、提供更完善的请求模型,除了 Request/Response 模型,还应该支持 Streaming 和 Bidirectional。

3、易扩展、穿透性高,包括但不限于 Tracing / Monitoring 等支持,也应该能被各层设备识别,网关设施等可以识别数据报文,对 Service Mesh 部署友好,降低用户理解难度。

4、多种序列化方式支持、平滑升级

5、支持 Java 用户无感知升级,不需要定义繁琐的 IDL 文件,仅需要简单的修改协议名便可以轻松升级到 Triple 协议

Triple 协议内容介绍

基于 grpc 协议进行进一步扩展

  • Service-Version → “tri-service-version” {Dubbo service version}
  • Service-Group → “tri-service-group” {Dubbo service group}
  • Tracing-ID → “tri-trace-traceid” {tracing id}
  • Tracing-RPC-ID → “tri-trace-rpcid” {_span id _}
  • Cluster-Info → “tri-unit-info” {cluster infomation}

其中 Service-Version 跟 Service-Group 分别标识了 Dubbo 服务的 version 跟 group 信息,因为grpc的 path 申明了 service name 跟 method name,相比于 Dubbo 协议,缺少了version 跟 group 信息;Tracing-ID、Tracing-RPC-ID 用于全链路追踪能力,分别表示 tracing id 跟 span id 信息;Cluster-Info 表示集群信息,可以使用其构建一些如集群划分等路由相关的灵活的服务治理能力。

Triple Streaming

Triple协议相比传统的unary方式,多了目前提供的Streaming RPC的能力

  • Streaming 用于什么场景呢?

在一些大文件传输、直播等应用场景中, consumer或provider需要跟对端进行大量数据的传输,由于这些情况下的数据量是非常大的,因此是没有办法可以在一个RPC的数据包中进行传输,因此对于这些数据包我们需要对数据包进行分片之后,通过多次RPC调用进行传输,如果我们对这些已经拆分了的RPC数据包进行并行传输,那么到对端后相关的数据包是无序的,需要对接收到的数据进行排序拼接,相关的逻辑会非常复杂。但如果我们对拆分了的RPC数据包进行串行传输,那么对应的网络传输RTT与数据处理的时延会是非常大的。

为了解决以上的问题,并且为了大量数据的传输以流水线方式在consumer与provider之间传输,因此Streaming RPC的模型应运而生。

通过Triple协议的Streaming RPC方式,会在consumer跟provider之间建立多条用户态的长连接,Stream。同一个TCP连接之上能同时存在多个Stream,其中每条Stream都有StreamId进行标识,对于一条Stream上的数据包会以顺序方式读写。

总结

在API领域,最重要的趋势是标准化技术的崛起。Triple 协议是 Dubbo3 推出的主力协议。它采用分层设计,其数据交换格式基于Protobuf (Protocol Buffers) 协议开发,具备优秀的序列化/反序列化效率,当然还支持多种序列化方式,也支持众多开发语言。在传输层协议,Triple 选择了 HTTP/2,相较于 HTTP/1.1,其传输效率有了很大提升。此外HTTP/2作为一个成熟的开放标准,具备丰富的安全、流控等能力,同时拥有良好的互操作性。Triple 不仅可以用于Server端服务调用,也可以支持浏览器、移动App和IoT设备与后端服务的交互,同时 Triple协议无缝支持 Dubbo3 的全部服务治理能力。

在Cloud Native的潮流下,跨平台、跨厂商、跨环境的系统间互操作性的需求必然会催生基于开放标准的RPC技术,而gRPC顺应了历史趋势,得到了越来越广泛地应用。在微服务领域,Triple协议的提出与落地,是 Dubbo3 迈向云原生微服务的一大步。

域模型

ScopeModle

增加域模型是为了:

  1. 让Dubbo支持多应用的部署,这块一些大企业有诉求
  2. 从架构设计上,解决静态属性资源共享、清理的问题
  3. 分层模型将应用的管理和服务的管理分开

服务部署和使用更细分化
后续会持续更新新特性

都看到这个,点个赞呗


参考链接地址

https://dubbo.apache.org/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于各种PLMN的选择

RAT:Radio Access Technology RPLMN:Registered PLMN 终端在上次关机或脱网前登记上的PLMN,会临时保存在USIM卡上 HPLMN: Home PLMN 用户USIM对应IMSI的PLMN EHPLMN:EquivalentHome PLMN,HPLMN对应的运营商可能会有不同的号段,例如中国移动有…

【软考】-- 操作系统(中)

操作系统(中):第三节 存储管理🎀一、存储管理的基本概念1️⃣存储管理2️⃣存储方式分类:3️⃣相对地址4️⃣相对地址空间通过地址再定位机构转换到绝对地址空间(物理地址空间)🎁二、存储方式&a…

WFST--学习笔记

(Weighted Finite-State Transducer):加权有限状态转换机,由有限状态接收机(FSA)拓展而来,在ASR领域常被称为“解码器”。是一个包含了声学模型(H)、上下文相关处理的FST(context-dependency transducer, C…

手画图解 | 关于死锁,面试的一切都在这里了

什么是死锁(Deadlock) 死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,它们都将无法推进下去。 产生死锁的四个必要条件得烂熟于心: 互斥条件:进程要求对…

艾美捷QuickTiter 逆转录病毒定量试剂盒测定原理

逆转录病毒基因转移是一种有效地将稳定的、可遗传的遗传物质导入大肠杆菌的技术任何分裂细胞类型的基因组。不能复制的逆转录病毒通常通过将逆转录病毒载体转染到包装细胞系中。逆转录病毒根据用于进入宿主细胞的受体。亲嗜性病毒可以识别仅在小鼠身上发现的受体和大鼠细胞。兼…

【信息融合】基于matlab BP神经网络和DS证据理论不确定性信息融合问题【含Matlab源码 2204期】

⛄一、 D-S证据理论及解释 证据理论由Dempster在1967年最初提出,并由他的学生Shafer改进推广使之成为符合有限离散领域中推理的形式,因此称为D-S理论。证据理论讨论一个“辨识框架”(Frame of Discernment)Θ,它是关于命题的相互独立的可能答案或假设的一个有限集合。按传统方…

Qml中的那些坑(三)---MouseArea上的ListView滚轮事件穿透

【写在前面】 最近在 Qml 中使用 MouseArea 时发现了一个奇怪的现象: 位于 MouseArea 上的 ListView 在处理了滚轮事件的情况下进行滚轮,下面的 MouseArea 却在某些情况下接收到了这个事件。 按照直觉,ListView 明明有内部的滚轮事件处理&…

Cesium中的DataSource和Entity关系

本章主要探讨一下Cesium中的DataSource和Entity。 介绍 首先简单说一下Entity与Primitive。 Cesium为开发者提供了丰富的图形绘制和空间数据管理的API,可以分为两类,一类是面向图形开发人员的低层次API,通常被称为Primitive API&#xff0…

Java基础知识点整理

一、Java概述 1、何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机&#xff…

助力工业物联网,工业大数据项目介绍及环境构建【一】

文章目录工业大数据项目介绍及环境构建01:专栏目标02:项目背景03:项目需求04:业务流程05:技术选型06:Docker的介绍07:Docker的网络08:Docker的使用09:Oracle的介绍10&…

关于SQL的返回行数top

第一节.知识点三:关键字wlth tles 我要讲的是关于SQL的3个限制返回行数top: 1.使用具有恒定值的top; 2.关键字percent(%)返回行的百分比; 3.理解关键字wlth tles 上一次已经讲了前两个了,现在我要讲的是第三个 3.理解关键字wlth t…

【计算机毕业设计】69.助残志愿者系统源码

一、系统截图(需要演示视频可以私聊) 摘 要 本课题要求实现一套助残助残志愿者系统设计与开发,系统主要包括系统用户信息、志愿者信息、服务项目、志愿项目,志愿者培训、志愿项目、公益活动等功能模块。 基于上述分析&#xff0…

助力教育信创快速发展,统信软件与山东四所高校建立信创应用重点实验室

国家在“十三五”、“十四五”规划中重点强调了信息安全在国家战略中的重要地位,而大力发展教育信创有助于我国信息安全的快速落地。同时,教育部等六部门印发《关于推进教育新型基础设施建设构建高质量教育支撑体系的指导意见》也提到:推广可…

E+H浊度仪维修CUE22-A1A浊度分析仪维修概述

CUE21/22浊度仪参数如下: 测量参数:浊度 测量原理:散射光原理 应用场合:饮用水;生产用水 处理后的过程水 测量范围:0…100NTU;0…1000NTU 信号输出:4 ... 20 mA 通讯协议&…

多线程同步,信号,生产者消费者模型

目录1.线程互斥它是对的吗?合理吗?(任何场景)2.怎么解决饥饿问题?3.条件编译1.生产者和消费者模型2.编写代码实现一个基于堵塞队列的生产者消费者模型4.POSIX信号量5.环形队列1.线程互斥它是对的吗?合理吗?(任何场景) …

【JavaSE】多态

目录 1、多态 1.1、多态的概念 1.2、多态的实现条件 1.3、向上转型和向下转型 1.3.1、向上转型 1.3.2、向下转型 1.3.3、instanceof关键字 2、重写 2.1、重写的使用 2.2、动态绑定和静态绑定 2.2.1、动态绑定 2.2.2、静态绑定 2.3、再谈重写 3、多态的优缺点 4、…

LabVIEW浮点型和双精度数据类型之间的精度差异是什么 为什么 在LabVIEW 中, 浮点 数 会 失去 精度?

LabVIEW浮点型和双精度数据类型之间的精度差异是什么 为什么 在LabVIEW 中, 浮点 数 会 失去 精度? 程序中使用浮点数据类型或双精度数据类型。这些数据类型之间有什么区别? 浮点型的变量只有 7 位精度,而双精度类型的变量有 15…

算法竞赛入门【码蹄集进阶塔335题】(MT2296-2300)

算法竞赛入门【码蹄集进阶塔335题】(MT2296-2300) 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2296-2300)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录1. MT2296 找朋友2. MT2297 盒子与球3. MT2298 点餐4. MT…

第二章Java概述

第二章Java概述 2.1 Java技术体系平台 Java SE:标准版 Java EE:企业版 Java ME:小型版 2.2Java重要特点(四个) 1)java语言是面向对象的(oop) 2)java语言是健壮的。java的强类型机制、异常处理、垃圾的自动…

Kamiya丨Kamiya艾美捷人CP ELISA说明书

Kamiya艾美捷人CP ELISA预期用途: 人CP ELISA是一种高灵敏度的双位点酶联免疫分析(ELISA)人体生物样品中CP的测定。仅供研究使用。不用于诊断程序。 引言 铜蓝蛋白是参与铜转运的多功能蛋白,也是重要的血清抗氧化剂。在此期间炎…