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

文章说明


本文内容整理自《孙哥说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.mzph.cn/news/39446.shtml

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

相关文章

设计模式-面试常问

1.单例模式 保证系统中&#xff0c;一个类&#xff0c;只有一个实例&#xff0c;并且提供对外访问。 优点&#xff1a;只有一个对象&#xff0c;可以节省资源。适合频繁创建销毁对象的场景。 实现&#xff1a;要用到static&#xff0c;静态私有对象。暴露单例的静态方法。 &…

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)

docker 学习–03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09; docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 文章目录 docker 学习--03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09;[TOC](文章目录) 1. wi…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是&#xff0c;尽管"逻辑回归"名字带有“回归”二字&#xff0c;但逻辑回归是一个分类算法&#xff0c;而不是回归算法。 我认为&#xff…

冉冉升起的星火,再度升级迎来2.0时代!

文章目录 前言权威性评测结果 星火大模型多模态功能插件功能简历生成文档问答PPT生成 代码能力 福利 前言 前几天从技术群里看到大家都在谈论《人工智能大模型体验报告2.0》里边的内容&#xff0c;抱着好奇和学习的态度把报告看了一遍。看完之后瞬间被里边提到的科大讯飞的星火…

2008-2020年全国各省绿色金融发展指数(含原始数据)

2008-2020年全国各省绿色金融发展指数&#xff08;含原始数据&#xff09; 1、时间&#xff1a;2008-2020年 2、范围&#xff1a;30个省市 不含西藏 3、来源&#xff1a;原始数据整理自csmar、eps、wind等数据库 4、原始数据指标&#xff1a; A股上市环保企业新增银行贷款…

企业服务器数据库遭到malox勒索病毒攻击后如何解决,勒索病毒解密

网络技术的发展不仅为企业带来了更高的效率&#xff0c;还为企业带来信息安全威胁&#xff0c;其中较为常见的就是勒索病毒攻击。近期&#xff0c;我们公司收到很多企业的求助&#xff0c;企业的服务器数据库遭到了malox勒索病毒攻击&#xff0c;导致系统内部的许多重要数据被加…

HCIP VRRP技术

一、VRRP概述 VRRP&#xff08;Virtual Router Pedundancy Protocol&#xff09;虚拟路由器冗余协议&#xff0c;既能够实现网关的备份&#xff0c;又能够解决多个网关之间互相冲突的问题&#xff0c;从而提高网络可靠性。 局域网中的用户的终端通常采用配置一个默认网关的形…

【uniapp】 软键盘弹出后fixed定位被顶上去问题

问题描述 当手机设计的导航栏为fixed定位上去时&#xff0c;输入框获取焦点就会把顶部自定义的导航栏顶到上面去&#xff0c;如下图所示 解决办法 输入框设置 :adjust-position“false” <input type"text" :adjust-position"false" focus"i…

【Linux】多线程之单例模式

多线程之单例模式 什么是设计模式&#xff0c;都有哪些设计模式单例模式饿汉模式懒汉模式 什么是设计模式&#xff0c;都有哪些设计模式 设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理…

AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)

一、生成第一个AI图片 首先&#xff0c;生成将中文描述词翻译成英文 然后在输入端输入&#xff1a;/imagine prompt:Bravely running boy in Q version, cute head portrait 最后&#xff0c;稍等一会即可输出效果 说明&#xff1a; 下面的U1、U2、U3、U4代表的第一张、第二张…

Nacos AP架构集群搭建(Windows)

手写SpringCloud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 目录&#xff1a; 一&#xff1a;初始化MySQL 二&#xff1a;复制粘贴三份Nacos文…

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-BP遗…

YoloV8优化:通道优先卷积注意力,效果秒杀CBAM和SE等 | 即插即用系列

💡💡💡本文独家改进:通道优先卷积注意力,采用多尺度结构来增强卷积运算捕获空间关系的能力,解决CBAM 整合了通道注意和空间注意,但它在其输出特征的所有通道上强制执行一致的空间注意分布。相反,SE只整合了通道注意,这限制了它选择重要区域的能力 通道优先卷积注意…

LabVIEW使用图像处理进行交通控制性能分析

LabVIEW使用图像处理进行交通控制性能分析 采用普雷维特、拉普拉斯、索贝尔和任意的空间域方法对存储的图像进行边缘检测&#xff0c;并获取实时图像。然而&#xff0c;对四种不同空间域边缘检测方法的核的性能分析。 以前&#xff0c;空路图像存储在数据库中&#xff0c;道路…

【JAVA】变量的作用域与生存周期

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言变量的作用域变量的生命周期局部变量全局变量 前言 变量&#xff0c;我们学习过程中逃不掉的知识&#xff0c;无论在哪种语言中我们都需要学会去合理的运用它&#xff0c;今…

自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的存储与应用]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 使用SQLite存储的实体记忆 我们将创建一个简单的对话链&#xff0c;该链使用ConversationEntityMemory&#xff0c;并使用SqliteEntityStore作为后端存储。使用EntitySqliteStore作为记忆entity_store属性上的参数&am…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如&#xff1a;https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如&#xff1a; 校内共享数据导入模板 /…

(一)Unity开发Vision Pro介绍

1.介绍 1.1 介绍 VisionOS 可实现与现实世界无缝集成并与其他虚拟内容共存的 3D 多任务体验。这为个人生产力、生活方式和娱乐应用打开了一个充满新可能性的世界&#xff0c;并为开发人员打开了一个全新的市场。然而&#xff0c;它也带来了围绕多任务处理和与身体互动的新挑战…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异&#xff0c;文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来&#xff0c;一些新兴的文件传输工具受到了人们的关注&#xff0c;其中除了知名的Aspera之外&#xff0c;还有许多可靠安全的…

FPGA_学习_15_IP核_VIO

前一篇博客我们提到在线调试的时候&#xff0c; 可执行文件只要烧进板子&#xff0c;程序它就会自己跑起来&#xff0c;不会等你点 这个按钮&#xff0c;它才开始跑。我们测试的模块中&#xff0c;里面可能有几个我们关心的信号&#xff0c;它会在程序刚运行很短的时间内发生状…