日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ProtocolBuffers,一款比Xml快100倍的序列化框架!

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯(lián)系程序新視界公眾號。

我們擁有10多年網(wǎng)頁設計和網(wǎng)站建設經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站設計、網(wǎng)站建設、微信開發(fā)、微信平臺小程序開發(fā)、手機網(wǎng)站開發(fā)、H5建站、等業(yè)務。無論您有什么樣的網(wǎng)站設計或者設計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設計服務并滿足您的需求。

我們通常習慣用Json、XML等形式的數(shù)據(jù)存儲格式,但相信還有很多人沒有聽說過Protocol Buffer(簡稱protobuf)。protobuf是Google開源的一個語言無關、平臺無關的通信協(xié)議,其小巧、高效和友好的兼容性設計,使其被廣泛使用。性能比Json、XML真的強太多了!

而且,隨著微服務架構的流行,RPC框架也成為服務框架的重要組成部分。在很多RPC的設計中,都采用了高性能的編解碼技術,而protobuf就屬于其中的佼佼者。

也就說,要想深入了解微服務架構中的RPC環(huán)節(jié)底層實現(xiàn),設計出高效的傳輸、序列化、編碼解碼等功能,學習protobuf的使用和原理非常有必要。

protobuf簡介

protobuf是一種序列化對象框架(或者說是編解碼框架)。它有兩部分功能組成:結構化數(shù)據(jù)(數(shù)據(jù)存儲結構)和序列化&反序列化。

其中數(shù)據(jù)存儲結構的作用與XML、JSON相似;序列化和反序列化的作用與Java自帶的序列化、Facebook的Thrift和JBoss Marshalling等相似。

總之:protobuf是通過定義結構化數(shù)據(jù),并提供對數(shù)據(jù)的序列化和反序列化功能,從而實現(xiàn)數(shù)據(jù)存儲/RPC數(shù)據(jù)交換的功能。

它的特點是:

  • 語言無關、平臺無關
  • 簡潔
  • 高性能(序列化速度快 & 序列化后的數(shù)據(jù)體積小)
  • 良好的兼容性

可以通過數(shù)據(jù)直觀的看一下不同框架在序列化響應時間上的對比:

protobuf

可以看出,protobuf的性能要遠高于其他框架。

protobuf的使用流程

上面介紹了protobuf的功能,但僅僅知道這些功能我們無法知道它是怎么使用的??戳司W(wǎng)上很多的文章,要么直接開始寫代碼要么直接開始分析報文格式,對于新手來說往往會一頭霧水。

所以,我們先來梳理一下使用protobuf的步驟。

protobuf

在上圖中將protobuf的使用分了四個步驟:

  • 步驟一,搭建環(huán)境:使用protobuf要定義通信的數(shù)據(jù)結構,并編譯生成不同的編程語言代碼,這就需要有這么一個編譯器的環(huán)境。
  • 步驟二,構建數(shù)據(jù):使用protobuf是要傳輸數(shù)據(jù)的,那么數(shù)據(jù)包含什么,有哪些項目,整個結構層次是什么樣子的。這里基于protobuf的語法來進行數(shù)據(jù)結構的定義。
  • 步驟三,項目集成:集成pom依賴(Java為例)、集成編譯的Java類(對照proto文件);
  • 步驟四,具體使用:通過集成進來的Java類,來構建消息、賦值,然后基于protobuf進行序列化,接收方進行反序列化操作;

了解了上述步驟,下面就針對具體的步驟來進行實戰(zhàn)演示。

這里演示基于Mac OS操作系統(tǒng)和Java編程語言來進行操作。如果你使用的是其他操作系統(tǒng)和編程語言,基本思路一樣,在不同的步驟時可針對性的找一下具體操作。

安裝Protocol Buffers

安裝protobuf是為了進行數(shù)據(jù)結構的定義和對應編程語言代碼的生成。通常有兩種方式:本地安裝和IDE插件。我們先來看本地安裝。

protobuf的代碼是托管在GitHub上的,對應地址為:https://github.com/protocolbuffers/protobuf 。

點擊項目右邊的release鏈接可看到對應版本:https://github.com/protocolbuffers/protobuf/releases 。

protobuf

這里包含了各種編程語言、環(huán)境的版本。本文選protobuf-java-3.17.3.zip版本。

在Mac操作系統(tǒng)下,需要先安裝一下依賴組件,才能夠對protobuf進行編譯和安裝。

安裝依賴組件:

 
 
 
 
  1. // 安裝 Protocol Buffer依賴 
  2. // 注:Protocol Buffer依賴于autoconf、automake、libtool、curl 
  3. brew install autoconf automake libtool curl 

