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

golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc

 更新時(shí)間:2024年01月14日 10:35:52   作者:lianxuhanshu_  
這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫(kù)實(shí)現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下

項(xiàng)目左側(cè)包結(jié)構(gòu)

rpc服務(wù)端實(shí)現(xiàn)

使用golang官方的net/rpc庫(kù)實(shí)現(xiàn)RPC方法,使用http作為RPC的載體,通過http/net包監(jiān)聽客戶端連接請(qǐng)求。

rpc服務(wù)端實(shí)現(xiàn)代碼serverrpc.go如下

package main
 
import (
	"errors"
	"fmt"
	"log"
	"net"
	"net/http"
	"net/rpc"
	"os"
)
 
// 運(yùn)算結(jié)構(gòu)體
type Arith struct {
}
 
// 運(yùn)算請(qǐng)求結(jié)構(gòu)體
type ArithRequest struct {
	A int
	B int
}
 
// 運(yùn)算響應(yīng)結(jié)構(gòu)體
type ArithResponse struct {
	Pro int  //product 表示乘積
	Quo int  //quotient 表示商
	Rem int  //remaind 表示余數(shù)
}
 
/*
	運(yùn)算結(jié)構(gòu)體的乘法運(yùn)算方法
	第一個(gè)參數(shù)只需要拿到其里面的值只需要傳一個(gè)結(jié)構(gòu)體即可,
	第二個(gè)參數(shù)需要將運(yùn)算結(jié)果存到其里面所以需要傳地址
*/
func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
	res.Pro = req.A * req.B
	return nil
}
 
/*
	運(yùn)算結(jié)構(gòu)體的除法運(yùn)算方法 
	第一個(gè)參數(shù)只需要拿到其里面的值只需要傳一個(gè)結(jié)構(gòu)體即可,
	第二個(gè)參數(shù)需要將運(yùn)算結(jié)果存到其里面所以需要傳地址
*/ 
func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
	if req.B == 0 {  //除法為0,運(yùn)算不合法
		return errors.New("divide by zero")
	}
	res.Quo = req.A / req.B
	res.Rem = req.A % req.B
	return nil
}
func main() {
	rpc.Register(new(Arith)) //注冊(cè)rpc服務(wù)
	rpc.HandleHTTP()         //采用http作為rpc的載體
 
	lis, err := net.Listen("tcp", "127.0.0.1:8090") //Listen是block(阻塞的)
	if err != nil {
		log.Fatalln("fatal error:", err)
	}
	fmt.Fprintf(os.Stdout, "%s", "start connection")
	http.Serve(lis, nil) //net.Listen是阻塞的,需要通過這里進(jìn)行啟動(dòng)
}

rpc客戶端實(shí)現(xiàn)

上述服務(wù)端程序運(yùn)行之后,將會(huì)監(jiān)聽本地的8090端口,我們可以實(shí)現(xiàn)一個(gè)客戶端程序,連接服務(wù)端并且實(shí)現(xiàn)RPC方法調(diào)用。

rpc客戶端實(shí)現(xiàn)代碼clientrpc.go如下

package main
 
import (
	"fmt"
	"log"
	"net/rpc"
)
 
// 算數(shù)運(yùn)算請(qǐng)求結(jié)構(gòu)體
type ArithRequest struct {
	A int
	B int
}
 
// 算數(shù)運(yùn)算響應(yīng)結(jié)構(gòu)體
type ArithResponse struct {
	Pro int  //product 乘積
	Quo int  //quotient 商
	Rem int  //remain 余數(shù)
}
 
func main() {
	//通過網(wǎng)絡(luò)實(shí)現(xiàn)rpc遠(yuǎn)程進(jìn)程調(diào)用
	conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8090") 
	if err != nil {
		log.Fatalln("dailing error", err)
	}
 
	req := ArithRequest{9, 2}  //請(qǐng)求結(jié)構(gòu)體
	var res ArithResponse    //響應(yīng)結(jié)構(gòu)體,用于存儲(chǔ)運(yùn)算結(jié)果
 
	//實(shí)現(xiàn)rpc之后,通過Call方法在客戶端調(diào)用服務(wù)端里面算數(shù)運(yùn)算結(jié)構(gòu)體的乘法運(yùn)算方法
	err = conn.Call("Arith.Multiply", req, &res)
	if err != nil {
		log.Fatalln("arith error", err)
	}
	fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
 
	//實(shí)現(xiàn)rpc之后,通過Call方法在客戶端調(diào)用服務(wù)端里面算數(shù)運(yùn)算結(jié)構(gòu)體的除法運(yùn)算方法
	err = conn.Call("Arith.Divide", req, &res)
	if err != nil {
		log.Fatalln("arith error", err)
	}
	fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
}

詳細(xì)實(shí)現(xiàn)步驟

1.首先初始化項(xiàng)目

go mod init pro01  //pro01表示項(xiàng)目名稱

