Netty-整合Protobuf高性能數據傳輸
前言
本篇文章是Netty專題的第四篇,前面三篇文章如下:
上篇文章我們整合了kryo來進行數據的傳輸編解碼,今天將繼續學習使用Protobuf來編解碼。Netty對Protobuf的支持比較好,還提供了Protobuf的編解碼器,非常方便。
Protobuf介紹
GitHub地址:https://github.com/google/protobuf
Protobuf是google開源的項目,全稱 Google Protocol Buffers,特點如下:
支持跨平台多語言,支持目前絕大多數語言例如C++、C#、Java、pthyon等
高性能,可靠性高,google出品有保障
使用protobuf編譯器能自動生成代碼,但需要編寫proto文件,需要一點學習成本
Protobuf使用
Protobuf是將類的定義使用.proto文件進行描述,然後通過protoc.exe編譯器,根據.proto自動生成.java文件,然後將生成的.java文件拷貝到項目中使用即可。
在Github主頁我們下周Windows下的編譯器,可以在releases頁面下載:https://github.com/google/protobuf/releases
protoc.exe編譯器下載
下載完成之後放到磁碟上進行解壓,可以將protoc.exe配置到環境變數中去,這樣就可以直接在cmd命令行中使用protoc命令,也可以不用配置,直接到解壓後的protocin目錄下進行文件的編譯。
下面我們基於之前的Message對象來構建一個Message.proto文件。
syntax 聲明可以選擇protobuf的編譯器版本(v2和v3)
syntax="proto2";選擇2版本
syntax="proto3";選擇3版本
option java_outer_classname="MessageProto"用來指定生成的java類的類名。
message相當於c語言中的struct語句,表示定義一個信息,其實也就是類。
message裡面的信息就是我們要傳輸的欄位了,子段後面需要有一個數字編號,從1開始遞增
.proto文件定好之後就可以用編譯器進行編譯,輸出我們要使用的Java類,我們這邊不配置環境變數,直接到解壓包的bin目錄下進行操作
首先將我們的Message.proto文件複製到bin目錄下,然後在這個目錄下打開CMD窗口,輸入下面的命令進行編譯操作:
--java_out是輸出目錄,我們就輸出到當前目錄下,執行完之後可以看到bin目錄下多了一個MessageProto.java文件,把這個文件複製到項目中使用即可。
Nettty整合Protobuf
首先加入Protobuf的Maven依賴:
創建一個Proto的Server數據處理類,之前的已經不能用了,因為現在傳輸的對象是MessageProto這個對象。
改造服務端啟動代碼,增加protobuf編解碼器,是Netty自帶的,不用我們去自定義。
服務端改造完了,下面需要把客戶的的Handler和編解碼器也改成protobuf的就行了,廢話不多說,直接上代碼:
客戶的數據處理類:
最後一步就開始測試了,需要將客戶的發送消息的地方改成MessageProto.Message對象,代碼如下:
源碼參考:https://github.com/yinjihuan/netty-im
TAG:猿天地 |