協議支持
Dubbo支持多種協議,如下所示:
- Dubbo協議
- Hessian協議
- HTTP協議
- RMI協議
- WebService協議
- Thrift協議
- Memcached協議
- Redis協議
在通信過程中,不同的服務等級一般對應着不同的服務質量,那么選擇合適的協議便是一件非常重要的事情。你可以根據你應用的創建來選擇。例如,使用RMI協議,一般會受到防火牆的限制,所以對於外部與內部進行通信的場景,就不要使用RMI協議,而是基於HTTP協議或者Hessian協議。
dubbo服務不支持File文件類型的參數,遠程調用是這樣的:接口調用實際就是數據的發送過程,File 這樣的類型是不能夠序列化的,因為File 不是數據,只是一個磁盤文件的抽象。
解決方案:
- 使用hessian協議進行傳輸 (參照dubbo 官網,或者搜索dubbo hessian )
- 將文件轉換成byte[]繼續使用dubbo協議(這種情況一般用於上傳文件跟業務有關聯)
我們這里使用hessian協議進行傳輸(當然也可以轉換成byte[]繼續使用dubbo協議)
下面是需要進行的配置
customer
需要引入hessian的包
provider
pom.xml 需要引入 hessian,jetty的包(Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現)
provider.xml 需要配置hessian協議,並給service設置
其中 就是默認的 server="jetty", 如果設置server="servlet",則需要web容器支持,我們的provider是以jar方式運行的,所以不適用這種.
dubbo和hessiant特性
根據官方說明:Dubbo缺省協議采用單一長連接和NIO異步通訊,適合於小數據量大並發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況
Hessian協議用於集成Hessian的服務,Hessian底層采用Http通訊,采用Servlet暴露服務。適用場景:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。因此比較高效的做法是帶上傳下載文件的服務使用hessian協議,去普通的服務使用dubbo協議。
Hessian以InputStream 做參數注意事項
Hessian 以InputStream 做參數的原理: 首先hessian要求inputstream 參數只能是參數列表中的最后一個,客戶端順序發送各個參數,直到最后一個inputstream對象,讀取其內容,並寫入輸出流。
服務端獲取到請求輸入流后,按參數順序進行反序列化,直到遇到類型為InputStream的參數時,創建一個InputStream對象,實現InputStream的接口,其行為是從 輸入流讀取數據,該對象返回給開發者后就可以自由讀取流中剩余的數據了(也就是傳參時從inputstream讀取出的所有數據)。
對於返回值是InputStream的情況,有兩種,一種是返回值就是一個InputStream對象,則服務端從中讀取數據並寫入輸出流,和輸入參數為InputStream的情況類似。
另一種是返回一個對象,對象中包含InputStream類型的字段,這時一定要注意,InputStream字段一定是所有非基本類型字段里的最后一個,原因同入參的情況一樣。 另外就是inputstream類型字段不能超過1個。


