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

 更新时间:2022年05月06日 11:22:35   作者:神技圈子  
这篇文章主要介绍了golang实现简单rpc调用,包括RPC具体实现结合实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

基本概念

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实现简单rpc调用的文章就介绍到这了,更多相关golang rpc调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go中使用加密算法的方法

    Go中使用加密算法的方法

    本文通过实例代码给大家介绍go中使用加密算法的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • Go语言之使用pprof工具查找goroutine(协程)泄漏

    Go语言之使用pprof工具查找goroutine(协程)泄漏

    这篇文章主要介绍了Go语言之使用pprof工具查找goroutine(协程)泄漏,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • golang字符串切片去重的几种算法

    golang字符串切片去重的几种算法

    这篇文章主要介绍了golang字符串切片去重的几种算法的相关资料,需要的朋友可以参考下
    2023-09-09
  • Golang 探索对Goroutine的控制方法(详解)

    Golang 探索对Goroutine的控制方法(详解)

    下面小编就为大家分享一篇Golang 探索对Goroutine的控制方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • mac下golang安装了windows编译环境后编译变慢

    mac下golang安装了windows编译环境后编译变慢

    这篇文章主要介绍了mac下golang安装了windows编译环境后编译变慢的处理方法,非常的简单,有相同问题的小伙伴可以参考下。
    2015-04-04
  • golang内存对齐的概念及案例详解

    golang内存对齐的概念及案例详解

    为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址,并占用合适的长度,这就是内存对齐。本文重点给大家介绍golang内存对齐的概念及案例详解,感兴趣的朋友一起看看吧
    2022-02-02
  • Go递归修改文件名的实例代码

    Go递归修改文件名的实例代码

    这篇文章主要介绍了Go递归修改文件名的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的饿参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Golang开发命令行之flag包的使用方法

    Golang开发命令行之flag包的使用方法

    这篇文章主要介绍Golang开发命令行及flag包的使用方法,日常命令行操作,相对应的众多命令行工具是提高生产力的必备工具,本文围绕该内容展开话题,需要的朋友可以参考一下
    2021-10-10
  • Golang语言JSON解码函数Unmarshal的使用

    Golang语言JSON解码函数Unmarshal的使用

    本文主要介绍了Golang语言JSON解码函数Unmarshal的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Golang 中整数转字符串的方法

    Golang 中整数转字符串的方法

    这篇文章主要介绍了Golang 中整数转字符串的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06

最新评论