首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

RPC 本質深度解析:從 Socket 手寫到 Dubbo 服務治理演進

     編輯:Java 綜合教學

RPC 本質深度解析:從 Socket 手寫到 Dubbo 服務治理演進

一、RPC 核心本質:其實就是 Socket 通信

RPC(Remote Procedure Call)遠程過程調用,本質是客戶端通過 Socket 發送請求,告知服務端調用哪個類的哪個方法及參數,服務端執行後返回結果。無論框架多複雜,核心流程不變:

  1. 客戶端序列化調用信息(類名、方法名、參數類型、參數值)。
  2. 通過 Socket 發送到服務端。
  3. 服務端反序列化,利用反射創建實例、調用方法。
  4. 序列化結果返回客戶端。

二、手寫 Socket 實現最簡 RPC(教學示例)

1. 服務接口與實現

public interface SayHelloService {
    String sayHello(String name);
}

public class SayHelloServiceImpl implements SayHelloService {
    public String sayHello(String name) {
        return "intsmaze".equals(name) ? "intsmaze" : "bye bye";
    }
}

2. 服務提供者

public class Provider {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(1234);
        while (true) {
            Socket socket = server.accept();
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            String className = in.readUTF();
            String methodName = in.readUTF();
            Class[] paramTypes = (Class[]) in.readObject();
            Object[] args = (Object[]) in.readObject();

            Class clazz = Class.forName(className);
            Object instance = clazz.newInstance();
            Method method = clazz.getMethod(methodName, paramTypes);
            Object result = method.invoke(instance, args);

            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            out.writeObject(result);
            socket.close();
        }
    }
}

3. 服務消費者

public class Consumer {
    public static void main(String[] args) throws Exception {
        String className = "cn.intsmaze.tcp.two.service.SayHelloServiceImpl";
        String method = "sayHello";
        Class[] paramTypes = {String.class};
        Object[] args = {"intsmaze"};

        Socket socket = new Socket("127.0.0.1", 1234);
        ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
        out.writeUTF(className);
        out.writeUTF(method);
        out.writeObject(paramTypes);
        out.writeObject(args);

        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        Object result = in.readObject();
        System.out.println("調用結果:" + result);
        socket.close();
    }
}

三、簡單 RPC 面臨的問題與演進

問題解決方案演進形態
硬編碼服務地址,提供方變更需改消費方代碼引入服務註冊中心,服務名映射元數據服務註冊/發現
服務下線消費方不知情,調用失敗心跳檢測 + 臨時節點,自動剔除失效服務動態上下線
單點服務性能瓶頸服務集群 + 負載均衡算法服務路由/負載均衡
Nginx 反向代理單點故障、內網調用額外開銷消費端本地緩存服務列表 + 客戶端負載均衡去中心化負載均衡
服務列表變更如何通知消費端消費端監聽註冊中心節點變更,實時更新本地緩存服務變更推送

四、Dubbo 核心架構對應

  • 註冊中心:ZooKeeper / Nacos / Etcd,存儲服務元數據,臨時節點實現心跳檢測。
  • 服務提供者:啟動時註冊服務(接口名、IP、端口、權重等),心跳保活。
  • 服務消費者:訂閱服務,首次從註冊中心拉取列表緩存本地,後續走本地負載均衡(隨機、輪詢、一致性哈希等)。
  • 配置中心:動態調整路由規則、負載均衡策略、熔斷降級配置。
  • 監控中心:統計調用量、耗時、成功率等指標。

五、關鍵技術點總結

  1. 序列化協議:Hessian、Kryo、Protobuf、JSON,影響性能與跨語言能力。
  2. 通信協議:Dubbo 私有協議、HTTP/2、gRPC,基於 TCP 長連接 + Netty NIO。
  3. 服務治理:超時重試、熔斷降級、限流、優雅上下線、灰度發布。
  4. 集群容錯:Failover、Failfast、Failsafe、Failback、Forking 等策略。

六、總結

RPC 從 Socket 手寫到 Dubbo,核心邏輯始終是「網絡通信 + 序列化 + 反射調用 + 服務治理」。框架封裝了底層細節,提供高可用、高性能、易治理的分布式服務調用體驗。理解底層原理,才能在排查疑難雜症、調優性能、二次開發時游刃有餘。

RPC 架構演進示意圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved