Dubbo總體的使用和源碼分析,都在git上有體現(xiàn),參考git:https://github.com/apache/incubator-dubbo
本文主要是針對看過知識點,做下總結(jié)記錄。
Dubbo是SOA服務(wù)治理,
簡單的說就是對各個接口方法做管理,比如監(jiān)查,控制等操作。
這些操作不止是API接口,還可以頁面配置。
頁面配置可以看git:http://dubbo.apache.org/books/dubbo-admin-book/ops/dubbo-ops.html
API(主要是xml參數(shù)的配置)可以參考http://dubbo.apache.org/books/dubbo-user-book/demos/thread-model.html
總結(jié)下Dubbo的缺點,個人覺得比較明顯的地方,列舉了出來
a、服務(wù)提供方與調(diào)用方接口依賴方式太強:調(diào)用方對提供方的抽象接口存在強依賴關(guān)系,需要嚴格的管理版本依賴,才不會出現(xiàn)服務(wù)方與調(diào)用方的不一致導(dǎo)致應(yīng)用無法編譯成功等一系列問題;
?b、服務(wù)對平臺敏感,難以簡單復(fù)用:通常我們在提供對外服務(wù)時,都會以REST的方式提供出去,這樣可以實現(xiàn)跨平臺的特點。
Dubbo快速上手使用示例
1. 抽出公共接口
? 可以建立個小工程,寫個接口,打個小jar包,放到生產(chǎn)者和消費者中
2. 建立生產(chǎn)者
? 做兩件事:建立producer的xml,和啟動producer
3. 建立消費者
? 也是做兩件事:建立consumer的xml,和啟動consumer
CODE:
可以見官網(wǎng)文檔:http://dubbo.apache.org/books/dubbo-user-book/quick-start.html
示例:
producer.xml
consumer.xml
兩個角色找服務(wù)是根據(jù)com.alibaba.dubbo.examples.merge.api.MergeService類全路徑找的,與application name之類的屬性無關(guān)
Dubbo開發(fā)實現(xiàn),主要參見http://dubbo.apache.org/books/dubbo-user-book/demos/fault-tolerent-strategy.html
1. 啟動時檢查
? ? 默認就可以(true)
? ?
2. 集群容錯
? ? 這里提到了Invoker了,白話講就是對服務(wù)的抽象代理。
? ? 分為多種模式(快速失敗,失敗重試之類的),有不同的介紹
? ?
3. 負載均衡
? ? 調(diào)用機制。針對的是producer和consumer,可以精確Service(類)和方法
4. 線程模型
? ? 針對producer的線程池(不同類型),原理與jdk中的線程池一樣
5. 直連提供者
? ? 線上開發(fā)沒有用。簡單說就是Unit Test,繞過zk,測試接口服務(wù)。
6. 只訂閱
7. 只注冊
? ? 個人情況而言,這兩個在線上對我用處不大
8. 靜態(tài)服務(wù)
? ? 代碼控制producer的啟用禁用
9. 多協(xié)議
? ? 主要就是可以 長、短連接、http之類的配置
10.?多注冊中心
? ? producer和consumer 可以使用多個注冊組件服務(wù)
11. 服務(wù)分組
? ? 當一個接口有多種實現(xiàn)時,可以用 group 區(qū)分。
? ? 簡單說就是 consumer調(diào)用不同的producer ServiceImpl
12. 多版本
? ? 就是根據(jù)不同的pom值,取不同的接口、ServiceImpl
13. 分組聚合
? ? 就是從不同producer的ServiceImpl中,分別取結(jié)果
14. 參數(shù)驗證
? ? 攔截器,注解形勢,驗證參數(shù)的規(guī)則(非空,長短...)
15. 結(jié)果緩存
? ? consumer端緩存結(jié)果數(shù)據(jù)
16.?
另外開發(fā)拓展參考http://dubbo.apache.org/books/dubbo-dev-book/
======================
Dubbo用到的相關(guān)技術(shù)簡單講解
Hessian的使用
CODE
web.xml
-
- ????helloService
- ????com.caucho.hessian.server.HessianServlet
- ????
- ????????service-class
- ????????com.test.hessian.impl.BaseServiceImpl
- ????
-
-
-
- ????helloService
- ????/helloService
-
?- service
public interface BasicAPI {
public String hello();
}
public class BasicServiceImpl extends HessianServlet implements BasicAPI {
private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
}
public String hello()
{
return _greeting;
}
}
?- client
String url = "http://localhost/helloService";
HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);
System.out.println("hello(): " + basic.hello());
Hessian總結(jié)
Binary-RPC 是一種和 RMI 類似的遠程調(diào)用的協(xié)議,它和 RMI 的不同之處在于它以標準的二進制格式來定義請求的信息 ( 請求的對象、方法、參數(shù)等 ) ,這樣的好處是什么呢,就是在跨語言通訊的時候也可以使用。
來看下 Binary -RPC 協(xié)議的一次遠程通信過程:
1 、客戶端發(fā)起請求,按照 Binary -RPC 協(xié)議將請求信息進行填充;
2 、填充完畢后將二進制格式文件轉(zhuǎn)化為流,通過傳輸協(xié)議進行傳輸;
3 、接收到在接收到流后轉(zhuǎn)換為二進制格式文件,按照 Binary -RPC 協(xié)議獲取請求的信息并進行處理;
4 、處理完畢后將結(jié)果按照 Binary -RPC 協(xié)議寫入二進制格式文件中并返回。
=========
Hessian 是由 caucho 提供的一個基于 binary-RPC 實現(xiàn)的遠程通訊 library 。
1 、是基于什么協(xié)議實現(xiàn)的?
基于 Binary-RPC 協(xié)議實現(xiàn)。
2 、怎么發(fā)起請求?
需通過 Hessian 本身提供的 API 來發(fā)起請求。
3 、怎么將請求轉(zhuǎn)化為符合協(xié)議的格式的?
Hessian 通過其自定義的串行化機制將請求信息進行序列化,產(chǎn)生二進制流。
4 、使用什么傳輸協(xié)議傳輸?
Hessian 基于 Http 協(xié)議進行傳輸。
5 、響應(yīng)端基于什么機制來接收請求?
響應(yīng)端根據(jù) Hessian 提供的 API 來接收請求。
6 、怎么將流還原為傳輸格式的?
Hessian 根據(jù)其私有的串行化機制來將請求信息進行反序列化,傳遞給使用者時已是相應(yīng)的請求信息對象了。
7 、處理完畢后怎么回應(yīng)?
? ? ? ? ? ?? 處理完畢后直接返回, hessian 將結(jié)果對象進行序列化,傳輸至調(diào)用端。