《Go語言高級編程》RPC 入門

《Go語言高級編程》RPC 入門

一、什么是 RPC?

RPC(Remote Procedure Call,遠程過程調用)是分布式系統中不同節點間的通信方式,允許程序像調用本地函數一樣調用遠程服務的方法。
Go 語言的標準庫 net/rpc 提供了基礎的 RPC 實現,基于網絡(如 TCP)通信,支持服務注冊、方法調用和數據編碼。

二、RPC 版 “Hello, World” 示例
1. 服務端實現
// 定義服務類型及方法(需滿足 RPC 規則:公開方法、兩參數、第二參數為指針、返回 error)
type HelloService struct {}func (p *HelloService) Hello(request string, reply *string) error {*reply = "hello:" + requestreturn nil
}func main() {// 注冊服務,方法會被放在 "HelloService" 命名空間下rpc.RegisterName("HelloService", new(HelloService))// 監聽 TCP 連接listener, err := net.Listen("tcp", ":1234")if err != nil {log.Fatal("ListenTCP error:", err)}// 接受單個連接并提供服務conn, err := listener.Accept()if err != nil {log.Fatal("Accept error:", err)}rpc.ServeConn(conn)
}
2. 客戶端實現
func main() {// 撥號連接服務端client, err := rpc.Dial("tcp", "localhost:1234")if err != nil {log.Fatal("dialing:", err)}// 調用服務方法(參數:服務名.方法名、請求參數、響應指針)var reply stringerr = client.Call("HelloService.Hello", "hello", &reply)if err != nil {log.Fatal(err)}fmt.Println(reply) // 輸出:hello:hello
}
關鍵點說明:
  • RPC 方法規則:必須為公開方法(首字母大寫),有兩個可序列化參數,第二參數為指針,返回 error
  • 服務注冊rpc.RegisterName 將方法注冊到指定命名空間,便于客戶端調用。
  • 通信流程:服務端監聽連接,客戶端撥號后通過 Call 方法遠程調用。
三、更安全的 RPC 接口設計
1. 接口規范定義
// 定義服務名、接口和注冊函數,解耦服務實現與調用
const HelloServiceName = "path/to/pkg.HelloService"type HelloServiceInterface interface {Hello(request string, reply *string) error
}func RegisterHelloService(svc HelloServiceInterface) error {return rpc.RegisterName(HelloServiceName, svc)
}
2. 客戶端封裝
// 封裝客戶端接口,簡化調用并提供類型安全保障
type HelloServiceClient struct {*rpc.Client
}// 確保 HelloServiceClient 實現接口
var _ HelloServiceInterface = (*HelloServiceClient)(nil)func DialHelloService(network, address string) (*HelloServiceClient, error) {c, err := rpc.Dial(network, address)if err != nil {return nil, err}return &HelloServiceClient{Client: c}, nil
}func (p *HelloServiceClient) Hello(request string, reply *string) error {return p.Client.Call(HelloServiceName+".Hello", request, reply)
}
3. 客戶端調用(簡化版)
func main() {client, err := DialHelloService("tcp", "localhost:1234")if err != nil {log.Fatal("dialing:", err)}var reply stringerr = client.Hello("hello", &reply)if err != nil {log.Fatal(err)}fmt.Println(reply)
}
優勢:
  • 接口隔離:服務端和客戶端通過接口規范解耦,便于團隊分工。
  • 類型安全:編譯器確保服務實現和客戶端調用符合接口定義,減少錯誤。
  • 可維護性:服務名和方法名通過常量管理,避免硬編碼。
四、跨語言 RPC(基于 JSON 編碼)

Go 標準庫默認使用 gob 編碼(Go 特有),若需跨語言調用,可改用 JSON 編碼:

1. 服務端(JSON 版本)
func main() {rpc.RegisterName("HelloService", new(HelloService))listener, err := net.Listen("tcp", ":1234")if err != nil {log.Fatal("ListenTCP error:", err)}// 支持多個連接,每個連接使用 JSON 編解碼器for {conn, err := listener.Accept()if err != nil {log.Fatal("Accept error:", err)}go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))}
}
2. 客戶端(JSON 版本)
func main() {// 手動建立 TCP 連接conn, err := net.Dial("tcp", "localhost:1234")if err != nil {log.Fatal("net.Dial:", err)}// 使用 JSON 編解碼器創建客戶端client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))var reply stringerr = client.Call("HelloService.Hello", "hello", &reply)if err != nil {log.Fatal(err)}fmt.Println(reply)
}
3. 數據格式(JSON)
  • 請求格式{"method":"服務名.方法名","params":["參數"],"id":調用編號}
    示例:{"method":"HelloService.Hello","params":["hello"],"id":0}
  • 響應格式{"id":編號,"result":"結果","error":錯誤信息}
    示例:{"id":0,"result":"hello:hello","error":null}
