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

Golang?RPC的原理與簡單調用詳解

 更新時間:2023年05月26日 08:41:22   作者:胡安民  
RPC(Remote?Procedure?Call),主要是幫助我們屏蔽網絡編程細節(jié)?,使我們更專注于業(yè)務邏輯,所以本文主要來和大家聊聊RPC的原理與簡單調用,希望對大家有所幫助

RPC(Remote Procedure Call),主要是幫助我們屏蔽網絡編程細節(jié) ,是我們更專注于業(yè)務邏輯,實現調用遠程方法就像調用本地方法一樣。

RPC通信過程

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

RPC設計組成

以下是對RPC的四種角色的解釋和說明:

客戶端(Client): 服務調用發(fā)起方,也稱為服務消費者。

客戶端存根(Client Stub): 該程序運行在客戶端所在的計算機機器上,主要用來存儲要調用的服務器的地址,另外,該程序還負責將客戶端請求遠端服務器程序的數據信息打包成數據包,通過網絡發(fā)送給服務端Stub程序;其次,還要接收服務端Stub程序發(fā)送的調用結果數據包,并解析返回給客戶端。

服務端(Server): 遠端的計算機機器上運行的程序,其中有客戶端要調用的方法。

服務端存根(Server Stub): 接收客戶Stub程序通過網絡發(fā)送的請求消息數據包,并調用服務端中真正的程序功能方法,完成功能調用;其次,將服務端執(zhí)行調用的結果進行數據處理打包發(fā)送給客戶端Stub程序。

RPC原理和調用步驟

實際上,如果我們想要在網絡中的任意兩臺計算機上實現遠程調用過程,要解決很多問題,比如:

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

我們來看看RPC具體是如何解決這些問題的,RPC具體的調用步驟圖如下:

在上述圖中,通過1-10的步驟圖解的形式,說明了RPC每一步的調用過程。具體描述為:

1、客戶端想要發(fā)起一個遠程過程調用,首先通過調用本地客戶端Stub程序的方式調用想要使用的功能方法名;

2、客戶端Stub程序接收到了客戶端的功能調用請求,將客戶端請求調用的方法名,攜帶的參數等信息做序列化操作,并打包成數據包。

3、客戶端Stub查找到遠程服務器程序的IP地址,調用Socket通信協(xié)議,通過網絡發(fā)送給服務端。

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

5、服務端Stub程序準備相關數據,調用本地Server對應的功能方法進行,并傳入相應的參數,進行業(yè)務處理。

6、服務端程序根據已有業(yè)務邏輯執(zhí)行調用過程,待業(yè)務執(zhí)行結束,將執(zhí)行結果返回給服務端Stub程序。

7、服務端Stub程序將程序調用結果按照約定的協(xié)議進行序列化, 并通過網絡發(fā)送回客戶端Stub程序。

8、客戶端Stub程序接收到服務端Stub發(fā)送的返回數據,對數據進行反序列化操作, 并將調用返回的數據傳遞給客戶端請求發(fā)起者。

9、客戶端請求發(fā)起者得到調用結果,整個RPC調用過程結束。

簡單的使用

在對RPC進行簡單介紹之后,我們先看一個簡單的RPC服務注冊和調用的demo

服務端代碼如下:

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服務器
	listener, err := net.Listen("tcp", ":8888")
	if err != nil {
		fmt.Println("Listen error:", err)
		return
	}
	// 創(chuàng)建RPC服務
	rpcServer := rpc.NewServer()
	// 注冊RPC服務(可以注冊多個)
	rpcServer.RegisterName("HelloService", new(HelloService))
	// 開始接收RPC請求
	rpcServer.Accept(listener)
}

客戶端代碼如下:

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

啟動server.go 之后啟動client.go ,RPC調用成功,控制臺分別打?。?/p>

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

以上就是Golang RPC的原理與簡單調用詳解的詳細內容,更多關于Golang RPC的資料請關注腳本之家其它相關文章!

相關文章

  • Go中time.RFC3339 時間格式化的實現

    Go中time.RFC3339 時間格式化的實現

    這篇文章主要介紹了Go中time.RFC3339 時間格式化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • go語言中strings包的用法匯總

    go語言中strings包的用法匯總

    Golang語言 strings標準庫包主要涉及字符串的基本操作,下面我們來詳細分析下吧
    2018-10-10
  • 淺析Go語言編程當中映射和方法的基本使用

    淺析Go語言編程當中映射和方法的基本使用

    這篇文章主要介紹了淺析Go語言編程當中映射和方法的基本使用,是golang入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • golang中for range的取地址操作陷阱介紹

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

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

    Golang 按行讀取文件的三種方法小結

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

    golang rate令牌桶源碼分析實現方式

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

    Go語言中程序是怎么編譯的實現

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

    簡介Go語言中的select語句的用法

    這篇文章主要介紹了簡介Go語言中的select語句的用法,是golang入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • go標準庫net/http服務端的實現示例

    go標準庫net/http服務端的實現示例

    go的http標準庫非常強大,本文主要介紹了go標準庫net/http服務端,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Go語言高效編程的3個技巧總結

    Go語言高效編程的3個技巧總結

    Go語言是一種開源編程語言,可輕松構建簡單、可靠且高效的軟件,下面這篇文章主要給大家分享介紹了關于Go語言高效編程的3個技巧,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論