【最新Dubbo3深入理解】Dubbo高性能之网络通信协议(下)

2024-02-21 14:12

本文主要是介绍【最新Dubbo3深入理解】Dubbo高性能之网络通信协议(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

最新 Dubbo3 深入理解原理系列

在这里插入图片描述

Tripple 协议

因此 Dubbo 框架为了提升协议的通用性,可以和 SpringCloud 以及其他语言应用进行通信,在 Dubbo3.x 版本推出了基于 HTTP/2 的 Triple 协议

HTTP/2 兼容 HTTP/1,并且性能更好,同时在兼容性和性能上都有所提升!

Tripple 协议是 Dubbo3 推出的主力协议,Tripple 的含义就是三,表示是第三代,Tripple 协议的特点:

1、Tripple 协议是 Dubbo3 设计的基于 HTTP2 的 RPC 通信协议规范, 通用性 能有所提升,并且由于是基于 HTTP/2 的,因此 性能 上也要比 HTTP/1.x 要好一些

2、Tripple 协议支持 流式调用

  • 这里主要说一下 Tripple 协议支持的流式调用

流式调用是在 Dubbo3.x 版本新增的,如果我们需要使用流式调用的话,需要自己定义对应的方法

首先引入一下需要使用的类 StreamObserver 的依赖:

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-common</artifactId><version>3.0.7</version>
</dependency>

并且引入一下 Tripple 协议的依赖

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-rpc-tripple</artifactId><version>3.0.7</version>
</dependency>

比如说,我们在 UserService 接口中定义了流式调用:

public interface UserService {String hello(String name);// 服务端流式调用default void helloServerStream(String name, StreamObserver<String> response) {}// 双端流式调用default StreamObserver<String> helloStream(StreamObserver<String> response) {return response;}
}

那么流式调用是有三种的:服务端流式调用、客户端流式调用、双端流式调用(由于 Java 语言的限制,客户端流和双端流实现方案是一样的,因此后边只介绍了双端流式调用)

服务端流式调用 的话,返回值需要为 void ,参数中需要有 StreamObserver<String>

服务端对应接口实现方法为:

// UserServiceImpl implements UserService
@Override
public void sayHelloServerStream(String name, StreamObserver<String> response) {response.onNext(name + " hello");response.onNext(name + " world");response.onCompleted();
}

客户端调用者代码为:

userService.helloServerStream("11", new StreamObserver<String>(){@Overridepublic void onNext(String data) {// 服务端返回的数据}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted(String data) {// 服务端执行完毕}
})

双端流式调用 的话,返回值和参数都要有 StreamObserver

服务端对应接口实现方法为:

// UserServiceImpl implements UserService
@Override
public StreamObserver<String> sayHelloStream(StreamObserver<String> response) {return new StreamObserver<String>() {@Overridepublic void onNext(String data) {// 接收客户端发送的数据response.onNext("result:" + data);}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted(String data) {// 服务端执行完毕}}
}

客户端调用者代码为:

StreamObserver<String> streamObserver = userService.sayHelloStream(new StreamObserver<String>() {@Overridepublic void onNext(String data) {System.out.println("接收到响应数据:"+ data);}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted(String data) {// 接收数据完毕}
})
// 客户端发送数据
streamObserver.onNext("第一次发送数据");
streamObserver.onNext("第二次发送数据");
streamObserver.onCompleted();
  • 接下来总结一下 Tripple 协议中的流式调用的优点以及应用场景

首先,流式调用的优点就是 客户端可以多次向服务端发送消息,并且服务端也可以多次接收 ,通过 onNext 方法多次发送,比如用户在处理完一部分数据之后,将这一部分数据发送给服务端,之后再去处理下一部分数据,避免了一次发送很多数据的情况

流式调用的应用场景为:接口需要发送大量数据,这些数据通过一个 RPC 请求无法发送完毕,需要分批发送,并且需要保证发送的有序性

这篇关于【最新Dubbo3深入理解】Dubbo高性能之网络通信协议(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732053

相关文章

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab