Dubbo-RPC基本原理

ZoneTials發表於2020-12-06

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,本期程式碼還有很多優化空間,比如在介面呼叫的時候,程式碼寫死等問題,可以用動態代理解決,下一章見~