什麼是RPC框架,主流的RPC框架有哪些,Golang中如何實現RPC服務

什麼是RPC框架,主流的RPC框架有哪些,Golang中如何實現RPC服務

1. RPC協定簡介

1.1 什麼是RPC協議

  • RPC又叫遠端過程呼叫(Remote Procedure Call,RPC)是一個電腦通訊協議
  • RPC是一種使程式能夠在不同位址空間中執行子程序或服務的協定。透過RPC,程式可以像呼叫本地函數一樣呼叫遠端服務,從而隱藏了網路通訊的複雜性。
  • RPC協定允許一台電腦的程式呼叫另一台電腦的子程式。

1.2 為什麼需要RPC協議

  • 分散式系統支援:在分散式應用中,服務可能運行在不同的機器上,RPC簡化了它們之間的通訊。
  • 簡化開發:開發者可以專注於業務邏輯,而無需處理底層網路細節。
  • 模組化:允許將功能分散到多個服務中,方便維護和擴展。

1.3 RPC的優缺點

優點
  • 透明性:呼叫遠端服務的方式與呼叫本機服務類似,開發者無需關心底層實作。
  • 跨平台支援:不同系統和程式語言之間可以透過RPC進行通訊。
  • 易於擴展:可以輕鬆新增新的服務,而不影響現有服務。
缺點
  • 效能開銷:網路延遲和資料序列化/反序列化會增加回應時間。
  • 故障處理複雜度:網路問題、服務宕機等情況會導致呼叫失敗,需要額外處理。
  • 偵錯困難:遠端呼叫的錯誤比本地呼叫更難排查。

1.4 RPC協議的特點

  • 序列化:資料在傳輸前需要序列化為位元組流,以便於在網路上傳輸,常用的格式包括JSON、XML、Protocol Buffers等。
  • 同步與非同步:RPC可以是同步的(等待呼叫結果)或非同步的(立即返回,不等待結果)。
  • 狀態管理:RPC呼叫通常是無狀態的,但某些實作可以支援會話狀態。
  • 安全性:透過加密、認證等方式確保資料在傳輸過程中的安全性。

2. RPC框架

2.1 Dubbo

  • 簡介:Dubbo是Java開發的一個流行的RPC框架,廣泛應用於Java專案中,整合了大多數服務治理方面的一些元件,支援服務治理,多種序列化協議,支援多種註冊中心,自帶服務管理中心,缺點是早期不支援跨語言通信,主要應用於Java專案之中。目前最新版本version3.3,已經支援多種語言SDK。
  • 專案文件https://cn.dubbo.apache.org/zh-cn/overview/
  • Github位址https://github.com/apache/dubbo/

2.2 Motan

  • 簡介:Motan和Dubbo一樣也是Java開發的一個流行的RPC框架,廣泛應用於Java專案之中,和Dubbo框架一樣,早期不支援跨語言特性,後續版本增加了多語言版本,支援服務治理,多種序列化協議,支援多種註冊中心,自備服務管理中心,主要應用於Java專案之中。
  • 官方文檔https://github.com/weibocom/motan/wiki/zh_overview
  • Github網址:https://github.com/weibocom/motan

2.3 Thrift

  • 簡介:Thrift是一個跨語言輕量級RPC框架,最初是由Facebook開發維護,目前是由Apache開源維護,只支援Thrift協議,框架本身沒有實現服務治理和註冊元件,需要開發者自行整合。
  • 官方地址:https://thrift.apache.org/
  • Github位址https://github.com/apache/thrift

2.4 Grpc

  • 簡介:Grpc框架是由google開發開源,是一款語言中立、平台中立、開源的遠端過程呼叫系統,支援多語言,Grpc預設使用protocol buffers,是應用程式最廣泛的RPC框架,目前主流的應用程式大都支持和整合了Grpc服務接口,我們在實際開發和使用過程中一般是先定義proto文件,透過protoc來自動建立Grpc服務端。
  • 官方地址https://grpc.io/docs/
  • Github位址https://github.com/grpc/grpc

2.5 Rpcx

  • 簡介:Rpcx是由國人鳥窩開發維護的一個高性能Rpc框架,主要特點以簡單易用,根據文檔步驟可以很輕易的集成在自己的項目中,高性能,跨平台,多語言支持,框架層面集成了服務發現,服務治理相關功能。
  • 官方地址https://rpcx.io/
  • Github位址https://github.com/smallnest/rpcx

3. Golang中實現Rpc服務

在Golang中實現Rpc服務非常簡單,Golang官方以及一些第三方函式庫都提供了Rpc服務實作方式,接下來我們以Golang官方提供的net/rpc函式庫來簡單的實作一個Golang的Rpc服務。

3.1 net/rpc庫說明

  • 序列化協議net/rpc預設以encoding/gob進行資料序列化,Golang獨有序列化協議,其他開發語言暫不支持,因此以net/rpc庫開發的Rpc伺服器,支援Golang語言自己內部呼叫。
  • 其他序列化協定:為了多語言通信,GOlang官方在net/rpc包下提供了net/rpc/jsonrpc庫,支持以json的形式進行資料序列化,以實現Rpc服務跨語言呼叫。

3.2 基於net/rpc庫實現Rpc服務

3.2.1 Rpc服務端
package main import ( "log" "net/http" "net/rpc" ) // Golang基於net/rpc函式庫實作Rpc服務type Request struct { M int N int } type Server struct{} func (s *Server) Multiply (r Request, res *int) error { *res = rM * rN return nil } // main函式func main() { // 服務註冊serv := new(Server) // 註冊serv服務if err := rpc. Register(serv); err != nil { log.Panicf("register server error, %s\n", err) return } // 將serv服務綁定到Http服務上rpc.HandleHTTP() // 監聽HTTP服務if err := http.ListenAndServe("127.0.0.1:8081", nil); err != nil { log.Panicf("ListenAndServe error, %s\n", err) return } }
3.2.2 Rpc客戶端
package main import ( "fmt" "log" "net/rpc" ) type Request struct { M, N int } func main() { // 與遠端RPC服務建立連線conn, err := rpc.DialHTTP("tcp" , "127.0.0.1:8081") if err != nil { log.Panicf("DialHTTP error, %s\n", err) return } // 呼叫遠端方法res := 0 req := Request{ M: 10, N: 20, } if err = conn.Call("serv.Multiply", req, &res); err != nil { log.Panicf("Call func error, %s\n", err) return } fmt.Printf( "%d x %d = %d", req.M, req.N, res) }

4. 總結

主要介紹了什麼是RPC,RPC的優缺點;主流RPC框架介紹,Golang中如何借助官方net/rpc庫實現RPC服務於呼叫。下一篇我們一起來探討一下在Golang中如何借助Grpc實現RPC服務。

暫無評論

發送評論 編輯評論

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ°Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
顏文字
Emoji
小恐龍
花!
上一篇
下一篇
Rain ai 招募前蘋果硬體專家 jean didier allegrucci,推動更有效率的ai半導體研發. 劃?. Businesses can easily scale up or down their computing resources as needed, without having to invest in new.