dubbo原理第二章(dubbo的具體實現)
摘要:在第一章中我們粗略的介紹了一下分散式產生的過程、為什麼選擇dubbo,dubbo的總體框架實現,這一章中我們將會深入理解一下dubbo的具體實現
回顧:
概念:
dubbo的主要組成部分:
服務提供者(provider):
暴露服務的地方,啟動服務同時,向註冊中心註冊自己的服務
服務消費者(Consumer):呼叫遠端服務的服務消費方,服務消費者在啟動時,訂閱自己的服務,從提供服務者地址列表中,基於軟負載均衡演算法,選擇呼叫,如果呼叫失敗,再選用一臺呼叫
註冊中心:註冊中心返回服務提供者地址列表給消費者,如果有變化基於長連線推送變更給消費者
監控中心:服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時傳送一次統計資料到監控中心
服務容器:啟動、載入、執行服務提供者
簡單小實戰:
Task:
模組:訂單模組/使用者服務模組
任務:訂單服務呼叫使用者服務獲取使用者地址
步驟:
1.分包
三大模組:API包/order包/service包
服務介面和服務模型、異常均放在API包中
2.粒度:
服務介面應該儘可能大粒度,每個服務方法代表一個功能,而不是功能的一小步,因為Dubbo暫不支援分散式事務支援
寫到這裡突然發現自己初學Dubbo的一個誤區,總以為provider和consumer是連線的,現在看來完全不是,他倆並不接觸,而是依靠註冊中心進行呼叫
Spring Boot+Dubbo實現:
Tip1:引入Dubbo和curator依賴
Tip2:在provider/consume配置
provider:
application.properties(代替spring的xml配置) dubbo.application.name=gmall-user dubbo.registry.protocol=zookeeper dubbo.registry.address=192.168.67.159:2181 dubbo.scan.base-package=com.atguigu.gmall dubbo.protocol.name=dubbo application.name就是服務名,不能跟別的dubbo提供端重複 registry.protocol 是指定註冊中心協議 registry.address 是註冊中心的地址加埠號 protocol.name 是分散式固定是dubbo,不要改。 base-package 註解方式要掃描的包
Consume:
dubbo.application.name=gmall-order-web
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.67.159:2181
dubbo.scan.base-package=com.atguigu.gmall
dubbo.protocol.name=dubbo
註解:@Service(暴露服務)、@Reference(引用遠端服務)
Tip3:
SpringBoot與dubbo整合的三種方式:
* 1)、匯入dubbo-starter,在application.properties配置屬性,使用@Service【暴露服務】使用@Reference【引用服務】
* 2)、保留dubbo xml配置檔案;
* 匯入dubbo-starter,使用@ImportResource匯入dubbo的配置檔案即可
* 3)、使用註解API的方式:
* 將每一個元件手動建立到容器中,讓dubbo來掃描其他的元件
一個簡單的demo演示完畢
嘮叨一下高可用
1.zookeeper宕機與Dubbo直連
即使註冊中心宕機,還可以消費暴露的服務(本地快取)
dubbo直連:繞過註冊中心
2.叢集下dubbo負載均衡配置
策略:1.基於權重的隨機負載均衡機制
2.基於權重的輪詢負載均衡機制
3.最小活躍數負載均衡I(最快的伺服器)
4.一致性hash(對id進行判斷,方法名引數名一樣就落在同一臺機器)
整合hystrix,服務熔斷與降級處理
在伺服器壓力劇增的情況下,對一些服務和頁面不處理或簡單處理,保證核心資源模組的正常交易
具體實現:
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));
叢集容錯
—未完待續