欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang?RPC的原理與簡(jiǎn)單調(diào)用詳解

 更新時(shí)間:2023年05月26日 08:41:22   作者:胡安民  
RPC(Remote?Procedure?Call),主要是幫助我們屏蔽網(wǎng)絡(luò)編程細(xì)節(jié)?,使我們更專(zhuān)注于業(yè)務(wù)邏輯,所以本文主要來(lái)和大家聊聊RPC的原理與簡(jiǎn)單調(diào)用,希望對(duì)大家有所幫助

RPC(Remote Procedure Call),主要是幫助我們屏蔽網(wǎng)絡(luò)編程細(xì)節(jié) ,是我們更專(zhuān)注于業(yè)務(wù)邏輯,實(shí)現(xiàn)調(diào)用遠(yuǎn)程方法就像調(diào)用本地方法一樣。

RPC通信過(guò)程

由服務(wù)提供者給出業(yè)務(wù)接口聲明,在調(diào)用方的程序里面,RPC 框架根據(jù)調(diào)用的服務(wù)接口提前生成動(dòng)態(tài)代理實(shí)現(xiàn)類(lèi),并通過(guò)依賴注入等技術(shù)注入到聲明了該接口的相關(guān)業(yè)務(wù)邏輯里面。該代理實(shí)現(xiàn)類(lèi)會(huì)攔截所有的方法調(diào)用,在提供的方法處理邏輯里面完成一整套的遠(yuǎn)程調(diào)用,并把遠(yuǎn)程調(diào)用結(jié)果返回給調(diào)用方,這樣調(diào)用方在調(diào)用遠(yuǎn)程方法的時(shí)候就獲得了像調(diào)用本地接口一樣的體驗(yàn)。

RPC設(shè)計(jì)組成

以下是對(duì)RPC的四種角色的解釋和說(shuō)明:

客戶端(Client): 服務(wù)調(diào)用發(fā)起方,也稱(chēng)為服務(wù)消費(fèi)者。

客戶端存根(Client Stub): 該程序運(yùn)行在客戶端所在的計(jì)算機(jī)機(jī)器上,主要用來(lái)存儲(chǔ)要調(diào)用的服務(wù)器的地址,另外,該程序還負(fù)責(zé)將客戶端請(qǐng)求遠(yuǎn)端服務(wù)器程序的數(shù)據(jù)信息打包成數(shù)據(jù)包,通過(guò)網(wǎng)絡(luò)發(fā)送給服務(wù)端Stub程序;其次,還要接收服務(wù)端Stub程序發(fā)送的調(diào)用結(jié)果數(shù)據(jù)包,并解析返回給客戶端。

服務(wù)端(Server): 遠(yuǎn)端的計(jì)算機(jī)機(jī)器上運(yùn)行的程序,其中有客戶端要調(diào)用的方法。

服務(wù)端存根(Server Stub): 接收客戶Stub程序通過(guò)網(wǎng)絡(luò)發(fā)送的請(qǐng)求消息數(shù)據(jù)包,并調(diào)用服務(wù)端中真正的程序功能方法,完成功能調(diào)用;其次,將服務(wù)端執(zhí)行調(diào)用的結(jié)果進(jìn)行數(shù)據(jù)處理打包發(fā)送給客戶端Stub程序。

RPC原理和調(diào)用步驟

實(shí)際上,如果我們想要在網(wǎng)絡(luò)中的任意兩臺(tái)計(jì)算機(jī)上實(shí)現(xiàn)遠(yuǎn)程調(diào)用過(guò)程,要解決很多問(wèn)題,比如:

  • 兩臺(tái)物理機(jī)器在網(wǎng)絡(luò)中要建立穩(wěn)定可靠的通信連接。
  • 兩臺(tái)服務(wù)器的通信協(xié)議的定義問(wèn)題,即兩臺(tái)服務(wù)器上的程序如何識(shí)別對(duì)方的請(qǐng)求和返回結(jié)果。也就是說(shuō)兩臺(tái)計(jì)算機(jī)必須都能夠識(shí)別對(duì)方發(fā)來(lái)的信息,并且能夠識(shí)別出其中的請(qǐng)求含義和返回含義,然后才能進(jìn)行處理。這其實(shí)就是通信協(xié)議所要完成的工作。

我們來(lái)看看RPC具體是如何解決這些問(wèn)題的,RPC具體的調(diào)用步驟圖如下:

在上述圖中,通過(guò)1-10的步驟圖解的形式,說(shuō)明了RPC每一步的調(diào)用過(guò)程。具體描述為:

1、客戶端想要發(fā)起一個(gè)遠(yuǎn)程過(guò)程調(diào)用,首先通過(guò)調(diào)用本地客戶端Stub程序的方式調(diào)用想要使用的功能方法名;

2、客戶端Stub程序接收到了客戶端的功能調(diào)用請(qǐng)求,將客戶端請(qǐng)求調(diào)用的方法名,攜帶的參數(shù)等信息做序列化操作,并打包成數(shù)據(jù)包。

3、客戶端Stub查找到遠(yuǎn)程服務(wù)器程序的IP地址,調(diào)用Socket通信協(xié)議,通過(guò)網(wǎng)絡(luò)發(fā)送給服務(wù)端。

4、服務(wù)端Stub程序接收到客戶端發(fā)送的數(shù)據(jù)包信息,并通過(guò)約定好的協(xié)議將數(shù)據(jù)進(jìn)行反序列化,得到請(qǐng)求的方法名和請(qǐng)求參數(shù)等信息。

