日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

golang實現簡單rpc調用過程解析_Golang

作者:神技圈子 ? 更新時間: 2022-06-30 編程語言

基本概念

RPC(Remote Procedure Call)遠程過程調用,簡單的理解是一個節點請求另一個節點提供的服務,該協議允許運行于一臺計算機的程序調用另一臺計算機的子程序,而程序員無需額外地為這個交互作用編程,RPC最直接的作用就是微服務。

RPC通信過程

RPC的通信過程網上介紹很多,這里就不在單獨介紹了,具體過程如下:
1.Client以本地調用的方式發起調用;
2.Client stub收到調用后負責將被調用的方法名、參數等打包編碼成特定格式成網絡傳輸的消息體;
3.Client stub將消息體通過網絡發送給服務端;
4.Server stub收到通過網絡接收到消息后按照相應格式進行拆包解碼,獲取方法名和參數;
5.Server stub根據方法名和參數進行本地調用;
6.被調用者(Server)本地調用執行后將結果返回給Server stub;
7.Server stub將返回值打包編碼成消息;
8.通過網絡發送給Client;
9.Client stub收到消息后,進行拆包解碼,返回給Client;
10.Client得到本次RPC調用的最終結果.

RPC 具體實現

server端

package main
import (
	"net"
	"net/http"
	"net/rpc"
	"strings"
)
type EchoUtil struct {
}
func (echo *EchoUtil) CountString(str string, rsp *int) error {
	*rsp = strings.Count(str, "s")
	return nil
}
func main() {
	echoUtil := new(EchoUtil)
	/*將服務對象進行注冊*/
	err := rpc.Register(echoUtil)
	if err != nil {
		err.Error()
	}
	rpc.HandleHTTP()
   
   /* 固定端口進行監聽*/
	listen, err := net.Listen("tcp", ":9999")
	if err != nil {
		panic(err.Error())
	}
	http.Serve(listen, nil)
}

客戶端

package main
import (
	"fmt"
	"net/rpc"
)
func main() {
	cli, err := rpc.DialHTTP("tcp", "localhost:9999")
	if err != nil {
		panic(err.Error())
	}
	var resp *int
	/*采用同步調用的方式*/
	err = cli.Call("EchoUtil.CountString", "this is test", &resp)
	if err != nil {
		panic(err.Error())
	}
	fmt.Println(*resp)
}

原文鏈接:https://blog.csdn.net/songguangfan/article/details/124593364

欄目分類
最近更新