最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go如何實(shí)現(xiàn)兩個(gè)程序遠(yuǎn)程調(diào)用

 更新時(shí)間:2026年03月16日 09:47:33   作者:我叫黑大帥  
net/rpc是Go語言中用于實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用的庫,允許兩個(gè)Go程序之間直接調(diào)用遠(yuǎn)程函數(shù),本文主要介紹了Go如何實(shí)現(xiàn)兩個(gè)程序遠(yuǎn)程調(diào)用,具有一定的參考價(jià)值,感興趣的可以了解一下

net/rpc 則是為了讓兩個(gè) Go 程序之間直接對話。

RPC 讓你在寫代碼時(shí),調(diào)用另一臺遠(yuǎn)程機(jī)器上的函數(shù),就像調(diào)用本地的函數(shù)一樣簡單。

Go 標(biāo)準(zhǔn)庫中的 net/rpc 目前處于凍結(jié)狀態(tài)(不再增加新功能)。在現(xiàn)代的實(shí)際工程中,大家通常會(huì)使用 gRPC 或 Kratos 等更強(qiáng)大的框架。

RPC 的核心規(guī)則

net/rpc 要求你的函數(shù)必須遵守特定的簽名格式,才能被遠(yuǎn)程調(diào)用。

  1. 方法所屬的類型必須是導(dǎo)出的(首字母大寫)。
  2. 方法本身必須是導(dǎo)出的(首字母大寫)。
  3. 方法必須有兩個(gè)參數(shù),且都必須是導(dǎo)出類型或內(nèi)置類型。
  4. 方法的第二個(gè)參數(shù)必須是指針(因?yàn)榉?wù)器要把結(jié)果寫回這個(gè)指針里)。
  5. 方法必須返回一個(gè) error 類型。
func (t *T) MethodName(args T1, reply *T2) error

常用 API

服務(wù)端 API

  • rpc.Register(rcvr any): 將你的結(jié)構(gòu)體注冊為 RPC 服務(wù)。結(jié)構(gòu)體名默認(rèn)就是服務(wù)名。
  • rpc.HandleHTTP(): 如果你想讓 RPC 走 HTTP 協(xié)議,調(diào)用這個(gè)注冊路由。
  • rpc.Accept(lis net.Listener): 如果你想走純 TCP 協(xié)議,用這個(gè)接收連接。

客戶端 API

  • rpc.Dial(network, address string): 連接遠(yuǎn)程 RPC 服務(wù)器(比如傳 "tcp", "localhost:1234")。
  • rpc.DialHTTP(network, address string): 連接走 HTTP 協(xié)議的 RPC 服務(wù)器。
  • client.Call(serviceMethod string, args any, reply any): 同步調(diào)用遠(yuǎn)程函數(shù)。程序會(huì)在這里等待結(jié)果返回。

實(shí)例:實(shí)現(xiàn)一個(gè)遠(yuǎn)程乘法計(jì)算器

提供方:

package main

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

// 1. 定義傳入的參數(shù)結(jié)構(gòu)體
type Args struct {
	A, B int
}

// 2. 定義服務(wù)結(jié)構(gòu)體
type MathService struct{}

// 3. 實(shí)現(xiàn)服務(wù)方法(嚴(yán)格遵守 5 條規(guī)則)
func (m *MathService) Multiply(args Args, reply *int) error {
	*reply = args.A * args.B
	fmt.Printf("服務(wù)端執(zhí)行:計(jì)算 %d * %d\n", args.A, args.B)
	return nil
}

func main() {
	// 實(shí)例化服務(wù)
	math := new(MathService)

	// 注冊 RPC 服務(wù),客戶端就可以通過 "MathService.Multiply" 來調(diào)用了
	rpc.Register(math)

	// 啟動(dòng) TCP 監(jiān)聽
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		panic(err)
	}
	fmt.Println("RPC 服務(wù)端已啟動(dòng),監(jiān)聽端口 1234...")

	// 接收請求并處理
	rpc.Accept(listener)
}

調(diào)用方:

package main

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

// 客戶端 需要定義一樣的參數(shù)結(jié)構(gòu)體
type Args struct {
	A, B int
}

func main() {
	// 1. 撥號連接 RPC 服務(wù)器
	client, err := rpc.Dial("tcp", "localhost:1234")
	if err != nil {
		log.Fatal("撥號失敗:", err)
	}
	defer client.Close()

	// 2. 準(zhǔn)備參數(shù)和接收結(jié)果的變量
	args := Args{A: 10, B: 20}
	var reply int

	// 3. 發(fā)起調(diào)用! 第一個(gè)參數(shù)是 "結(jié)構(gòu)體名.方法名"
	err = client.Call("MathService.Multiply", args, &reply)
	if err != nil {
		log.Fatal("調(diào)用失敗:", err)
	}

	fmt.Printf("調(diào)用成功!結(jié)果是: %d\n", reply)
}

到此這篇關(guān)于Go如何實(shí)現(xiàn)兩個(gè)程序遠(yuǎn)程調(diào)用的文章就介紹到這了,更多相關(guān)Go 程序遠(yuǎn)程調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang Gorm與數(shù)據(jù)庫完整性約束詳解

    golang Gorm與數(shù)據(jù)庫完整性約束詳解

    這篇文章主要介紹了golang Gorm與數(shù)據(jù)庫完整性約束詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go prometheus metrics條目自動(dòng)回收與清理方法

    Go prometheus metrics條目自動(dòng)回收與清理方法

    這篇文章主要為大家介紹了Go prometheus metrics條目自動(dòng)回收與清理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 最新評論

    连州市| 葫芦岛市| 翁源县| 利川市| 滁州市| 嘉峪关市| 石泉县| 定西市| 昌宁县| 桦南县| 黄梅县| 鄢陵县| 黄大仙区| 瓮安县| 阿克陶县| 鸡西市| 喀什市| 天长市| 南和县| 揭西县| 仪陇县| 冀州市| 宁都县| 凤庆县| 平舆县| 方城县| 南雄市| 南溪县| 台东县| 富民县| 都安| 东丽区| 伽师县| 改则县| 绩溪县| 江山市| 玉田县| 兴国县| 上虞市| 剑河县| 潮安县|