go使用rpc


RPC是遠程過程調用的縮寫(Remote Procedure Call),通俗地說就是調用遠處的一個函數,是分布式系統中不同節點間流行的通信方式。Go語言的標准庫提供了一個簡單的RPC實現

server端

構造一個Cqh類型,其中的Test方法用於測試打印功能

注意:Test方法必須滿足Go語言的RPC規則:

  • 方法只能有兩個可序列化的參數
  • 其中第二個參數是指針類型,並且返回一個error類型,同時必須是公開的方法。
func (p *Cqh) Test(request string, reply *string) error {
	*reply = "test:" + request
	return nil
}

服務端程序如下:

func main() {
	rpc.RegisterName("Cqh", new(Cqh))

	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("ListenTCP error", err)
	}

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal("Accept error:", err)
		}
		rpc.ServeConn(conn)
	}
}

其中rpc.Register函數調用會將對象類型中所有滿足RPC規則的對象方法注冊為RPC函數,所有注冊的方法會放在“Cqh”服務空間之下。然后我們建立非阻塞的TCP鏈接,通過rpc.ServeConn函數在該TCP鏈接上為對方提供RPC服務。

 

client端

Go語言的RPC庫最簡單的使用方式是通過Client.Call方法進行同步阻塞調用,該方法的實現如下:

func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error {
    call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done
    return call.Error
}

首先通過Client.Go方法進行一次異步調用,返回一個表示這次調用的Call結構體。然后等待Call結構體的Done管道返回調用結果。

客戶端程序如下:

package main

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

func main() {
	client, err := rpc.Dial("tcp", ":1234")
	if err != nil {
		log.Fatal("dialing", err)
	}

	var reply string

	err = client.Call("Cqh.Test", "hello", &reply)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(reply)
}

rpc.Dial撥號RPC服務,然后通過client.Call調用具體的RPC方法。在調用client.Call時,第一個參數是用點號鏈接的RPC服務名字和方法名字,第二和第三個參數分別我們定義RPC方法的兩個參數。

客戶端運行后輸出如下:

test:hello

 

由此以看出RPC的使用其實非常簡單


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM