首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 進程間通信 (IPC) 方案全解析:Socket、HTTP、Pipe、共享記憶體

     編輯:程式設計疑難解答

兩個獨立 Java 進程 (JVM) 需要通信,除了 Socket,還有哪些方案?本地通信安全性如何?本文系統梳理 Java IPC 技術棧,對比優劣與適用場景。

方案對比總覽

方案傳輸層跨主機效能複雜度適用場景
Socket (TCP)網路✅高中分散式服務、跨語言、標準化協議
HTTP/REST (HttpClient)HTTP over TCP✅中 (文本開銷)低 (成熟框架)微服務、Web 整合、防火牆友善
Unix Domain Socket核心管道 (檔案系統)❌ 僅本機極高 (無網路棧)中 (JNI/Netty/JEP 415)本機高效能微服務、Container 通信
Named Pipe (Windows)核心管道❌ 僅本機高中 (JNA/JNI)Windows 本機進程通信
Memory Mapped File (Mmap)共享記憶體❌ 僅本機極高 (零拷貝)高 (同步複雜)大數據交換、高頻低延遲
Java Pipe (PipedInputStream)JVM 內記憶體緩衝❌ 僅同 JVM 線程高低同進程線程間,非進程間
RMIJRMP/IIOP over TCP✅中 (序列化開銷)高 (Stub/Skeleton)傳統 Java 分散式、EJB
gRPCHTTP/2 + Protobuf✅極高中 (IDL 編譯)現代微服務、跨語言、強契約
Message Queue (Kafka/RabbitMQ)Broker 中轉✅高 (異步)中解耦、削峰、事件驅動架構

本地通信安全性:localhost 真的安全嗎?

風險

  • 本機用戶竊聽:同機器其他用戶進程可 tcpdump -i lo 抓包分析明文協議。
  • 端口掃描/偽造封包:本機惡意程式可連接開放埠、發送偽造資料。
  • 權限提升:若服務以高權限運行,本地提權漏洞可被利用。

防護措施

  1. 僅綁定 Loopback:serverSocket.bind(new InetSocketAddress("127.0.0.1", port)),拒絕外部介面連接。
  2. 傳輸層加密 (TLS/SSL):即使本地,也用 SSLServerSocket / Netty SSL,防竊聽與偽造。
  3. 應用層鑑權:Token、JWT、mTLS、共享密鑰簽名驗證每個請求。
  4. Unix Domain Socket + 檔案權限:Socket 檔案 chmod 600,僅擁有者可讀寫,OS 層面隔離。
  5. 防火牆規則:iptables -A INPUT -i lo -p tcp --dport PORT -j ACCEPT 明確允許,其餘拒絕。

選型決策樹

需要跨主機?
  ├─ 是 → 需要強契約/跨語言/高效能? → gRPC
  │         ├─ 簡單 REST 整合? → HTTP/REST (Spring Cloud OpenFeign / HttpClient)
  │         └─ 傳統 Java 體系? → RMI (不推薦新專案)
  └─ 否 (本機) → 極致效能/大數據/零拷貝? → Memory Mapped File (Chronicle Queue / Aeron)
                 ├─ 高效能、成熟生態? → Unix Domain Socket (Netty/JDK 16+ JEP 415)
                 ├─ Windows 環境? → Named Pipe (JNA)
                 └─ 簡單、開發快? → localhost Socket + TLS + Token (最通用、除錯易)

實作範例:本機 Socket + TLS (雙向認證)

// Server
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket server = (SSLServerSocket) ssf.createServerSocket(8443);
server.setNeedClientAuth(true); // 雙向認證
server.setEnabledCipherSuites(new String[]{"TLS_AES_256_GCM_SHA384"});

// Client
SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("127.0.0.1", 8443);
// 通信邏輯...

憑證生成:keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -keystore server.jks 等。

總結

  • Socket 只是 IPC 的一種,非唯一選擇。
  • 本地通信不等於安全,需主動加固 (綁定 loopback、TLS、鑑權、檔案權限)。
  • 現代架構首選 gRPC (跨機) 或 Unix Domain Socket/Mmap (本機高效能)。
  • 簡單專案:localhost Socket + TLS + Token 即兼顧安全、除錯易、生態成熟。

根據「跨主機否、效能要求、安全等級、團隊技術棧」四維度選型,避免過度設計或安全缺失。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved