跨語言RPC:使用Java客戶端調用Go服務端的HTTP-RPC服務

在構建分布式系統時,實現不同編程語言之間的無縫通信是一個常見的需求。本文將詳細介紹如何使用Go語言創建一個HTTP-RPC服務,并通過Java客戶端進行遠程調用。我們將探索整個過程,包括服務端的實現、客戶端的編寫以及測試驗證。

一、背景介紹

RPC(Remote Procedure Call,遠程過程調用)允許程序像調用本地方法一樣調用位于網絡另一端的服務。雖然傳統的RPC機制通常依賴于特定的傳輸協議和序列化格式,但HTTP-RPC利用了廣泛支持的HTTP協議和JSON格式,使得跨語言、跨平臺的通信變得簡單而直接。

二、Go服務端實現

首先,我們使用Go語言來創建一個簡單的HTTP-RPC服務端。這個服務接收一個名字作為參數,并返回帶有問候語的消息。

package mainimport ("encoding/json""net/http"
)// 定義一個服務結構體,用于承載業務邏輯
type HelloService struct{}// 定義服務的方法,接收一個字符串參數,返回處理后的字符串
func (s *HelloService) Hello(request string) string {return "hello " + request
}func main() {// 注冊一個 HTTP 處理函數,路徑為 "/hello"http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {// 定義請求體的結構:{"name": "Bob"}var params struct {Name string `json:"name"`}// 解析請求中的 JSON 數據if err := json.NewDecoder(r.Body).Decode(&params); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 創建服務實例并調用方法service := &HelloService{}response := map[string]string{"message": service.Hello(params.Name)}// 設置響應頭為 JSON 格式w.Header().Set("Content-Type", "application/json")// 將結果編碼為 JSON 并發送給客戶端json.NewEncoder(w).Encode(response)})// 啟動 HTTP 服務,監聽本地 1234 端口http.ListenAndServe(":1234", nil)
}

關鍵點解釋:

  • Handler函數:定義了一個處理/hello路徑請求的handler函數,該函數解析請求體中的JSON數據,調用HelloServiceHello方法,并將結果編碼為JSON響應。
  • 監聽端口:服務端在1234端口上監聽HTTP請求。

代碼解析

代碼片段作用說明
type HelloService自定義的服務結構體,用于封裝遠程調用的邏輯
func (s *HelloService) Hello(...)這是一個“導出方法”,可以被外部調用
http.HandleFunc("/hello", ...)注冊一個 HTTP 路由處理器,當客戶端訪問?/hello?時觸發
json.NewDecoder(r.Body).Decode(&params)把客戶端發來的 JSON 請求體解析成結構體
map[string]string{"message": ...}構造一個返回值,包含處理后的結果
w.Header().Set(...), json.NewEncoder(w).Encode(...)設置響應頭并輸出 JSON 格式的響應內容
http.ListenAndServe(":1234", nil)啟動 HTTP 服務器,監聽 1234 端口

? 總結:Go 服務端本質上就是一個簡單的 HTTP 接口服務,接收 JSON 請求,執行本地方法,再返回 JSON 響應。

三、Java客戶端實現

接下來,我們將編寫一個Java客戶端來調用上述Go服務端提供的“Hello”服務。