跨語言原理:

通過標準 JSON 格式交換數據,任何支持 JSON 解析的語言(如 Python、Java)都可按此格式調用 Go 的 RPC 服務。

五、基于 HTTP 的 RPC

將 RPC 服務架設在 HTTP 協議上,便于與 Web 系統集成:

服務端實現
func main() {rpc.RegisterName("HelloService", new(HelloService))// 在 HTTP 路徑 /jsonrpc 處理 RPC 請求http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {// 構造 IO 讀寫器,適配 HTTP 請求和響應var conn io.ReadWriteCloser = struct {io.Writerio.ReadCloser}{ReadCloser: r.Body,Writer:     w,}rpc.ServeRequest(jsonrpc.NewServerCodec(conn))})http.ListenAndServe(":1234", nil)
}
客戶端調用(通過 curl)
curl localhost:1234/jsonrpc -X POST \--data '{"method":"HelloService.Hello","params":["hello"],"id":0}'
優勢:
  • 兼容性強:HTTP 是互聯網標準協議,支持瀏覽器、API 網關等多種客戶端。
  • 易于調試:可直接通過瀏覽器或 curl 工具測試 RPC 接口。
六、核心概念總結
  1. RPC 本質:封裝網絡通信,使遠程調用像本地函數調用一樣簡單。
  2. Go RPC 關鍵組件
    • 服務注冊rpc.RegisterName 綁定服務名與方法。
    • 編解碼器:默認 gob,跨語言可用 jsonrpc
    • 連接處理ServeConn(單連接)、ServeCodec(多連接)。
  3. 設計原則
    • 接口與實現分離,通過規范解耦服務端與客戶端。
    • 跨語言場景優先使用標準格式(如 JSON)編碼數據。

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

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

相關文章

第N5周:Pytorch文本分類入門

🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 一、前期準備 1.加載數據 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app項目本地打包運行,騰訊地圖報錯:‘鑒權失敗,請檢查你的key‘

根目錄下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"騰訊地圖申請的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】結構化面試開口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 結構化 面試 開口秘笈 目 錄 第一章 自我認知類 ........................................................................................................................... 2 第二章 工作關系處理類 .......…

Webpack 熱更新(HMR)原理詳解

&#x1f525; Webpack 熱更新&#xff08;HMR&#xff09;原理詳解 &#x1f4cc; 本文適用于 Vue、React 等使用 Webpack 的項目開發者&#xff0c;適配 Vue CLI / 自定義 Webpack 項目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…

MySQL索引完全指南

一、索引是什么&#xff1f;為什么這么重要&#xff1f; 索引就像字典的目錄 想象一下&#xff0c;你要在一本1000頁的字典里找"程序員"這個詞&#xff0c;你會怎么做&#xff1f; 沒有目錄&#xff1a;從第1頁開始一頁一頁翻&#xff0c;可能要翻500頁才能找到有…

學習使用dotnet-dump工具分析.net內存轉儲文件(2)

運行ShenNiusModularity項目&#xff0c;使用createdump工具dump完整的進程內存映射文件&#xff0c;然后運行dotnet-dump analyze命令加載dump文件。 ??可以先使用dumpheap命令顯示有關垃圾回收堆的信息和有關對象的收集統計信息。dumpheap支持多類參數&#xff08;如下所示…

Oracle BIEE 交互示例(一)同一分析內

Oracle BIEE 交互示例(一)同一分析內 1 示例背景2 實踐目標3 實操步驟3.1 創建數據集3.1.1 TEST_TABLE3.1.2 保存名字為【01 TEST_TABLE】3.2 創建分析3.2.1 創建列3.2.2 創建視圖3.2.2.1 數據透視表3.2.2.2 圖形3.2.2.3 表3.3 設置交互4 結果示例1 示例背景 版本:OBIEE 12…

使用API有效率地管理Dynadot域名,出售賬戶中的域名

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

Vite 打包原理詳解 + Webpack 對比

&#x1f680; Vite 打包原理詳解 Webpack 對比 &#x1f44b; 本文適合&#xff1a;Vite 使用者、Vue/React 工程師、希望搞清楚打包流程及與 Webpack 區別的開發者 &#x1f310; 技術背景&#xff1a;Vite 采用 ES Modules 原生瀏覽器能力驅動開發體驗&#xff0c;Webpack…

