iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

理解 Go 的 RPC(遠程過程呼叫)

在分散式系統開發中,不同服務之間的通信是一個關鍵問題。為了實現跨服務的函數呼叫和數據傳遞,Go 語言提供了強大的 RPC(遠程過程呼叫)機制。

https://ithelp.ithome.com.tw/upload/images/20231002/20148157YMo9MTSxNU.png

https://ithelp.ithome.com.tw/upload/images/20231002/20148157DdVHCFrCHE.png

什麼是 RPC?

RPC是一種伺服器-客戶端(Client/Server)模式;遠程過程呼叫協議,允許程式在不同的機器進程之間通過簡單的函數呼叫進行通信。可以像呼叫本地函數一樣呼叫遠程函數,而不需要編寫繁瑣的網絡通信程式碼。Go 的標準庫中提供了一個強大的 RPC 包,使得實現遠程過程呼叫變得簡單而高效。

Go 的 RPC 運作原理

  • 服務定義:首先需要定義一個 服務接口,包含想要遠程呼叫的方法。這個接口通常存放在一個獨立的 .go 文件中。

  • 服務實現:接下來需要實現這個接口的具體方法,這些方法將在遠程機器上執行。這些實現通常存放在另一個文件中

  • 註冊服務:在主函數中需要實現註冊到 Go 的 RPC 系統中,使其可以被遠程呼叫。

  • 遠程調用:當你的客戶端需要調用遠程服務時,會建立連接並呼叫遠程方法,就像呼叫本地函數一樣。

package main

import (
	"log"
	"net"
	"net/rpc"
)

// 定義 Args 結構
type Args struct {
	A, B int
}

// 服務定義
type Arith interface {
	Multiply(args *Args, reply *int) error
}

// 服務實現
type ArithService struct{}

func (s *ArithService) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

// 主函數
func main() {
	arith := new(ArithService)
	rpc.Register(arith)

	// 創建 TCP 服務
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("Listen error:", err)
	}

	// 等待客戶端連接
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal("Accept error:", err)
		}
		go rpc.ServeConn(conn)
	}
}

這邊定義了一個簡單的 Arith 服務,該服務包含一個 Multiply 方法,用於計算兩個數字的乘積。然後註冊這個服務,並創建一個 TCP 服務,等待客戶端的連接。客戶端可以通過遠程呼叫 Multiply 方法來計算乘積,而不需要了解底層的網絡通信細節。

碎語

Golang 的 RPC 提供了一種簡單而高效的方式來實現遠程過程呼叫,並在分散式系統中實現不同服務之間的通信。


上一篇
16 | 起承轉合; 上下文
下一篇
18 | 簡單說 Protocol Buffers
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言