import org.json.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;public class GoHttpRpcClient {public static void main(String[] args) throws Exception {// 指定服務端地址和端口String url = "http://127.0.0.1:1234/hello";// 構建請求數據 {"name": "Bob"}JSONObject jsonRequest = new JSONObject();jsonRequest.put("name", "Bob");// 打開連接HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();// 設置請求方式和頭部信息connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/json; utf-8");connection.setRequestProperty("Accept", "application/json");connection.setDoOutput(true);// 發送請求體try (OutputStream os = connection.getOutputStream()) {byte[] input = jsonRequest.toString().getBytes("utf-8");os.write(input, 0, input.length);}// 獲取響應碼int responseCode = connection.getResponseCode();// 判斷是否成功if (responseCode == HttpURLConnection.HTTP_OK) {// 讀取響應內容String response = readResponse(connection.getInputStream());JSONObject jsonResponse = new JSONObject(response);System.out.println("Success!");System.out.println("Response: " + jsonResponse.toString(2)); // 格式化輸出JSONif (jsonResponse.has("message")) {System.out.println("Message: " + jsonResponse.getString("message"));}} else {// 處理錯誤情況String errorResponse = readResponse(connection.getErrorStream());System.out.println("Error code: " + responseCode);System.out.println("Error response: " + errorResponse);}}// 輔助方法:讀取輸入流的內容private static String readResponse(InputStream inputStream) throws IOException {StringBuilder response = new StringBuilder();try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))) {String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}}return response.toString();}
}

關鍵點解釋:

  • 構造請求:使用org.json.JSONObject構建請求數據,并設置適當的HTTP頭信息。
  • 發送請求并處理響應:通過HttpURLConnection發送POST請求,并根據響應碼判斷是否成功,然后讀取并打印響應內容。

?代碼解析

代碼片段作用說明
JSONObject jsonRequest = new JSONObject()使用 JSON 庫構建請求體對象
jsonRequest.put("name", "Bob")添加字段,構造?{ "name": "Bob" }
HttpURLConnection connection = ...創建與服務端的 HTTP 連接
connection.setRequestMethod("POST")設置請求方法為 POST
connection.setRequestProperty(...)設置請求頭,告訴服務端我們發送的是 JSON 數據
OutputStream os = connection.getOutputStream()獲取輸出流,把請求體寫入網絡
int responseCode = connection.getResponseCode()獲取 HTTP 響應狀態碼
readResponse(...)自定義方法,讀取服務端返回的數據

? 總結:Java 客戶端模擬了一個標準的 HTTP POST 請求,發送 JSON 數據給 Go 服務端,并讀取返回的 JSON 結果。

四、測試與驗證

確保Go服務端正在運行后,執行Java客戶端程序。如果一切配置正確,你應該能夠看到類似以下的輸出結果:

Success!
Response: {"message": "hello Bob"
}
Message: hello Bob

這表明Java客戶端成功地調用了Go服務端的“Hello”方法,并收到了預期的響應。

五、總結

HTTP-RPC 的核心思想

角色功能
服務端(Go)接收 HTTP 請求,解析 JSON 輸入,執行本地方法,返回 JSON 輸出
客戶端(Java)構造 JSON 請求,發送 HTTP POST 請求,讀取并解析返回的 JSON 響應
關鍵點使用 HTTP 協議作為傳輸層,JSON 作為數據格式,實現跨語言通信

通過這篇文章,我們學習了如何使用Go語言構建一個HTTP-RPC服務端,并使用Java作為客戶端進行跨語言調用。這種方法不僅打破了語言之間的界限,還利用了HTTP這一通用協議,使得不同平臺和語言之間的集成變得更加簡單高效。

希望這篇博客能幫助你在實際項目中更好地應用HTTP-RPC技術,促進系統間的互聯互通。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85185.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CVPR2024遷移學習《Unified Language-driven Zero-shot Domain Adaptation》

摘要 本文提出了一個名為 Unified Language-driven Zero-shot Domain Adaptation(ULDA)的新任務設置,旨在使單一模型能夠適應多種目標領域,而無需明確的領域標識(domain-ID)知識。現有語言驅動的零樣本領域…

AI安全風險監測平臺:全周期防護體系構建

AI安全風險監測平臺通過構建全生命周期防護體系,實現對人工智能系統研發、部署、運行、迭代各階段的安全風險動態監測。該平臺融合算法審計、行為分析、合規驗證等核心能力,建立覆蓋模型安全、數據安全、應用安全的立體防御網絡,為智能系統提…

數據集-目標檢測系列- 杯子 數據集 bottle >> DataBall

數據集-目標檢測系列- 杯子 數據集 bottle >> DataBall 貴在堅持! * 相關項目 1)數據集可視化項目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)數據集訓練、推理相關…

視頻點播web端AI智能大綱(自動生成視頻內容大綱)的代碼與演示

通過AI技術將視頻課程自動生成結構化大綱和摘要,支持PPT教學視頻、企業內訓等場景應用。核心功能包括:自動匹配視頻知識點生成文本大綱、快速內容定位、降低課程制作成本。系統采用模塊化架構,包含Vue2.7前端組件、JS邏輯庫和演示項目&#x…

Linux: errno: EINPROGRESS-115

在connect接口的使用說明里,有這個錯誤:EINPROGRESS。 The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2…

Node.js特訓專欄-基礎篇:3. Node.js內置模塊的使用

🔥 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 Node.js內置模塊:強大功能的基石 在Node.js的世界里&#xff…

基于MATLAB實現的Capon、MUSIC、ESPRIT和PM算法進行DOA

使用Capon、MUSIC、ESPRIT和PM多種算法進行doa估計,通過譜峰搜索函數估計到達角,并使用蒙特卡洛方法估計各算法的RMSE。(可能計算時間較長,如需節省時間可以減小蒙特卡洛次數) PM.m , 574 RMSE.m , 274 TLS_ESPRIT.m …

