欢迎来到代码驿站!

Golang

当前位置:首页 > 脚本语言 > Golang

golang实现简单rpc调用过程解析

时间:2022-06-16 09:47:48|栏目:Golang|点击:

基本概念

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)
}

上一篇:轻松读懂Golang中的数组和切片

栏    目:Golang

下一篇:Go语言调用Shell与可执行文件的实现

本文标题:golang实现简单rpc调用过程解析

本文地址:http://www.codeinn.net/misctech/204979.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有