13. Springboot集成Protobuf

目錄

1、前言

2、Protobuf簡介

2.1、核心思想

2.2、Protobuf是如何工作的?

2.3、如何使用 Protoc 生成代碼?

3、Springboot集成

3.1、引入依賴

3.2、定義Proto文件

3.3、Protobuf生成Java代碼

3.4、配置Protobuf的序列化和反序列化

3.5、定義controller接口

3.6、訪問

4、小結


1、前言

在以往的項目中進行網絡通信和數據交換的應用場景中,最經常使用的技術便是json或xml。隨著JSON的靈活優勢,越來越多的企業選擇JSON作為數據交換的格式,目前JSON已經成為了業界的主流。JSON已經足夠好用,且能滿足相當大部分的場景。但是今天在介紹一個Google的力作protobuf作為數據交換格式。我們來看看。

2、Protobuf簡介

Github地址:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format

官網地址:Overview | Protocol Buffers Documentation

Protobuf(Protocol Buffers)是由 Google 開發的一種輕量級、高效的數據交換格式,它被用于結構化數據的序列化、反序列化和傳輸。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的數據體積、更快的解析速度和更強的可擴展性。同時他是一種語言無關、平臺無關、可擴展的序列化格式。它使開發人員能夠在文件中定義結構化數據.proto,然后使用該文件生成可以從不同數據流寫入和讀取數據的源代碼。

2.1、核心思想

Protobuf 核心思想是使用協議來定義數據的結構和編碼方式。協議是一個文本文件,其中定義了消息的結構。消息由字段組成,每個字段都有一個名稱、類型和可選的默認值。然后使用Protobuf提供的解碼器生成對應代碼,用于序列化和反序列化數據,由于Protobuf是基于二進制編碼,因此可以跨語言使用。

Protobuf 支持以下數據類型:

  • 基本類型:例如?int32、string、bool?等
  • 復合類型:例如?message、enum?等

2.2、Protobuf是如何工作的?

Protobuf 使用二進制數據格式,與基于文本的格式相比,它更緊湊且讀寫速度更快。它還提供了接口定義語言(IDL),可以輕松定義要序列化的數據的結構。

Protobuf 文件使用文件擴展名保存.proto。該.proto文件以 Protobuf 的 IDL 格式編寫,包含有關數據結構的所有信息。數據被建模為“消息”,即名稱/值對組。以下是文件中簡單 Protobuf 消息的示例.proto:

// 指定 Protobuf 版本為版本 3(最新版本)
syntax = "proto3";// 指定protobuf包名,防止類名重復
package com.shamee.protobuf;// 生成的文件存放在哪個包下
option java_package = "com.shamee.protos";// 生成的類名,如果沒有指定,會根據文件名自動轉駝峰來命名
option java_outer_classname = "PersonProtos";// 定義了一個Person類
message Person {// 后面的值(=1  =2)作為序列化后的二進制編碼中的字段的唯一標簽// 因此 1-15比 16 會少一個字節,所以盡量使用 1-15 來指定常用字段。int32 id = 1;string name = 2;string email = 3;string address = 4;
}

示例中,客戶消息包含四個字段:id、name、email和address。每個字段都有其類型指示,以及指示其是否為required、optional或 的標簽repeated。

該.proto文件可以使用 Protoc(即 Protobuf 編譯器)編譯成多種編程語言。該編譯器以開發人員指定的編程語言生成源代碼。該源代碼包括用于寫入、讀取和操作.proto文件中定義的消息類型的類和方法。

當有數據要存儲或傳輸時,可以創建生成的類的實例并用您的數據填充它們。然后將這些實例序列化為二進制格式。讀取數據時,二進制格式將反序列化回從.proto文件生成的類的實例。這使您可以輕松訪問結構化數據。

Protobuf 生成的二進制數據格式是平臺無關的,可用于在不同系統、應用程序或服務之間交換數據,即使它們是用不同的編程語言實現或在不同的平臺上運行的。

2.3、如何使用 Protoc 生成代碼?

上面定義好的.proto,可以使用Protobbuf編譯器(Protoc)將文件編譯成不同語言。

