RPC(Remote Procedure Call)遠程過程調用,本質是客戶端通過 Socket 發送請求,告知服務端調用哪個類的哪個方法及參數,服務端執行後返回結果。無論框架多複雜,核心流程不變:
public interface SayHelloService {
String sayHello(String name);
}
public class SayHelloServiceImpl implements SayHelloService {
public String sayHello(String name) {
return "intsmaze".equals(name) ? "intsmaze" : "bye bye";
}
}
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();
}
}
}
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();
}
}
| 問題 | 解決方案 | 演進形態 |
|---|---|---|
| 硬編碼服務地址,提供方變更需改消費方代碼 | 引入服務註冊中心,服務名映射元數據 | 服務註冊/發現 |
| 服務下線消費方不知情,調用失敗 | 心跳檢測 + 臨時節點,自動剔除失效服務 | 動態上下線 |
| 單點服務性能瓶頸 | 服務集群 + 負載均衡算法 | 服務路由/負載均衡 |
| Nginx 反向代理單點故障、內網調用額外開銷 | 消費端本地緩存服務列表 + 客戶端負載均衡 | 去中心化負載均衡 |
| 服務列表變更如何通知消費端 | 消費端監聽註冊中心節點變更,實時更新本地緩存 | 服務變更推送 |
RPC 從 Socket 手寫到 Dubbo,核心邏輯始終是「網絡通信 + 序列化 + 反射調用 + 服務治理」。框架封裝了底層細節,提供高可用、高性能、易治理的分布式服務調用體驗。理解底層原理,才能在排查疑難雜症、調優性能、二次開發時游刃有餘。