干翻Dubbo系列第十篇:Dubbo体系中ProtoBuf序列化方式详解

news/2025/3/14 5:30:37/

文章说明


本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系

一:序列化概念

补充说明:
Kyro和Fst这两种优秀的序列化方案都是适用于Java体系,换句话说,换个Go语言编写的端就不好使了。

ProtoBuf这中序列化方式可以支持其他的语言。Java、go、php都是可以支持的。GRPC另外一种RPC的底层实现方式。

二:ProtoBuf序列化方式

1:引入依赖

(一):ProtoBuf依赖

        <dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.22.2</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>3.22.2</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-serialization-protobuf</artifactId><version>2.7.23</version><exclusions><exclusion><artifactId>dubbo-common</artifactId><groupId>org.apache.dubbo</groupId></exclusion><exclusion><artifactId>dubbo-serialization-api</artifactId><groupId>org.apache.dubbo</groupId></exclusion><exclusion><artifactId>protobuf-java</artifactId><groupId>com.google.protobuf</groupId></exclusion><exclusion><artifactId>protobuf-java-util</artifactId><groupId>com.google.protobuf</groupId></exclusion></exclusions></dependency></dependencies><build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.1</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}</protocArtifact><outputDirectory>${basedir}/src/main/java</outputDirectory><clearOutputDirectory>false</clearOutputDirectory><protocPlugins><protocPlugin><id>dubbo</id><groupId>org.apache.dubbo</groupId><artifactId>dubbo-compiler</artifactId><version>0.0.2</version><mainClass>org.apache.dubbo.gen.dubbo.Dubbo3Generator</mainClass></protocPlugin></protocPlugins></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build>

protobuf-java、protobuf-java-uitl这两个是Dubbo项目支持Protobuf的话,这两个依赖是必有的。dubbo-serialization-protobuf这个是ProtoBuf的序列化依赖。需要排除自带的Dubbo依赖。另外还需要把java和util这两个依赖给排除掉。

此依赖配置是放到父项目的Pom.xml里边。

(二):解决依赖编译问题

Consumer和provider之间是通过网络进行通信的,两者有可能不同的语言编写的。那两者通信的时候都得将数据转换为ProtoBuf这种中间格式来进行通讯。这样就做到了跨语言的数据传输。一旦应用了ProtoBuf这种序列化方式。

ProtoBuf作为数据传输的中间格式,一旦应用了ProtoBuf作为序列化方式的。IDL是ProtoBuf作为中间的格式,是ProtoBuf的特有的预发,里边都称之为Message。这里边涉及到一个编译的问题,需要使用ProtoC进行编译,使用ProtoC进行编译的话,有两种使用方式。1是直接本地安装protoC,另外一种是使用maven插件的方式。我们maven插件即可。

应用这个插件的时候,我们需要注意这个版本必须与上述的protobuf-java版本保持一致,使用MAC操作系统的话,其中的版本不能低于3.17.3,低于这个版本是对这个苹果的ARM架构是不支持的。Nacos是也有这个问题

2:ProtoBuf⽂件的编写

ProtoBuf作为序列化方案,需要有一个传输数据的中间类型,这个中间类型就是ProtoBuf里边的IDL,这个IDL大致有三块内容:参数(请求数据)返回值(返回参数)这是两个非常核心的内容,也称之为Message。

当然还有第三个内容,那就是服务接口。服务接口沟通了Provider和Confumer,一个基于服务接口提供实现,另外一个通过服务接口创建代理。如果基于ProtoBuf来实现序列化的话,那么这个服务接口也需要在定义在IDL当中的。

ProtoBuf的IDL是.protobuf的这样的一个文件。首先,我们使用的语法是proto3三个Java配置可选项。

这个文件叫做HelloService.proto,放到与API项目下和Java平级的proto目录下。这个将来会被consumer和provider共用。

然后,这个proto文件会被protoC插件翻译成Java类。

