Dubbo-RPC基本原理
Dubbo-RPC基本原理
1:RPC介紹
RPC(Remote Procedure Call)遠端過程呼叫,簡單的理解是一個節點請求另一個節點提供的服務–程式級別
通過網路呼叫,發生了網路事件
2:dubbo介面呼叫的基礎
1:程式級別
我們的微服務都是部署在不同虛擬機器/容器中,是程式隔離的
2:通過socket呼叫
對於部署在不同虛擬機器或者不同容器中的服務,要是想發生資料通訊的話,肯定是要走網路的,那麼socker是跑不掉了
3:對socket進行封裝
對socket進行封裝的上層框架有很多中,我們可以使用JDK自帶的BIO,NIO,以及對NIO進行封裝的Netty
封裝型別 | 優點 | 缺點 |
---|---|---|
BIO | 實現起來簡單 | 存在著阻塞,效能不高 |
NIO | 效能高 | api眾多,實現起來比較麻煩,細節不好掌控 |
Netty | 操作起來簡單 | 暫無~ |
3程式碼環節
本例項基於jdk自帶的socket+原生BIO實現網路通訊做資料傳輸
1:基本原理
1:服務端開啟一個socketServer,等待客戶端的連線–阻塞住
2:客戶端連線socketServer
3:將要傳送的資料進行封裝,並通過socket進行傳送-- 序列化
4:服務端監聽到客戶端的socket連線,獲取引數,反序列化 -》A
5:將A作為引數進行方法執行,返回結果,通過objectOutputStream輸出
6:客戶端收到服務端發回的結果流,進行反序列化生成物件–》結束
2:服務提供者(provider)
public class ProviderApplication {
public static void main(String[] args) throws Exception{
UserService userService = new UserServiceImpl();
ServerSocket serverSocket = new ServerSocket(9999);
while (true){
Socket socket = serverSocket.accept();
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
UserDo userDo = (UserDo) objectInputStream.readObject();
System.out.println(userDo);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(userService.getUser(userDo.getId()));
}
}
}
3:服務消費者(consumer)
public class ConsumerApplication {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 9999);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
UserDo userDo = new UserDo();
userDo.setId(11L);
userDo.setName("朱成才");
userDo.setAge(22);
userDo.setSex(1);
objectOutputStream.writeObject(userDo);
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
UserDo userDo1 = (UserDo) objectInputStream.readObject();
System.out.println("獲取到伺服器返回的結果result:" + userDo1);
}
}
4:總結
本章節演示了dubbo的最底層的原理,設計到了 socket,序列化,反序列化,想起來早些年還是初級打工人在剛剛接觸dubbo的時候,因物件未實現序列化介面,導致報錯,排查了些許,當時通過百度解決了問題,後來在研讀dubbo原始碼的時候發現了原理,就是當物件沒有實現Serializable介面的時候,會丟擲NotSerializableException,本期程式碼還有很多優化空間,比如在介面呼叫的時候,程式碼寫死等問題,可以用動態代理解決,下一章見~
相關文章
- EF基本原理
- 02、基本原理
- scrapy基本原理
- HBase的基本原理
- SRAM的基本原理
- 反射的基本原理反射
- AQS的基本原理AQS
- XGBoost基本原理
- GoldenGate基本原理Go
- neutron的基本原理
- 代理的基本原理
- 四. RxJava之基本原理RxJava
- HTTP協議基本原理HTTP協議
- 圖說HDFS基本原理
- zookeeper的基本原理(二)
- io的基本原理-nio
- 泛型的基本原理泛型
- Windows提權基本原理Windows
- spring JUnit 基本原理Spring
- 交換機的基本原理
- 遷移學習基本原理遷移學習
- JAVA 註解的基本原理Java
- LSM儲存引擎基本原理儲存引擎
- k8s基本原理K8S
- 「譯」Flexbox 基本原理Flex
- 深入瞭解Kafka基本原理Kafka
- 前端路由跳轉基本原理前端路由
- 【js】Redux基本原理和使用JSRedux
- CDN運作的基本原理
- 全文檢索的基本原理
- 二叉樹基本原理二叉樹
- RxJava基本原理與使用(二)RxJava
- H264基本原理
- Spring IOC容器基本原理Spring
- Shared Pool 的基本原理
- 服務發現的基本原理
- Promise實現的基本原理(二)Promise
- Promise實現的基本原理(一)Promise