某網站極驗4滑塊驗證碼逆向分析

文章目錄 1. 寫在前面2. 接口分析3. w逆向分析4. JSON參數分析5. 距離識別6. RSA純算還原7. AES純算還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于…

深入理解 C++ inline:三大語法特性 + 七大高頻考點全解析

一、什么是內聯函數 編譯器嘗試將 inline 函數的代碼直接插入調用處(類似宏展開),避免函數調用的壓棧、跳轉、返回等額外開銷。適用于短小頻繁調用的函數:如簡單的 getter/setter、數學運算等。inline 只是 建議,編譯…

Flink 與 Hive 深度集成

引言 在大數據生態中,Flink 的流批一體化處理能力與 Hive 的數據存儲分析優勢結合,通過 Flink Connector for Hive 實現無縫對接,能顯著提升數據處理效率。本文將系統解析 Flink 與 Hive 集成的核心操作,涵蓋配置、讀寫、優化全流…

Axios面試常見問題詳解

axios面試常問題目及其詳解 以下是前端面試中關于 Axios 的常見問題及詳細解答,涵蓋核心原理、實戰場景和進階優化,幫助你在面試中清晰展示技術深度。 1. Axios 是什么?它與原生 Fetch API 有何區別? 回答要點: Axi…

14.2 《3小時從零搭建企業級LLaMA3語言助手:GitHub配置+私有化模型集成全實戰》

3小時從零搭建企業級LLaMA3語言助手:GitHub配置私有化模型集成全實戰 關鍵詞:GitHub 倉庫配置, 項目初始化, 目錄結構設計, 私有化模型集成, 開發環境標準化 Fork 并配置 GitHub 項目倉庫 本節將手把手完成 LanguageMentor 項目的倉庫克隆、環境配置和…

生物制藥自動化升級:Modbus TCP與Ethernet/IP協議轉換實踐

為優化生物制藥生產流程,我司計劃將現有的Allen-Bradley PLC控制系統與新型生物反應器進行集成。由于兩者采用不同的通信協議(AB PLC使用Modbus TCP,而生物反應器支持Ethernet/IP),直接通信存在障礙。為此通過穩聯技術…

商業云手機核心優缺點分析

商業云手機核心優缺點分析,綜合技術性能、成本效率及場景適配性等多維度對比: 核心優勢? 成本革命? 硬件零投入?:免除實體手機采購(旗艦機均價6000元),企業百臺規模可省60萬 CAPEX。 彈性計費?&…

Windows 遠程桌面添加 SSL 證書指南

Windows 遠程桌面添加 SSL 證書指南 🧾 準備工作🔐 第一步:使用 Certbot 申請 SSL 證書📦 第二步:生成 PFX 格式證書文件📁 第三步:導入證書到 Windows 證書管理器🔒 第四步&#xf…

項目實訓技術實現——核心關鍵:基于二叉分割的布局生成算法

核心關鍵:基于二叉分割的布局生成算法 上一篇針對llava這種為每個元素分別預測每個元素的框的方法進行了分析,已經證實這條路難以行得通。因此,我們考慮直接按照板塊劃分整個背景布局,然后在板塊內,進一步劃分出我們需…

uniapp 配置devserver代理

在uniapp項目中配置devserver代理,需要先檢查用的vue版本。 vue3不能在manifest.json配置代理。 1.先檢查項目用的vue版本 找到manifest.json文件查看vue的版本。 2.vue2在manifest.json內配置 "h5" : { "devServer": { …

移動端 WebView 頁面性能調試實戰:WebDebugX等工具協同與優化

隨著移動互聯網的發展,越來越多的應用開始使用 WebView 加載網頁內容。然而,這種方式雖然能快速實現跨平臺開發,但也帶來了很多性能瓶頸,尤其是在移動端設備上。WebView 本身的性能限制、頁面加載慢、JS 執行阻塞等問題時常成為開…

臨時文件夾大量0字節xml問題排查

某天偶然打開我的c:\users\我的用戶名\AppData\Local\Temp 目錄,發現有很多0字節的.xml文件,你刪除以后一會還會大量產生,如下圖: 下載了ProcessMonitor,記錄了一會日志,查找*.xml發現是資源管理器在創建這…

突破微小目標檢測瓶頸:智能無人機在藍莓產量估算中的解決方案

【導讀】 本文提出了一種使用搭載計算機視覺的智能無人機估算藍莓產量的方法。系統利用兩個YOLO模型:一個檢測灌木叢,另一個檢測漿果。它們協同工作,智能控制無人機位置和角度,安全獲取灌木近景圖,實現精準的漿果計數…