Dubbo支持的通信協議:dubbo://(推薦)、rmi://、hessian://、http://、webservice://、thrift://、memcached://、redis://、rest://
1. Dubbo
Dubbo
協議爲默認協議,採用單一長連接和NIO異步通信,基於Hessian
作爲序列化協議。適合於小數據量(每次請求在100kb以內)大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。
Dubbo缺省協議不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。
- 連接個數:單連接
- 連接方式:長連接
- 傳輸協議:TCP
- 傳輸方式:NIO 異步傳輸
- 序列化:Hessian 二進制序列化
- 適用範圍:傳入傳出參數數據包較小(建議小於100K),消費者比提供者個數多,單一消費者無法壓滿提供者,儘量不要用 dubbo 協議傳輸大文件或超大字符串。
- 適用場景:常規遠程服務方法調用
2. RMI
RMI
協議採用 JDK 標準的java.rmi.*
實現,採用阻塞式短連接和JDK標準序列化方式。如果正在使用RMI提供服務給外部訪問 ,同時應用裏依賴了老的common-collections
包的情況下,存在反序列化安全風險。
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:TCP
- 傳輸方式:同步傳輸
- 序列化:Java 標準二進制序列化
- 適用範圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。
- 適用場景:常規遠程服務方法調用,與原生RMI服務互操作
3. Hessian
Hessian
協議用於集成Hessian的服務,Hessian底層採用HTTP通信,使用Servlet 暴露服務,Dubbo缺省內嵌Jetty作爲服務器實現。
Dubbo的Hessian協議可以和原生Hessian服務互操作,提供者用Dubbo的Hessian協議暴露服務,消費者直接用標準Hessian接口調用;或提供者用標準Hessian暴露服務,消費方用Dubbo的Hessian協議調用。
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:同步傳輸
- 序列化:Hessian二進制序列化
- 適用範圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。
- 適用場景:頁面傳輸,文件傳輸,或與原生Hessian服務互操作
數據類型:
- 原始二進制數據
- boolean
- 64-bit date(64 位毫秒值的日期)
- 64-bit double
- 32-bit int
- 64-bit long
- null
- UTF-8編碼的string
遞歸類型:
- list for lists and arrays
- map for maps and dictionaries
- object for objects
4. HTTP
使用Json序列化,基於HTTP表單的遠程調用協議。
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:同步傳輸
- 序列化:表單序列化
- 適用範圍:傳入傳出參數數據包大小混合,提供者比消費者個數多,可用瀏覽器查看,可用表單或URL傳入參數,暫不支持傳文件。
- 適用場景:需同時給應用程序和瀏覽器JS使用的服務。
5. WebService
基於WebService
的遠程調用協議,可以和原生WebService服務互操作,提供者用Dubbo的WebService協議暴露服務,消費者直接用標準WebService接口調用;或提供方用標準WebService暴露服務,消費方用Dubbo的WebService協議調用。
- 連接個數:多連接
- 連接方式:短連接
- 傳輸協議:HTTP
- 傳輸方式:同步傳輸
- 序列化:
SOAP
文本序列化 - 適用場景:系統集成,跨語言調用。
6. Thrift
當前Dubbo支持的Thrift協議是在原生協議的基礎上添加了一些額外的頭信息,比如 service name
,magic number
等。Dubbo使用Thrift協議同樣需要使用Thrift的IDL
編譯生成相應的Java代碼。