區塊鏈RWA(Real World Assets)系統開發全棧技術架構與落地實踐指南

一、技術架構設計&#xff1a;分層架構與模塊協同 1. 核心區塊鏈層 區塊鏈選型策略&#xff1a; 公鏈&#xff1a;以太坊主網&#xff08;安全性高&#xff0c;DeFi生態完備&#xff09; Polygon CDK&#xff08;Layer2定制化合規鏈&#xff0c;Gas費低至$0.003&#xff09;…

GBDT:梯度提升決策樹——集成學習中的預測利器

核心定位&#xff1a;一種通過串行集成弱學習器&#xff08;決策樹&#xff09;、以梯度下降方式逐步逼近目標函數的機器學習算法&#xff0c;在結構化數據預測任務中表現出色。 本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖…

Redis持久化機制深度解析:RDB與AOF全面指南

摘要 本文深入剖析Redis的持久化機制&#xff0c;全面講解RDB和AOF兩種持久化方式的原理、配置與應用場景。通過詳細的操作步驟和原理分析&#xff0c;您將掌握如何配置Redis持久化策略&#xff0c;確保數據安全性與性能平衡。文章包含思維導圖概覽、命令實操演示、核心原理圖…

CentOS7升級openssh10.0p2和openssl3.5.0詳細操作步驟

背景 近期漏洞掃描時&#xff0c;發現有很多關于openssh的相關高危漏洞&#xff0c;因此需要升級openssh的版本 升級步驟 由于openssh和openssl的版本是需要相匹配的&#xff0c;這次計劃將openssh升級至10.0p2版本&#xff0c;將openssl升級至3.5.0版本&#xff0c;都是目前…

fishbot隨身系統安裝nvidia顯卡驅動

小魚的fishbot是已經配置好的ubuntu22.04,我聽說在預先配置系統時需要勾選安裝第三方圖形化軟件&#xff0c;不然直接安裝會有進不去圖形化界面的風險&#xff0c;若沒有勾選&#xff0c;建議使用其他安裝方法&#xff0c;比如禁用系統自帶的驅動那套安裝流程 1.打開設置->關…

學習昇騰開發的第十天--ffmpeg推拉流

1、FFmpeg推流 注意&#xff1a;在推流之前先運行rtsp-simple-server&#xff08;mediamtx&#xff09; ./mediamtx 1.1 UDP推流 ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/stream 1.2 TCP推流 ffmpeg -re -i input.mp4 -c copy -rtsp_transport t…

成為一名月薪 2 萬的 web 安全工程師需要掌握哪些技能??

現在 web 安全工程師比較火&#xff0c;崗位比較稀缺&#xff0c;現在除了一些大公司對學歷要求嚴格&#xff0c;其余公司看中的大部分是能力。 有個親戚的兒子已經工作 2 年了……當初也是因為其他的行業要求比較高&#xff0c;所以才選擇的 web 安全方向。 資料免費分享給你…

Pytorch8實現CNN卷積神經網絡

CNN卷積神經網絡 本章提供一個對CNN卷積網絡的快速實現 全連接網絡 VS 卷積網絡 全連接神經網絡之所以不太適合圖像識別任務&#xff0c;主要有以下幾個方面的問題&#xff1a; 參數數量太多 考慮一個輸入10001000像素的圖片(一百萬像素&#xff0c;現在已經不能算大圖了)&…

平地起高樓: 環境搭建

技術選型 本小冊是采用純前端的技術棧模擬實現小程序架構的系列文章&#xff0c;所以主要以前端技術棧為主&#xff0c;但是為了模擬一個App應用的效果&#xff0c;以及小程序包下載管理流程的實現&#xff0c;我們還是需要搭建一個基礎的App應用。這里我們將選擇 Tauri2.0 來…

langgraph學習2 - MCP編程

3中通信方式&#xff1a; 目前sse用的很少 3.開發mcp框架 主流框架2個&#xff1a; MCP skd 官方 Fast Mcp V2 &#xff0c;&#xff08;V1捐給MCP 官方&#xff09; 大模型如何識別用哪個tools&#xff0c; 以及如何使用tools&#xff1a;

CSS 與 JavaScript 加載優化

&#x1f4c4; CSS 與 JavaScript 加載優化指南&#xff1a;位置、阻塞與性能 讓你的網頁飛起來&#xff01;&#x1f680; 本文詳細解析 CSS 和 JavaScript 標簽的放置位置如何影響頁面性能&#xff0c;涵蓋阻塞原理、瀏覽器機制和最佳實踐。掌握這些知識可顯著提升用戶體驗…