下載編譯器:Release Protocol Buffers v25.3 · protocolbuffers/protobuf · GitHub

編譯命令如下面的代碼將.proto文件編譯成 JavaScript:

protoc --js_out=import_style=commonjs,binary: .customers.proto

編譯成java語言:

protoc --java_out=./my_dist  .customers.proto

3、Springboot集成

上面介紹了protobuf的基本內容,以及簡單的語法編寫和編譯。接下來我們來使用他,并集成到我們的springboot中。

3.1、引入依賴

<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.6.1</version>
</dependency>
<!-- 同時添加maven插件,用于編譯protobuf生成java文件 -->
<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.5.0.Final</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.5.0</version><configuration><protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact><!--默認值,proto源文件路徑--><protoSourceRoot>${project.basedir}/src/main/resources/proto</protoSourceRoot><pluginId>grpc-java</pluginId><!--是否清空上面配置目錄outputDirectory--><clearOutputDirectory>false</clearOutputDirectory></configuration><executions><execution><goals><goal>compile</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.3.0</version><configuration><excludes><exclude>**/*.proto</exclude></excludes></configuration></plugin></plugins>
</build>

3.2、定義Proto文件

定義兩個proto文件,一個用于接收接口請求數據Person.proto,一個用于響應Response.proto。

Person.proto:

syntax = "proto3";
package proto.shamee;// 生成的文件存放在哪個包下
option java_package = "proto.shamee";// 生成的類名,如果沒有指定,會根據文件名自動轉駝峰來命名
option java_outer_classname = "PersonProto";// 定義了一個Person類
message Person {// 后面的值(=1  =2)作為序列化后的二進制編碼中的字段的唯一標簽// 因此 1-15比 16 會少一個字節,所以盡量使用 1-15 來指定常用字段。int32 id = 1;string name = 2;string email = 3;string address = 4;
}

Response.proto:

syntax = "proto3";
package proto.shamee;
option java_package = "proto.shamee";
option java_outer_classname = "ResponseProto";message Response {int32 code = 1;string message = 2;string data = 3;
}

3.3、Protobuf生成Java代碼

定義完后,可以直接mvn install,可以生成響應的proto的java代碼。

3.4、配置Protobuf的序列化和反序列化

@Configuration
public class ProtobufConfig {/*** protobuf 序列化*/@BeanProtobufHttpMessageConverter protobufHttpMessageConverter() {return new ProtobufHttpMessageConverter();}/*** protobuf 反序列化*/@BeanRestTemplate restTemplate(ProtobufHttpMessageConverter protobufHttpMessageConverter) {return new RestTemplate(Collections.singletonList(protobufHttpMessageConverter));}}

3.5、定義controller接口

由于protobuf是基于二進制流傳輸數據,因此這里需要指定一下x-protobuf協議。

@RestController
@RequestMapping("/test")
public class TestController {@PostMapping(value = "/index", produces = "application/x-protobuf")public ResponseProto.Response index(@RequestBody PersonProto.Person person){return ResponseProto.Response.newBuilder().setCode(200).setMessage("OK").setData("hello:" + person.getName()).build();}}

接著就可以啟動springboot項目啦。

3.6、訪問

這里訪問的時候,需要定義header的content-type,同時參數以二進制數據進行傳輸訪問。我們的請求數據:

訪問頭配置:

返回:

到此我們就簡單的學會了protobuf了,又可以安心的去吃夜宵了。

4、小結

protobuf在整個集成中還是有一些問題,如ptotoc的版本號如果相差太多就會編譯不通過。當然protobuf也存在一些不足之處:

  • 功能簡單:Protobuf 功能簡單,無法用來表示復雜的概念。例如,它無法表示 XML 中的DTD 或 XSD 等復雜結構。
  • 通用性較差:Protobuf 是 Google 內部使用的工具,通用性較差。XML 和 JSON 已成為多種行業標準的編寫工具,而 Protobuf 在通用性上還差很多。
  • 自解釋性差:Protobuf 以二進制形式存儲數據,不便于閱讀和編輯。XML 具有自解釋性,可以直接用文本編輯器打開和編輯。