2.在當(dāng)前項(xiàng)目下新建包server,并且在該包下面新建serverrpc.go實(shí)現(xiàn)rpc服務(wù)端

3.在當(dāng)前項(xiàng)目下新建包c(diǎn)lient,并且在該包下面新建clientrpc.go實(shí)現(xiàn)rpc客戶端

4.運(yùn)行rpc服務(wù)端程序 ,首先進(jìn)入server包,然后運(yùn)行serverrpc.go

cd server
go run serverrpc.go

5.運(yùn)行rpc客戶端程序,首先進(jìn)入client包,然后運(yùn)行clientrpc.go

cd client
go run clientrpc.go

6.查看輸出結(jié)果是否正確,輸出結(jié)果如下表示程序運(yùn)行結(jié)果正確,當(dāng)然我這里的結(jié)果是根據(jù)我在請(qǐng)求結(jié)構(gòu)體里面給出的倆個(gè)數(shù)值進(jìn)行計(jì)算的,具體結(jié)果是否正確根據(jù)自己的具體程序判斷。

總結(jié)

通過官方庫(kù)net/rpc實(shí)現(xiàn)rpc遠(yuǎn)程進(jìn)程調(diào)用非常方便,并且實(shí)現(xiàn)還是比較簡(jiǎn)單的,但是有一個(gè)缺點(diǎn)就是不能跨平臺(tái)。 

到此這篇關(guān)于golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc的文章就介紹到這了,更多相關(guān)go rpc內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go1.21中slog日志包用法入門

    go1.21中slog日志包用法入門

    go1.21中,slog這一被Go語(yǔ)言團(tuán)隊(duì)精心設(shè)計(jì)的結(jié)構(gòu)化日志包正式落地,本文將帶領(lǐng)讀者上手slog,體會(huì)其與傳統(tǒng)log的差異,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-09-09
  • 一文帶你了解Golang中select的實(shí)現(xiàn)原理

    一文帶你了解Golang中select的實(shí)現(xiàn)原理

    select是go提供的一種跟并發(fā)相關(guān)的語(yǔ)法,非常有用。本文將介紹?Go?語(yǔ)言中的?select?的實(shí)現(xiàn)原理,包括?select?的結(jié)構(gòu)和常見問題、編譯期間的多種優(yōu)化以及運(yùn)行時(shí)的執(zhí)行過程
    2023-02-02
  • Go語(yǔ)言使用HTTP包創(chuàng)建WEB服務(wù)器的方法

    Go語(yǔ)言使用HTTP包創(chuàng)建WEB服務(wù)器的方法

    這篇文章主要介紹了Go語(yǔ)言使用HTTP包創(chuàng)建WEB服務(wù)器的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言基于HTTP包創(chuàng)建WEB服務(wù)器客戶端與服務(wù)器端的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • 基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題

    基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題

    這篇文章主要給大家介紹了使用Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問題,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • go語(yǔ)言實(shí)現(xiàn)mqtt協(xié)議的實(shí)踐

    go語(yǔ)言實(shí)現(xiàn)mqtt協(xié)議的實(shí)踐

    MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。本文主要介紹了go語(yǔ)言實(shí)現(xiàn)mqtt協(xié)議的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 線上golang grpc服務(wù)資源泄露問題排查

    線上golang grpc服務(wù)資源泄露問題排查

    這篇文章主要介紹了線上golang grpc服務(wù)資源泄露問題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Golang 基礎(chǔ)之函數(shù)使用(匿名遞歸閉包)實(shí)例詳解

    Golang 基礎(chǔ)之函數(shù)使用(匿名遞歸閉包)實(shí)例詳解

    這篇文章主要為大家介紹了Golang 基礎(chǔ)之函數(shù)使用(匿名遞歸閉包)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 構(gòu)建Golang應(yīng)用最小Docker鏡像的實(shí)現(xiàn)

    構(gòu)建Golang應(yīng)用最小Docker鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了構(gòu)建Golang應(yīng)用最小Docker鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Golang 限流器的使用和實(shí)現(xiàn)示例

    Golang 限流器的使用和實(shí)現(xiàn)示例

    這篇文章主要介紹了Golang 限流器的使用和實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析

    如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析

    這篇文章主要為大家介紹了如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

天津市| 凉城县| 白银市| 南部县| 唐河县| 布尔津县| 西青区| 绥芬河市| 巧家县| 镶黄旗| 苏尼特右旗| 娱乐| 开鲁县| 昭通市| 曲靖市| 镇原县| 静海县| 什邡市| 西乌珠穆沁旗| 仪陇县| 鹤山市| 夏津县| 曲靖市| 磐安县| 天柱县| 新绛县| 武鸣县| 永和县| 河源市| 保德县| 扬州市| 电白县| 巴南区| 曲麻莱县| 通山县| 营山县| 尼玛县| 苍山县| 三明市| 叙永县| 奉新县|