Golang快速實現一個簡單RPC服務

Ymq.發表於2020-09-25

基本概念

  • RPC(Remote Procedure Call)遠端過程呼叫,簡單的理解是一個節點請求另一個節點提供的服務,該協議允許執行於一臺計算機的程式呼叫另一臺計算機的子程式,而程式設計師無需額外地為這個互動作用程式設計,RPC最直接的作用就是微服務。

程式碼

實現一個簡單的服務呼叫,client呼叫server服務計算圓形的面積。

  • Client:
package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	// 1. 要呼叫的服務地址
	client, err := rpc.DialHTTP("tcp", "127.0.0.1:8181")
	if err != nil {
		panic(err.Error())
	}

	// 請求值
	var req float32 = 11

	// 2. 同步方式呼叫伺服器方法計算圓形的面積
	var resp *float32
	err = client.Call("MathUtil.CalculateCircleArea", req, &resp)
	if err != nil {
		panic(err.Error())
	}
	fmt.Println(*resp)
}

  • Server:
package main

import (
	"fmt"
	"math"
	"net"
	"net/http"
	"net/rpc"
)

type MathUtil struct{
}

// 該方法向外暴露:提供計算圓形面積的服務
func (mu *MathUtil) CalculateCircleArea(req float32, resp *float32) error {
	*resp = math.Pi * req * req
	return nil 
}

func main() {
	// 1. 初始化指標資料型別
	mathUtil := new(MathUtil)

	// 2. 呼叫net/rpc包的功能將服務物件進行註冊
	err := rpc.Register(mathUtil)
	if err != nil {
		panic(err.Error())
	}

	// 3. 通過該函式把mathUtil中提供的服務註冊到HTTP協議上,方便呼叫者可以利用http的方式進行資料傳遞
	rpc.HandleHTTP()

	//4、在特定的埠進行監聽
	listen, err := net.Listen("tcp", "127.0.0.1:8181")
	if err != nil {
		panic(err.Error())
	}
	fmt.Println("監聽地址: ", listen.Addr())
	http.Serve(listen, nil)
}

相關文章