Protobuf 是一種優秀的序列化格式,但并非完美無缺。在選擇序列化格式時,需要根據實際需求進行綜合考慮。如果需要一種高效、緊湊、可擴展的序列化格式,Protobuf 是一個不錯的選擇。但如果需要表示復雜的概念、通用性或自解釋性,則需要考慮其他序列化格式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715246.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【中英對照】【自譯】【精華】麻省理工學院MIT技術雙月刊(Bimonthly MIT Technology Review)2024年3/4月刊內容概覽

一、說明 Notation 僅供學習、參考&#xff0c;請勿用于商業行為。 二、本期封面、封底 Covers 本期雜志購于新加坡樟宜機場Changi Airport Singapore&#xff0c;售價為20.50新元。 本期仍然關注倫敦的AI大會。&#xff08;筆者十分想去&#xff0c;在倫敦和MIT校園均設有會…

IDEA的安裝教程

1、下載軟件安裝包 官網下載&#xff1a;https://www.jetbrains.com/idea/ 2、開始安裝IDEA軟件 解壓安裝包&#xff0c;找到對應的idea可執行文件&#xff0c;右鍵選擇以管理員身份運行&#xff0c;執行安裝操作 3、運行之后&#xff0c;點擊NEXT&#xff0c;進入下一步 4、…

手動、半自動、全自動探針臺有何區別

手動探針臺、半自動探針臺和全自動探針臺是三種不同類型的探針臺&#xff0c;它們在使用類型、功能、操作方式和價格等方面都有所不同。 手動探針臺是一種手動控制的探針臺&#xff0c;通常用于沒有很多待測器件需要測量或數據需要收集的情況下。該類探針臺的優點是靈活、可變…

python difflib --- 計算差異的輔助工具

此模塊提供用于比較序列的類和函數。 例如&#xff0c;它可被用于比較文件&#xff0c;并可產生多種格式的不同文件差異信息&#xff0c;包括 HTML 和上下文以及統一的 diff 數據。 有關比較目錄和文件&#xff0c;另請參閱 filecmp 模塊。 class difflib.SequenceMatcher 這…

WebAssembly 是啥東西

WebAssembly&#xff08;簡稱Wasm&#xff09;是一種為網絡瀏覽器設計的二進制指令格式&#xff0c;它旨在成為一個高效的編程語言的編譯目標&#xff0c;從而允許在網絡上部署客戶端和服務器應用程序。WebAssembly的主要設計目標是實現高性能應用&#xff0c;同時維持網絡的安…

GraphPad Prism 10: 你的數據,我們的魔法 mac/win版

GraphPad Prism 10是GraphPad Software公司推出的一款功能強大的數據分析和可視化軟件。它集數據整理、統計分析、圖表制作和報告生成于一體&#xff0c;為科研工作者、學者和數據分析師提供了一個高效、便捷的工作平臺。 GraphPad Prism 10軟件獲取 Prism 10擁有豐富的圖表類…

2023義烏最全“電商+跨境+直播”數據總結篇章!

值得收藏&#xff5c;2023義烏最全“電商跨境直播”數據總結篇章&#xff01; 麥琪享資訊2024-01-20 14:28浙江 新年伊始&#xff0c;央視就把鏡頭對準了義烏電商&#xff0c;以電商的蓬勃之勢展現這座國際商城的開放與活力。 過去的一年 義烏電商量質齊升 實力出圈 跑出了…

nginx 根據參數動態代理

一、問題描述 nginx反向代理配置一般都是配置靜態地址&#xff0c;比如&#xff1a; server {listen 80;location / {proxy_pass http://myapp1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}} 這個反向代理表示訪問80端口跳轉到 http://myapp1 …

騰訊云優惠券領取入口_先領取再下單_2024騰訊云優惠攻略

騰訊云優惠代金券領取入口共三個渠道&#xff0c;騰訊云新用戶和老用戶均可領取8888元代金券&#xff0c;可用于云服務器等產品購買、續費和升級使用&#xff0c;阿騰云atengyun.com整理騰訊云優惠券&#xff08;代金券&#xff09;領取入口、代金券查詢、優惠券兌換碼使用方法…