5、服務(wù)端Stub程序準(zhǔn)備相關(guān)數(shù)據(jù),調(diào)用本地Server對(duì)應(yīng)的功能方法進(jìn)行,并傳入相應(yīng)的參數(shù),進(jìn)行業(yè)務(wù)處理。

6、服務(wù)端程序根據(jù)已有業(yè)務(wù)邏輯執(zhí)行調(diào)用過(guò)程,待業(yè)務(wù)執(zhí)行結(jié)束,將執(zhí)行結(jié)果返回給服務(wù)端Stub程序。

7、服務(wù)端Stub程序?qū)⒊绦蛘{(diào)用結(jié)果按照約定的協(xié)議進(jìn)行序列化, 并通過(guò)網(wǎng)絡(luò)發(fā)送回客戶端Stub程序。

8、客戶端Stub程序接收到服務(wù)端Stub發(fā)送的返回?cái)?shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行反序列化操作, 并將調(diào)用返回的數(shù)據(jù)傳遞給客戶端請(qǐng)求發(fā)起者。

9、客戶端請(qǐng)求發(fā)起者得到調(diào)用結(jié)果,整個(gè)RPC調(diào)用過(guò)程結(jié)束。

簡(jiǎn)單的使用

在對(duì)RPC進(jìn)行簡(jiǎn)單介紹之后,我們先看一個(gè)簡(jiǎn)單的RPC服務(wù)注冊(cè)和調(diào)用的demo,

服務(wù)端代碼如下:

package main
import (
	"fmt"
	"log"
	"net"
	"net/rpc"
)
type HelloService struct{}
func (p *HelloService) Hello(request string, reply *string) error {
	*reply = "hello:" + request
	log.Println("got req", request)
	return nil
}
func main() {
	// 創(chuàng)建TCP服務(wù)器
	listener, err := net.Listen("tcp", ":8888")
	if err != nil {
		fmt.Println("Listen error:", err)
		return
	}
	// 創(chuàng)建RPC服務(wù)
	rpcServer := rpc.NewServer()
	// 注冊(cè)RPC服務(wù)(可以注冊(cè)多個(gè))
	rpcServer.RegisterName("HelloService", new(HelloService))
	// 開(kāi)始接收RPC請(qǐng)求
	rpcServer.Accept(listener)
}

客戶端代碼如下:

package main
import (
   "fmt"
   "log"
   "net/rpc"
)
func main() {
    //訪問(wèn)rpc服務(wù)端
   client, err := rpc.Dial("tcp", "localhost:8888")
   if err != nil {
      log.Fatal("dialing:", err)
   }
   var reply string 
    //調(diào)用rpc服務(wù)的指定方法
   err = client.Call("HelloService.Hello", "RPC", &reply)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(reply)
}

啟動(dòng)server.go 之后啟動(dòng)client.go ,RPC調(diào)用成功,控制臺(tái)分別打?。?/p>

// server
got req RPC
// client
hello:RPC

以上就是Golang RPC的原理與簡(jiǎn)單調(diào)用詳解的詳細(xì)內(nèi)容,更多關(guān)于Golang RPC的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)

    Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)

    這篇文章主要介紹了Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • go語(yǔ)言中strings包的用法匯總

    go語(yǔ)言中strings包的用法匯總

    Golang語(yǔ)言 strings標(biāo)準(zhǔn)庫(kù)包主要涉及字符串的基本操作,下面我們來(lái)詳細(xì)分析下吧
    2018-10-10
  • 淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用

    淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用

    這篇文章主要介紹了淺析Go語(yǔ)言編程當(dāng)中映射和方法的基本使用,是golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • golang中for range的取地址操作陷阱介紹

    golang中for range的取地址操作陷阱介紹

    這篇文章主要介紹了golang中for range的取地址操作陷阱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang 按行讀取文件的三種方法小結(jié)

    Golang 按行讀取文件的三種方法小結(jié)

    本文主要介紹了Golang 按行讀取文件的三種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • golang rate令牌桶源碼分析實(shí)現(xiàn)方式

    golang rate令牌桶源碼分析實(shí)現(xiàn)方式

    這篇文章主要介紹了golang rate令牌桶源碼分析實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Go語(yǔ)言中程序是怎么編譯的實(shí)現(xiàn)

    Go語(yǔ)言中程序是怎么編譯的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言中程序是怎么編譯的實(shí)現(xiàn),深入探討Go語(yǔ)言的編譯機(jī)制和最新的模塊管理系統(tǒng)Go Modules的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 簡(jiǎn)介Go語(yǔ)言中的select語(yǔ)句的用法

    簡(jiǎn)介Go語(yǔ)言中的select語(yǔ)句的用法

    這篇文章主要介紹了簡(jiǎn)介Go語(yǔ)言中的select語(yǔ)句的用法,是golang入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • go標(biāo)準(zhǔn)庫(kù)net/http服務(wù)端的實(shí)現(xiàn)示例

    go標(biāo)準(zhǔn)庫(kù)net/http服務(wù)端的實(shí)現(xiàn)示例

    go的http標(biāo)準(zhǔn)庫(kù)非常強(qiáng)大,本文主要介紹了go標(biāo)準(zhǔn)庫(kù)net/http服務(wù)端,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Go語(yǔ)言高效編程的3個(gè)技巧總結(jié)

    Go語(yǔ)言高效編程的3個(gè)技巧總結(jié)

    Go語(yǔ)言是一種開(kāi)源編程語(yǔ)言,可輕松構(gòu)建簡(jiǎn)單、可靠且高效的軟件,下面這篇文章主要給大家分享介紹了關(guān)于Go語(yǔ)言高效編程的3個(gè)技巧,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論