深入浅出dubbo3原理及实战「新特性简介」dubbo3新特性要点之rpc协议介绍(代码片段)

洛神灬殇 洛神灬殇     2023-03-27     658

关键词:

RPC 通信协议

Dubbo3提供了Triple(Dubbo3)、Dubbo2协议,这是Dubbo框架的原生协议。除此之外,Dubbo3也对众多第三方协议进行了集成,并将它们纳入Dubbo的编程与服务治理体系, 包括:gRPC、Thrift、JsonRPC、Hessian2、REST等。以下重点介绍 Triple 与 Dubbo2 协议。

Triple 协议

Triple协议是Dubbo3 推出的主力协议。Triple意为第三代,通过Dubbo1.0/Dubbo2.0两代协议的演进,以及云原生带来的技术标准化浪潮,Dubbo3新协议Triple应运而生。

RPC协议的选择

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

协议的内容包含三部分

  • 数据交换格式: 定义RPC的请求和响应对象在网络传输中的字节流内容,也叫作序列化方式。
  • 协议结构: 定义包含字段列表和各字段语义以及不同字段的排列方式。
  • 协议通过定义规则、格式和语义来约定数据如何在网络间传输。

一次成功的RPC需要通信的两端都能够按照协议约定进行网络字节流的读写和对象转换。如果两端对使用的协议不能达成一致,就会出现鸡同鸭讲,无法满足远程通信的需求。

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

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

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

选择构建在 HTTP 之上,有两个最大的优势:
  • HTTP的语义和可扩展性能很好的满足RPC调用需求。
  • HTTP协议几乎被网络上的所有设备所支持,具有很好的协议穿透性。
选择构建在 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的序列化方式,需要较高的学习成本和改造成本,对于现有的偏单语言的用户而言,迁移成本不可忽视

最终的选择Triple

兼容gRPC ,以HTTP2作为传输层构建新的协议,也就是Triple。

容器化应用程序和微服务的兴起促进了针对负载内容优化技术的发展。 客户端中使用的传统通信协议( RESTFUL或其他基于 HTTP 的自定义协议)难以满足应用在性能、可维护性、扩展性、安全性等方便的需求。

GRPC协议的兴起

一个跨语言、模块化的协议会逐渐成为新的应用开发协议标准。自从 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协议

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 迈向云原生微服务的一大步。

深入浅出dubbo3原理及实战「技术大纲」深入浅出并发实战课程系列及技术指南

Dubbo3开题简介如开篇所述,Dubbo提供了构建云原生微服务业务的一站式解决方案,可以使用Dubbo快速定义并发布微服务组件,同时基于Dubbo开箱即用的丰富特性及超强的扩展能力,构建运维整个微服务体系所需的各... 查看详情

dubbo3终极特性「云原生三中心架构」带你探索dubbo3体系下的配置中心和元数据中心注册中心的原理及开发实战(中)

承接上文通过之前的【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上),让我们对Dubbo3的三中心架构体系有了一定的认识和了解。Dubbo3的三中心部署架构回... 查看详情

dubbo3终极特性「云原生三中心架构」带你探索dubbo3体系下的配置中心和元数据中心注册中心的原理及开发实战(中)(代码片段)

承接上文通过之前的【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上),让我们对Dubbo3的三中心架构体系有了一定的认识和了解。Dubbo3的三中心... 查看详情

深入浅出dubbo3原理及实战「springcloud-alibaba系列」基于nacos作为注册中心进行发布springcloud-alibaba生态的rpc接口实战(代码片段)

SpringCloudAlibabaNacosDiscoverySpringBoot应用程序在服务注册与发现方面提供和Nacos的无缝集成。通过一些简单的注解,您可以快速来注册一个服务,并使用经过双十一考验的Nacos组件来作为大规模分布式系统的服务注册中心。服... 查看详情

dubbo3终极特性「云原生三中心架构」带你探索dubbo3体系下的配置中心和元数据中心注册中心的原理及开发实战(上)

Dubb3的应用级服务发现Dubbo3提供了全新的应用级服务发现模型,该模型在设计与实现上区别于Dubbo2的接口级服务发现模型。概括来说,Dubbo3引入的应用级服务发现主要有以下优势适配云原生微服务变革。云原生时代的基础设施能... 查看详情

dubbo3终极特性「云原生三中心架构」带你探索dubbo3体系下的配置中心和元数据中心注册中心的原理及开发实战(上)

Dubb3的应用级服务发现Dubbo3提供了全新的应用级服务发现模型,该模型在设计与实现上区别于Dubbo2的接口级服务发现模型。概括来说,Dubbo3引入的应用级服务发现主要有以下优势适配云原生微服务变革。云原生时代的基础... 查看详情