解壓protobuf-java-3.17.3.zip,進入根目錄,執(zhí)行以下命令:

 
 
 
 
  1. // 運行autogen.sh腳本 
  2. ./autogen.sh 
  3.  
  4. // 運行configure.sh腳本 
  5. ./configure 
  6.   
  7. // 編譯未編譯的依賴包 
  8. make 
  9.   
  10. // 檢查依賴包是否完整 
  11. make check 
  12.   
  13. // 開始安裝Protocol Buffer 
  14. make install 

安裝完成,檢驗版本:

 
 
 
 
  1. $protoc --version 
  2. libprotoc 3.14.0 

輸出版本信息,說明安裝成功。

這里的protoc命令就是Protocol Buffer的編譯器,可以將 .proto文件編譯成對應平臺的頭文件和源代碼文件。

另外一種方式就是安裝IDE插件,這里以IDEA為例,搜索插件:

protobuf

關于protobuf的插件比較多,選擇適合自己就行。

然后gRPC官方推薦了一種更優(yōu)雅的使用姿勢,可以通過maven輕松搞定(需安裝上圖中的“Protobuf Support”插件)。也就是引入grpc的一些組件,然后在maven的build中進行配置,編譯proto文件成為Java代碼。此種方式暫時不展開,后續(xù)可直接看項目集成部分的源代碼。

構建數(shù)據(jù)

在Java中,如果通過JSON來傳輸一個數(shù)據(jù),我們首先要定義一個對象,這里以Person為例:

 
 
 
 
  1. public class Person { 
  2.     private String name; 
  3.     private Integer id; 
  4.     // ... getter/setter 

那么,如果用protobuf來定義Person這個對象的數(shù)據(jù)結構是什么樣呢?

先創(chuàng)建一個person.proto文件,然后定義如下的結構:

 
 
 
 
  1. syntax = "proto3"; // 聲明為protobuf 3定義文件 
  2. package tutorial; 
  3.  
  4. option java_package = "com.choupangxia.protobuf.message"; // 聲明生成消息類的java包路徑 
  5. option java_outer_classname = "Person";  // 聲明生成消息類的類名 
  6.  
  7. message PersonProto { 
  8.     string name = 1; 
  9.     int32 id = 2; 

上面每項語法的具體說明可參看注釋部分。當然Person的結構可以更豐富,這里只是出于演示需要,做了最簡單的示例,更多語法可參看官方文檔。

編譯protot文件

定義完成之后,我們可以通過兩種方式來生成目標Java類。這里先采用本機安裝的編譯器來進行操作。

執(zhí)行protoc命令之前,可先執(zhí)行-h命令來查看protoc的使用說明:

 
 
 
 
  1. protoc -h 

進入person.proto文件所在目錄,執(zhí)行以下命令進行編譯:

 
 
 
 
  1. protoc --java_out=../java ./person.proto 

--java_out參數(shù)指定了Java類的輸出路徑,第二個參數(shù)執(zhí)行的要編譯的文件為當前目錄下的person.proto文件。

執(zhí)行命令,會發(fā)現(xiàn)com.choupangxia.protobuf.message下生成了名為Person的類。注意proto中定義的message名稱不要與Java類名重復,否則會出現(xiàn)命令執(zhí)行失敗的狀況。

對應的Person類比較復雜,甚至有一些語法層面的錯誤或改進,如果需要,進行對應的改進優(yōu)化即可。

protobuf

上圖為生成的Person類的部分結構。比如上面的java.lang.String getName()這個方法的返回值就可以進行優(yōu)化,不用指定String的package。

項目集成

其實上面講生成的Person代碼放入項目,已經(jīng)算是項目集成的一部分了。如果未引入protobuf的依賴,上面的代碼還是會報錯的。

Maven項目的pom文件中添加protobuf依賴:

 
 
 
 
  1.  
  2.     com.google.protobuf 
  3.     protobuf-java 
  4.     3.17.3 
  5.  

如果想通過IDEA直接編譯proto文件,需安裝“Protobuf Support”插件,還需引入grpc的依賴,完整依賴如下:

 
 
 
 
  1.  
  2.     1.6.1 
  3.     3.17.3 
  4.  
  5.  
  6.  
  7.      
  8.         com.google.protobuf 
  9.         protobuf-java 
  10.         ${protobuf.version} 
  11.      
  12.      
  13.      
  14.         io.grpc 
  15.         grpc-netty 
  16.         ${grpc.version} 
  17.         provided 
  18.      
  19.      
  20.         io.grpc 
  21.         grpc-protobuf 
  22.         ${grpc.version} 
  23.         provided 
  24.      
  25.      
  26.         io.grpc 
  27.         grpc-stub 
  28.         ${grpc.version} 
  29.         provided 
  30.      
  31.  
  32.  
  33.      
  34.          
  35.             kr.motd.maven 
  36.             os-maven-plugin 
  37.             1.5.0.Final 
  38.          
  39.      
  40.      
  41.          
  42.             org.xolstice.maven.plugins 
  43.             protobuf-maven-plugin 
  44.             0.5.0 
  45.              
  46.                 com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} 
  47.                 grpc-java 
  48.                 io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} 
  49.              
  50.              
  51.                  
  52.                      
  53.                         compile 
  54.                         compile-custom 
  55.                      
  56.                  
  57.              
  58.          
  59.      
  60.  