syntax = "proto3";生成的Java类放到不同的文件里
option java_multiple_files = true;
生成的代码放到那个包下
option java_package = "com.suns";
最外层的类叫什么名字?
option java_outer_classname = "HelloProtocol";message HelloRequest {
string name = 1;
}
message HelloResponse {
string result = 1;
}
service HelloService {
rpc sayHello (HelloRequest) returns (HelloResponse);
}

3:ProtoC生成的Java接口

public class HelloServiceImpl implements HelloService {@Overridepublic HelloResponse sayHello(HelloRequest request) {System.out.println("HelloServiceImpl.sayHello request " + request.getName());return HelloResponse.newBuilder().setResult("this is sayHello result").build();}//异步的@Overridepublic CompletableFuture<HelloResponse> sayHelloAsync(HelloRequest request) {return CompletableFuture.completedFuture(sayHello(request));}
}

4:XML的配置方式

<dubbo:protocol name="dubbo" port="-1" serialization="protobuf"/>
<bean id="helloService" class="com.suns.service.HelloServiceImpl"/>
<dubbo:service interface="com.suns.HelloService" ref="helloService"/>

5:Boot的配置方式

dubbo:protocol:name: dubboport: -1serialization: protobuf

6:Consumer端调用

<dubbo:reference interface="com.suns.service.HelloService" id="helloSe
rvice"
url="dubbo://192.168.50.62:20880/com.suns.HelloServic
e?serialization=protobuf"/>

 7:Boot的方式

@DubboReference(url = "dubbo://192.168.50.62:20880/com.suns.HelloServi
ce?serialization=protobuf")


http://www.ppmy.cn/news/1036679.html

相关文章

如何做好科技文献资料的翻译!

我们知道&#xff0c;科技文献是工程技术人员的重要参考文献&#xff0c;翻译科技文献资料有助于促进国内外科技知识和技术的传播。那么&#xff0c;如何做好科技文献资料的翻译&#xff0c;专业科技文献翻译哪家好&#xff1f; 据了解&#xff0c;科技文献翻译是一种以应用为主…

python菱形问题

Python类分为两种&#xff0c;一种叫经典类&#xff0c;一种叫新式类。都支持多继承&#xff0c;但继承顺序不同。 新式类&#xff1a;从object继承来的类。&#xff08;如:class A(object)&#xff09;&#xff0c;采用广度优先搜索的方式继承&#xff08;即先水平搜索&#…

蓝桥杯嵌入式省一教程:(二)LCD显示

在嵌入式开发中&#xff0c;屏幕显示是一个非常重要的功能。同时&#xff0c;其移植对于初学者来说较为复杂&#xff0c;需要较好地掌握I2C或SPI等通讯协议。然而&#xff0c;在蓝桥杯中&#xff0c;比赛方已经为我们提供了与LCD有关的库&#xff0c;这让我们能够简单方便地使用…

计算机视觉目标检测性能指标

目录 精确率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09; F1分数&#xff08;F1 Score&#xff09; IoU&#xff08;Intersection over Union&#xff09; P-R曲线&#xff08;Precision-Recall Curve&#xff09;和 AP mAP&#xff08;mean…

谈谈网络协议的定义、组成和重要性

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络协议的定义 二、网络协议的组成 1、…

Programming abstractions in C阅读笔记: p114-p117

《Programming Abstractions in C》学习第48天&#xff0c;p114-p117&#xff0c;​总结如下&#xff1a; 一、技术总结 主要通过random number介绍了随机数的相关用法&#xff0c;interface​示例(random.h)​&#xff0c;client program示例(craps.c)。 #include <stdio…

非计算机科班如何顺利转码进入计算机领域?

文章目录 如何规划才能实现转码&#xff1f;计算机岗位发展前景&#xff1f;现阶段转码 总结 &#x1f389;欢迎来到Java学习路线专栏~探索非计算机科班如何顺利转码进入计算机领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f3…

大数据:Numpy基础应用详解

Numpy基础应用 Numpy 是一个开源的 Python 科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作&#xff0c;对于同样的数值计算任务&#xff0c;使用 NumPy 不仅代码要简洁的多&#xff0c;而且 NumPy 的性能远远优于原生 Python&#xff0c;…