Dubbo基礎理解
Dubbo原理
什么是RPC
Dubbo框架
基本使用
基本底層原理
什么是RPC
維基百科定義:
遠程過程調用(英語:Remote Procedure Call,縮寫為 RPC)是一個計算機通信協議。該協議允許運行于一臺計算機的程序調用另一個地址空間(通常為一個開放網絡的一臺計算機)的子程序,而程序員就像調用本地程序一樣,無需額外地為這個交互作用編程(無需關注細節)。RPC是一種服務器-客戶端(Client/Server)模式,經典實現是一個通過發送請求-接受回應進行信息交互的系統。如果涉及的軟件采用面向對象編程,那么遠程過程調用亦可稱作遠程調用或遠程方法調用。
RPC協議:只是定義數據傳輸格式和傳輸方式,是一種應用層協議。
傳輸方式:有基于HTTP傳輸數據的RPC Over HTTP,也有基于TCP的RPC Over TCP等。
數據格式:雙方協商定義,一般包括以下幾點:
1、類名
2、方法名
3、參數類型(用來確定具體執行的方法,有方法重載)
4、參數值
Dubbo框架
dubbo是一種高性能、輕量級的開源Java RPC框架(最新官網稱為服務框架),支持多種協議,默認使用dubbo協議,也可以使用HTTP協議等。
使用dubbo協議時,傳輸方式使用Netty;
使用HTTP協議時,傳輸方式使用Tomcat;
基本使用
Dubbo實現主要包括:服務提供者(provide)、服務消費者(Comsumer)、注冊中心、監控中心組成
服務提供者
1、定義服務接口、提供接口實現類
// 接口(對外暴露的服務) public interface DemoService { String sayHello(String name); } // 接口實現類 public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello " + name; } }
1
2
3
4
5
6
7
8
9
10
2、配置對外暴露服務(dubbo-demo-provide.xml,也可以使用注解的方式實現)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3、provide啟動類
@SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
1
2
3
4
5
6
服務消費者
1、消費者配置(dubbo-consumer.xml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2、Consumer 啟動類
@SpringBootApplication public class ConsumerApplication{ public static void main(String[] args) throws Exception { SpringApplication.run(ConsumerApplication.class, args); DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理 String hello = demoService.sayHello("world"); // 執行遠程方法 System.out.println( hello ); // 顯示調用結果 } }
1
2
3
4
5
6
7
8
9
基本底層原理
Dubbo流程(粗略思路)
1、服務提供者提供接口、接口實現類(通過版本號區分多個實現類),對外暴露服務,通過共享注冊中心注冊服務(一般用zookeeper/redis)。
為什么要使用共享注冊中心?
由于服務消費者和服務提供者是分別啟動兩個JVM(兩個進程),所以需要使用共享注冊中心。注冊服務形式-服務名:List
2、啟動Tomcat容器或Netty服務器
需要HTTP/Netty客戶端,用來接收請求,需要HTTP/Netty服務端用來處理請求。
3、服務消費者讀取用戶配置(共享注冊中心注冊的服務)
服務路徑每次從共享注冊中心獲取,消耗網絡性能,所以先獲取存放至本地注冊中心緩存,數據保持同步。
數據保持同步:
4、定義數據傳輸類型(Invocation對象,序列化)
構造Invocation對象:指定參數列表、方法、參數、地址、接口
5、dubbo生成接口代理類放入spring容器,指定調用服務,發送請求
指定服務:考慮支持集群,在代理類中,從注冊中心獲取到的服務路徑List有多個,使用負載均衡指定最終訪問的服務。
為什么使用zookeeper/Redis作為共享注冊中心?
在集群情況下會存在多個服務器,新增服務器注冊中心需要添加服務路徑,服務器掛了需要剔除服務路徑,集群發生變化時zookeeper可以通過監聽機制(Redis利用消費訂閱機制)保證數據同步。
6、服務提供者接收處理請求
其他部分細節
多版本實現:對于多個實現類,服務提供者通過版本號區分(拼在服務名后),Dubbo中實現類使用@Service(version = “callback”)標識。
支持多個協議以及協議切換:可以使用工廠模式根據配置協議名使用指定協議。
新增協議:使用SPI機制。
集群集群變更:利用心跳機制監控集群,zookeeper可通過臨時節點(Redis可通過過期時間節點)來實現心跳,這也是為什么注冊中心使用zookeeper/Redis而不使用MySQL等的原因之二。
容錯:服務調用失敗可能是服務端調用失敗也有可能是網絡原因,Dubbo代理對象中捕獲異常,做相關的容錯處理。
Mock:服務未實現完,沒必要進行網絡請求,在發送之前可以做mock邏輯。
Dubbo TCP/IP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。