自從在園子里,發(fā)表了兩篇如何基于Netty構建RPC服務器的文章:談談如何使用Netty開發(fā)實現(xiàn)高性能的RPC服務器、Netty實現(xiàn)高性能RPC服務器優(yōu)化篇之消息序列化 之后,收到了很多同行、園友們熱情的反饋和若干個優(yōu)化建議,于是利用閑暇時間,打算對原來NettyRPC中不合理的模塊進行重構,并且增強了一些特性,主要的優(yōu)化點如下:

  1. 在原來編碼解碼器:JDK原生的對象序列化方式、kryo、hessian,新增了:protostuff。
  2. 優(yōu)化了NettyRPC服務端的線程池模型,支持LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue,并擴展了多個線程池任務處理策略。
  3. RPC服務啟動、注冊、卸載支持,通過Spring中自定義的nettyrpc標簽進行統(tǒng)一管理。

現(xiàn)在重點整理一下重構思路、經(jīng)驗,記錄下來。對應源代碼代碼,大家可以查看我的開源github:https://github.com/tang-jie/NettyRPC 項目中的NettyRPC 2.0目錄。

在最早的NettyRPC消息編解碼插件中,我使用的是:JDK原生的對象序列化(ObjectOutputStream/ObjectInputStream)、Kryo、Hessian這三種方式,后續(xù)有園友向我提議,可以引入Protostuff序列化方式。經(jīng)過查閱網(wǎng)絡的相關資料,Protostuff基于Google protobuf,但是提供了更多的功能和更簡易的用法。原生的protobuff是需要數(shù)據(jù)結構的預編譯過程,需要編寫.proto格式的配置文件,再通過protobuf提供的工具翻譯成目標語言代碼,而Protostuff則省略了這個預編譯的過程。以下是Java主流序列化框架的性能測試結果(圖片來自網(wǎng)絡):

可以發(fā)現(xiàn),Protostuff序列化確實是一種很高效的序列化框架,相比起其他主流的序列化、反序列化框架,其序列化性能可見一斑。如果用它來進行RPC消息的編碼、解碼工作,再合適不過了?,F(xiàn)在貼出具體的Protostuff序列化編解碼器的實現(xiàn)代碼。

首先是定義Schema,這個是因為Protostuff-Runtime實現(xiàn)了無需預編譯對java bean進行protobuf序列化/反序列化的能力。我們可以把運行時的Schema緩存起來,提高序列化性能。具體實現(xiàn)類SchemaCache代碼如下: