在大型系統演進中,業務拆分為多個子系統(用戶、交易、商品等)勢在必行。早期各子系統采用 Hessian、WebService、Socket、HTTP 等異構協議互調,導致整合困難、超時/加密/參數傳遞等問題頻發。高性能 RPC 中間件(HSF、Dubbo)應運而生。本文從零開始,通過代碼實現最簡單的 RPC 調用雛形。
HTTP 位於應用層(第 7 層),TCP 位於傳輸層(第 4 層)。越靠近底層,協議開銷越小,傳輸效率越高。RPC 追求極致性能,直接基于 TCP 構建自定義協議是標準選擇。
public class SocketServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
Socket socket = serverSocket.accept(); // 阻塞等待連接
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String line = in.readLine(); // 阻塞讀取
System.out.println("收到: " + line);
out.println("Echo: " + line);
in.close(); out.close(); socket.close();
}
}
}
public class SocketClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 9999);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
out.println(console.readLine());
System.out.println("服務端回應: " + in.readLine());
console.close(); in.close(); out.close(); socket.close();
}
}
痛點:accept()、read() 均為阻塞。併發多客戶端需為每個連接創建線程,線程開銷大,易導致服務器崩潰。
實際業務傳輸的是領域對象而非字符串。需實現 Serializable 接口,使用 ObjectOutputStream/ObjectInputStream 進行序列化/反序列化。
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name; private int age;
// 構造器、toString 省略
}
服務端用 ObjectInputStream.readObject() 接收,客戶端用 ObjectOutputStream.writeObject() 發送。測試成功輸出:Server: name=chengwei.lcw, age=28。
局限:Java 原生序列化體積大、速度慢、不支持跨語言。生產環境通常采用 Hessian、Protobuf、Kryo 等高性能序列化框架。
本系列將逐步拆解上述核心模塊,敬請期待後續文章。