Dubbo服務 上傳文件解決方案以及Hessian協議


協議支持

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的包

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.7</version>
</dependency>

 

provider

pom.xml 需要引入 hessian,jetty的包(Hessian底層采用Http通訊,采用Servlet暴露服務,Dubbo缺省內嵌Jetty作為服務器實現)

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.7</version>
</dependency>
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.26</version>
</dependency>

 

provider.xml 需要配置hessian協議,並給service設置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
  http://www.springframework.org/schema/beans/spring-beans.xsd  
  http://code.alibabatech.com/schema/dubbo
  http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方應用信息,用於計算依賴關系 -->
    <dubbo:application name="provider" />

    <!-- 使用zookeeper注冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 監控中心 -->
    <dubbo:monitor protocol="registry" />

    <!-- 暴露服務 -->
    <dubbo:protocol name="dubbo" port="20886" />
    <dubbo:protocol name="hessian" port="20887"/>

    <dubbo:service interface="com.dingcheng.user.facade.UserFacade" ref="userFacade" />

    <!-- 需要指定hessian協議,否則會在上面設置的協議中隨機調用,就會一會成功一會失敗 -->
    <dubbo:service protocol="hessian" interface="com.dingcheng.user.facade.UploadFacade" ref="uploadFacade" />
</beans>

 

其中 就是默認的 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個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM