工作原理
- service 層:provider 和 consumer泡态,留給自己實現(xiàn)的接口
- config 層:配置文件
- proxy 層:代理層钻蹬,provider 和 comsumer dubbo 都會給生成代理,通過代理進行網(wǎng)絡(luò)通信
- registry 層:負(fù)責(zé)服務(wù)注冊與發(fā)現(xiàn)
- cluster 層:集群層掺栅,多個provider實例的路由、負(fù)載均衡等封裝成一個服務(wù)
- monitor 層:監(jiān)控層
- protocol 層: 遠(yuǎn)程調(diào)用層,封裝RPC調(diào)用法焰,負(fù)責(zé)具體的 provider 和 consumer 之間的網(wǎng)絡(luò)通信
- exchange 層:信息交換層
- transport 層:網(wǎng)絡(luò)傳輸層,抽象 mina 和 netty 為統(tǒng)一接口
- serialize 層:序列化
工作流程
通信協(xié)議
-
dubbo 協(xié)議:
- 單一長連接倔毙,NIO異步通信埃仪,基于 Hessian 序列化
- 適用場景:傳輸數(shù)據(jù)量小(每次請求100KB以內(nèi))陕赃,但是并發(fā)量很高
-
rmi 協(xié)議
- java 二進制序列化卵蛉,多個短鏈接
- 適用場景:消費者和提供者數(shù)量差不多,文件傳輸么库,較少用
-
hessian 協(xié)議
- hessian 序列化協(xié)議傻丝,多個短鏈接
- 適用場景:提供者比消費者數(shù)量還多,文件傳輸诉儒,較少用
-
http 協(xié)議
- json 序列化
-
webservice
- SOAP 文本序列化
序列化協(xié)議
hessian葡缰、JAVA二進制序列化、json忱反、SOAP文本序列化多種序列化協(xié)議泛释,默認(rèn)hessian
負(fù)載均衡策略
- random loadbalance:默認(rèn),隨機温算,按權(quán)重隨機分配怜校,權(quán)重越大,流量越大
- roundrobin loadbalance:輪詢注竿,默認(rèn)情況下會均勻的將流量打到各個機器上去茄茁,可以調(diào)整權(quán)重
- leastactive loadbalance:自動感知,性能越差巩割、越不活躍的接收的請求越少
- consistanthash loadbalance:一致性HASH算法裙顽,相同參數(shù)的請求一定分發(fā)到一個 provider 上去,provider 掛掉時喂分,均勻分配剩余的流量锦庸,如果是一個類請求都到一個節(jié)點,就走一致性HASH策略
容錯策略
- failover cluster:默認(rèn)蒲祈,失敗自動切換重試其他節(jié)點
- failfast cluster:立即失敗
- failsafe cluster:出現(xiàn)異常時忽略掉甘萧,常用于不重要的接口萝嘁,比如記錄日志
- failbackc cluster:失敗了后臺自動記錄請求,然后定時重發(fā),比較適合于寫消息隊列
- forking cluster:并行調(diào)用多個 provider,有一個成功就立即返回
- broadcacst cluster:逐個調(diào)用所有 provider
動態(tài)代理策略
默認(rèn)使用 javassist 動態(tài)字節(jié)碼生成扬卷,創(chuàng)建代理類
但是可以通過 spi 擴展機制配置自己的動態(tài)搭理策略
SPI 機制
service provider interface牙言,指定接口的實現(xiàn)類,這是 JAVA 提供的一個功能
dubbo 自己實現(xiàn)了一套 spi 機制怪得,微內(nèi)核咱枉,可插拔,大量的組件
Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
可以實現(xiàn)自己的組件徒恋,然后配置對應(yīng)的KEY
服務(wù)管理
- 調(diào)用鏈路自動生成
- 服務(wù)訪問壓力以及時長統(tǒng)計
- 其他的
- 服務(wù)分層(避免循環(huán)依賴)
- 調(diào)用鏈路失敗監(jiān)控和報警
- 服務(wù)鑒權(quán)
- 每個服務(wù)可用性監(jiān)控(接口調(diào)用成功率)