在Windows下運行命令行程序,如何才能不顯示命令行窗口,讓程序保持后臺運行?

在Windows下&#xff0c;有幾種方法可以使命令行程序在后臺運行而不顯示命令行窗口。以下是其中的一些方法&#xff1a; 一. 使用start命令 你可以使用start命令來啟動程序&#xff0c;并將窗口樣式設置為最小化。例如&#xff1a; cmd start /b your_program.exe這里的/b選…

【硬件相關】IB網/以太網基礎介紹及部署實踐

文章目錄 一、前言1、Infiniband網絡1.1、網絡類型1.2、網絡拓撲1.3、硬件設備1.3.1、網卡1.3.2、連接線纜a、光模塊b、線纜 1.3.4、交換機 2、Ethernet網絡 二、部署實踐&#xff08;以太網&#xff09;1、Intel E810-XXVDA21.1、網卡信息1.2、檢查命令1.2、驅動編譯 2、Mella…

volatile 關鍵字 (二)

volatile 關鍵字 &#xff08;二&#xff09; 文章目錄 volatile 關鍵字 &#xff08;二&#xff09;volatile 可以保證原子性么&#xff1f; 文章來自Java Guide 用于學習如有侵權&#xff0c;立即刪除 volatile 可以保證原子性么&#xff1f; volatile 關鍵字能保證變量的可…

nextjs中_app.tsx下劃線什么作用

在Next.js中&#xff0c;_app.tsx&#xff08;或_app.js&#xff09;是一個特殊的文件&#xff0c;用于初始化頁面。下劃線_前綴在文件名中具有特定的意義&#xff0c;它告訴Next.js這個文件是一個特殊的內置文件&#xff0c;用于覆蓋或擴展默認的App行為。 具體來說&#xff…

Python 潮流周刊第 40 期(摘要)

本周刊由 Python貓 出品&#xff0c;精心篩選國內外的 250 信息源&#xff0c;為你挑選最值得分享的文章、教程、開源項目、軟件工具、播客和視頻、熱門話題等內容。愿景&#xff1a;幫助所有讀者精進 Python 技術&#xff0c;并增長職業和副業的收入。 周刊全文&#xff1a;h…

C++_數據結構_數據的輸入

作用 用于從鍵盤獲取數據 關鍵字 cin >> 變量示例

YOLOv5論文作圖教程(3)— 關于論文作圖教程系列采用線上培訓的通知(終結篇)

前言:Hello大家好,我是小哥談。YOLOv5論文作圖教程系列其實是我特別擅長的一個模塊(本人產品經理出身),自從本系列發表了兩篇文章之后,一直沒有再繼續更新,主要原因是通過文字無法比較好的表達軟件的功能及使用,并且也無法達到比較好的培訓效果。為了確保大家可以徹底掌…

數據庫原理(一)

1、基本概念 學號姓名性別出生年月籍貫220101張三男2003江蘇220102李四男2003山東220103王五女2003河北220104趙六女2003天津220105張四男2003北京220106李五女2003江蘇220107王六女2003山東220108張七男2003河北220109張九男2003天津220110李十女2003北京 1.1數據&#xff0…

基于springboot+vue的相親網站

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

軟考54-上午題-【數據庫】-關系模式的范式-真題

一、范式總結 第一步&#xff0c;先求候選碼&#xff0c;由此得到&#xff1a;主屬性、非主屬性。 二、判斷部分函數依賴的技巧 【回顧】&#xff1a;部分函數依賴 &#xff08;X&#xff0c;Y&#xff09;——>Z&#xff1b; X——>Z 或者 Y——>Z 題型&#xff1a;給…

全量知識系統問題及SmartChat給出的答復 之13 解析器+DDD+文法型 之2

Q36. 知識系統中設計的三種文法解析器和設計模式之間的關系 進一步&#xff0c;我想將 知識系統中設計的三種語言&#xff08;形式語言、人工語言和自然&#xff09;的文法解析器和DDD中的三種程序類型&#xff08;領域模型、領域實體和領域服務&#xff09; 形式語言文法 我…