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

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

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

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

RPC通信過程

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

RPC設(shè)計組成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

簡單的使用

在對RPC進行簡單介紹之后,我們先看一個簡單的RPC服務(wù)注冊和調(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()
	// 注冊RPC服務(wù)(可以注冊多個)
	rpcServer.RegisterName("HelloService", new(HelloService))
	// 開始接收RPC請求
	rpcServer.Accept(listener)
}

客戶端代碼如下:

package main
import (
   "fmt"
   "log"
   "net/rpc"
)
func main() {
    //訪問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)
}

啟動server.go 之后啟動client.go ,RPC調(diào)用成功,控制臺分別打印:

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

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

相關(guān)文章

  • Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • go?variant底層原理深入解析

    go?variant底層原理深入解析

    這篇文章主要為大家介紹了go?variant底層原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 詳解如何在Go語言中生成隨機種子

    詳解如何在Go語言中生成隨機種子

    這篇文章主要為大家詳細介紹了如何在Go語言中生成隨機種子,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-04-04
  • Go語言中的上下文取消操作詳解

    Go語言中的上下文取消操作詳解

    這篇文章主要給大家介紹了關(guān)于Go語言中上下文取消操作的相關(guān)資料,本文將解釋我們?nèi)绾卫蒙舷挛膸斓娜∠匦裕⑼ㄟ^一些模式和最佳實踐來使用取消,使你的程序更快、更健壯。需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 使用 go 實現(xiàn)多線程下載器的方法

    使用 go 實現(xiàn)多線程下載器的方法

    本篇文章帶領(lǐng)大家學(xué)習(xí)使用go實現(xiàn)一個簡單的多線程下載器,給她家詳細介紹了多線程下載原理及實例代碼,感興趣的朋友跟隨小編一起看看吧
    2021-10-10
  • golang使用jaeger進行鏈路追蹤

    golang使用jaeger進行鏈路追蹤

    鏈路追蹤是指在分布式系統(tǒng)中,將一次請求的處理過程進行記錄并聚合展示的一種方法,目的是將一次分布式請求的調(diào)用情況集中在一處展示,本文將介紹golang如何使用jaeger進行鏈路追蹤,需要的朋友可以參考下
    2024-06-06
  • 詳解Go微服務(wù)容錯設(shè)計(熔斷+降級+限流全解析)

    詳解Go微服務(wù)容錯設(shè)計(熔斷+降級+限流全解析)

    本文概述了Go微服務(wù)容錯設(shè)計,包括超時控制、重試機制、熔斷機制和降級策略,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • go HTTP2 的頭部壓縮算法hpack實現(xiàn)詳解

    go HTTP2 的頭部壓縮算法hpack實現(xiàn)詳解

    這篇文章主要為大家介紹了go HTTP2 的頭部壓縮算法hpack實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Go使用MongoDB的操作指南(增刪改查)

    Go使用MongoDB的操作指南(增刪改查)

    MongoDB 是一種高性能、開源、文檔型的 NoSQL 數(shù)據(jù)庫,廣泛應(yīng)用于 Web 應(yīng)用、大數(shù)據(jù)以及云計算領(lǐng)域,Go 語言則以其快速、開發(fā)效率高、代碼可維護性強著稱,本指南將詳細介紹如何在 Go 語言中使用 MongoDB 進行數(shù)據(jù)庫操作,需要的朋友可以參考下
    2024-08-08
  • go?colly?爬蟲實現(xiàn)示例

    go?colly?爬蟲實現(xiàn)示例

    這篇文章主要為大家介紹了go?colly?爬蟲實現(xiàn)示例,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號,從excel中讀取公司名稱,查詢公司法人及電話號碼。并寫回到excel中指定行
    2022-09-09

最新評論

页游| 盐山县| 广昌县| 民和| 瑞昌市| 潜江市| 河源市| 贡觉县| 陵川县| 布尔津县| 扶沟县| 德州市| 马鞍山市| 景德镇市| 松阳县| 宁陵县| 霞浦县| 淮北市| 晋中市| 白河县| 万山特区| 雅江县| 陆川县| 霍邱县| 卢龙县| 祁东县| 嵊州市| 陇南市| 弥渡县| 宁乡县| 东光县| 九龙坡区| 南木林县| 施甸县| 榆树市| 上思县| 板桥市| 莎车县| 舟山市| 湘乡市| 博湖县|