java8新特性及实战视频教程完整版

第1讲:课程介绍第2讲:课程介绍续第3讲:Lambda表达式初步与函数式接口第4讲:深入函数式接口与方法引用第5讲:Lambda表达式深入与流初步第6讲:Function接口详解第7讲:Function与BiFunction函数式接口详解第8讲:BiFunction函数式接... 查看详情

dubbo3终极特性「流式协议体系」dubbo3服务的流式处理和响应式编程实战开发指南(代码片段)

...取消和超时Triple新特性之Stream(流式处理)Stream流式处理是Dubbo3新提供的一种调用类型,在以下场景时建议使用流的方式:接口需要发送大量数据,这些数据无法被放在一个RPC 查看详情

介绍说明」dubbo3新特性概览的介绍说明

Dubbo3的微服务框架系列​​【Dubbo3入门到精通】总体技术体系介绍及技术指南(目录)​​本系列专题是关于Dubbo的简单介绍,涵盖Dubbo的核心概念、基本使用方式以及Dubbo3核心功能。Dubbo的基本介绍ApacheDubbo是一款微服务开发框... 查看详情

深入浅出spring原理及实战「源码原理实战」从底层角度去分析研究propertysourcesplaceholderconfigurer的原理及实战注入机制

Spring提供配置解析功能主要有一下xml文件占位符解析和Java的属性@Value的占位符解析配置这两种场景进行分析和实现解析,如下面两种案例。xml文件的占位符解析配置<beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="i... 查看详情

深入浅出sentinel原理及实战「基础实战专题」零基础实现服务流量控制实战开发指南

你若要喜爱你自己的价值,你就得给世界创造价值。Sentinel的组成部分Sentinel主要由以下两个部分组成。Sentinel核心库(Java客户端):Sentinel的核心库不依赖任何框架或库,能够运行于Java8及以上的版本的运行时环境中,同时对Spri... 查看详情

dubbo3.0新特性记录

...本,博主抱着好奇的心态一睹芳华。最终的感受就是dubbo3.0针对之前版本的问题进行了一系列的改造和提升。且Dubbo3.0的特性有些还在开发当中。一些已经提供的功能也尚待完善,有bug存在的情况出现。综上所述,如... 查看详情

深入浅出多线程编程实战threadlocal详解(介绍使用原理应用场景)(代码片段)

深入浅出多线程编程实战(五)ThreadLocal详解(介绍、使用、原理、应用场景)文章目录一、ThreadLocal简介二、ThreadLocal与Synchronized区别三、ThreadLocal简单使用四、ThreadLocal原理五、ThreadLocal应用场景一、ThreadLocal简介ThreadLocal&#... 查看详情

深入浅出sentinel原理及实战「基础实战专题」零基础探索分析sentinel控制台开发指南

Sentinel控制台Sentinel提供了一个轻量级的开源控制台SentinelDashboard,它提供了机器发现与健康情况管理、监控(单机和集群)、规则管理与推送等多种功能。Sentinel控制台提供的功能如下查看机器列表以及健康情况:Sentnel控制台能... 查看详情

dubbo3高级特性「框架与服务」服务分组及服务分组聚合实现(代码片段)

【Dubbo3高级特性】「框架与服务」Nacos作为注册中心-服务分组及服务分组聚合实现NACOS注册中心properties文件dubbo.application.name=nacos-registry-demo-consumerdubbo.registry.address=nacos://$nacos.address:localhost:8848?username=nacos&pass 查看详情

深入浅出springcloud原理及实战「springcloud-alibaba系列」微服务模式搭建系统基础架构实战指南及版本规划踩坑分析

前提介绍SpringCloud-Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。依托SpringCloudAlibaba,您只需要... 查看详情

dubbo3.0新特性总结

dubbo3.0的变化:  1.服务发现模型:      2.0采用基于接口粒度的服务发现机制,3.0基于应用粒度的服务发现机制,有利于提高系统资源利用率,降低Dubbo地址的单机内存消耗(50%),降低注册中... 查看详情

深入浅出spring原理及实战「开发实战系列」spring-cache扩展自定义(注解失效时间+主动刷新缓存)(代码片段)

缓存失效时间支持在方法的注解上指定SpringCache默认是不支持在@Cacheable上添加过期时间的,可以在配置缓存容器时统一指定:@BeanpublicCacheManagercacheManager(@SuppressWarnings("rawtypes")RedisTemplateredisTemplate)Custo 查看详情