在執(zhí)行執(zhí)行maven compile命令進行編譯之前,將需要編譯的proto文件放在與src/main/java同級目錄下的/src/main/proto目錄。

protobuf

此時將生成的Java復制到對應的包下即可。

業(yè)務應用

一切準備就緒,現(xiàn)在就來寫個例子使用對應的代碼了。

 
 
 
 
  1. public class Test { 
  2.  
  3.     public static void main(String[] args) throws InvalidProtocolBufferException { 
  4.         Person.PersonProto sourcePersonProto = Person.PersonProto.newBuilder().setId(123).setName("Tom").build(); 
  5.  
  6.         // 序列化 
  7.         byte[] binaryInfo = sourcePersonProto.toByteArray(); 
  8.         System.out.println("序列化字節(jié)碼內容:" + Arrays.toString(binaryInfo)); 
  9.         System.out.println("序列化字節(jié)碼長度:" + binaryInfo.length); 
  10.  
  11.         System.out.println("-----------以下為接收方反序列化操作-------------"); 
  12.         // 反序列化 
  13.         Person.PersonProto targetPersonProto = Person.PersonProto.parseFrom(binaryInfo); 
  14.  
  15.         System.out.println("反序列化結果:" + targetPersonProto.toString()); 
  16.     } 

上述代碼就是基于生成的Person類的基本使用。首先通過,Person類中的內部類和Builder方法進行參數(shù)的封裝,然后調用其toByteArray方法,即可將報文信息進行序列化。接收方呢,有同樣的一套代碼,先獲得Person.PersonProto對象,然后執(zhí)行parseFrom方法即可進行反序列化操作。

為什么protobuf比較高效

單從序列化后的數(shù)據(jù)體積角度來分析。與XML、JSON這類文本協(xié)議相比,ProtoBuf通過T-(L)-V(TAG-LENGTH-VALUE)方式編碼,不需要", {, }, :等分隔符來結構化信息。同時在編碼層面使用varint壓縮,所以描述同樣的信息,protobuf序列化后的體積要小很多,在網(wǎng)絡中傳輸消耗的網(wǎng)絡流量更少,進而對于網(wǎng)絡資源緊張、性能要求非常高的場景,ProtoBuf協(xié)議是不錯的選擇。

做一個簡單直觀的例子:

 
 
 
 
  1. {"id":1,"firstName":"Chris","lastName":"Richardson","email":[{"type":"PROFESSIONAL","email":"aicchrrdson@email.com"}]} 

對于上面的JSON數(shù)據(jù),使用JSON序列化后的數(shù)據(jù)大小為118byte,而使用protobuf序列化后的數(shù)據(jù)大小為48byte。如果數(shù)據(jù)量更多,層次結構更復雜,差距還是很明顯的。

從序列化/反序列化速度角度,與XML、JSON相比,protobuf序列化/反序列化的速度更快,比XML要快20-100倍。

但protobuf是基于二進制的協(xié)議,編碼后的數(shù)據(jù)可讀性差,如果沒有idl文件,就無法理解二進制數(shù)據(jù)流,對調試不友好。

小結

本文帶大家從0到1學習了protobuf的使用步驟。很多文章之所以看不懂,就是因為沒有梳理清楚使用protobuf的整個核心邏輯。只要掌握了如何搭建環(huán)境、如何編寫數(shù)據(jù)結構、如何編譯、如何集成到項目中并運用。那么,protobuf的其他知識點逐步在實踐中補充即可。

隨著微服務的不斷發(fā)展,RPC框架為了追求高效的通信,使用像protobuf這類框架也必然是趨勢。也是想更好的學習微服務架構的底層的必備知識。

本文源碼:https://github.com/secbr/protobuf-demo


網(wǎng)頁標題:ProtocolBuffers,一款比Xml快100倍的序列化框架!
網(wǎng)頁地址:http://www.5511xx.com/article/djjephh.html