Golang RPC的原理与简单调用详解

 更新时间:2023年05月26日 08:41:22   作者:胡安民  
RPC(Remote Procedure Call),主要是帮助我们屏蔽网络编程细节 ,使我们更专注于业务逻辑,所以本文主要来和大家聊聊RPC的原理与简单调用,希望对大家有所帮助

RPC(Remote Procedure Call),主要是帮助我们屏蔽网络编程细节 ,是我们更专注于业务逻辑,实现调用远程方法就像调用本地方法一样。

RPC通信过程

由服务提供者给出业务接口声明,在调用方的程序里面,RPC 框架根据调用的服务接口提前生成动态代理实现类,并通过依赖注入等技术注入到声明了该接口的相关业务逻辑里面。该代理实现类会拦截所有的方法调用,在提供的方法处理逻辑里面完成一整套的远程调用,并把远程调用结果返回给调用方,这样调用方在调用远程方法的时候就获得了像调用本地接口一样的体验。

RPC设计组成

以下是对RPC的四种角色的解释和说明:

客户端(Client): 服务调用发起方,也称为服务消费者。

客户端存根(Client Stub): 该程序运行在客户端所在的计算机机器上,主要用来存储要调用的服务器的地址,另外,该程序还负责将客户端请求远端服务器程序的数据信息打包成数据包,通过网络发送给服务端Stub程序;其次,还要接收服务端Stub程序发送的调用结果数据包,并解析返回给客户端。

服务端(Server): 远端的计算机机器上运行的程序,其中有客户端要调用的方法。

服务端存根(Server Stub): 接收客户Stub程序通过网络发送的请求消息数据包,并调用服务端中真正的程序功能方法,完成功能调用;其次,将服务端执行调用的结果进行数据处理打包发送给客户端Stub程序。

RPC原理和调用步骤

实际上,如果我们想要在网络中的任意两台计算机上实现远程调用过程,要解决很多问题,比如:

  • 两台物理机器在网络中要建立稳定可靠的通信连接
  • 两台服务器的通信协议的定义问题,即两台服务器上的程序如何识别对方的请求和返回结果。也就是说两台计算机必须都能够识别对方发来的信息,并且能够识别出其中的请求含义和返回含义,然后才能进行处理。这其实就是通信协议所要完成的工作。

我们来看看RPC具体是如何解决这些问题的,RPC具体的调用步骤图如下:

在上述图中,通过1-10的步骤图解的形式,说明了RPC每一步的调用过程。具体描述为:

1、客户端想要发起一个远程过程调用,首先通过调用本地客户端Stub程序的方式调用想要使用的功能方法名;

2、客户端Stub程序接收到了客户端的功能调用请求,将客户端请求调用的方法名,携带的参数等信息做序列化操作,并打包成数据包。

3、客户端Stub查找到远程服务器程序的IP地址,调用Socket通信协议,通过网络发送给服务端。

4、服务端Stub程序接收到客户端发送的数据包信息,并通过约定好的协议将数据进行反序列化,得到请求的方法名和请求参数等信息。

5、服务端Stub程序准备相关数据,调用本地Server对应的功能方法进行,并传入相应的参数,进行业务处理。

6、服务端程序根据已有业务逻辑执行调用过程,待业务执行结束,将执行结果返回给服务端Stub程序。

7、服务端Stub程序将程序调用结果按照约定的协议进行序列化, 并通过网络发送回客户端Stub程序。

8、客户端Stub程序接收到服务端Stub发送的返回数据,对数据进行反序列化操作, 并将调用返回的数据传递给客户端请求发起者。

9、客户端请求发起者得到调用结果,整个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() {
	// 创建TCP服务器
	listener, err := net.Listen("tcp", ":8888")
	if err != nil {
		fmt.Println("Listen error:", err)
		return
	}
	// 创建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调用成功,控制台分别打印:

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

以上就是Golang RPC的原理与简单调用详解的详细内容,更多关于Golang RPC的资料请关注脚本之家其它相关文章!

相关文章

  • Golang IPv4 字符串与整数互转方式

    Golang IPv4 字符串与整数互转方式

    这篇文章主要介绍了Golang IPv4 字符串与整数互转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • go variant底层原理深入解析

    go variant底层原理深入解析

    这篇文章主要为大家介绍了go variant底层原理深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解如何在Go语言中生成随机种子

    详解如何在Go语言中生成随机种子

    这篇文章主要为大家详细介绍了如何在Go语言中生成随机种子,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • Go语言中的上下文取消操作详解

    Go语言中的上下文取消操作详解

    这篇文章主要给大家介绍了关于Go语言中上下文取消操作的相关资料,本文将解释我们如何利用上下文库的取消特性,并通过一些模式和最佳实践来使用取消,使你的程序更快、更健壮。需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • 使用 go 实现多线程下载器的方法

    使用 go 实现多线程下载器的方法

    本篇文章带领大家学习使用go实现一个简单的多线程下载器,给她家详细介绍了多线程下载原理及实例代码,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • golang使用jaeger进行链路追踪

    golang使用jaeger进行链路追踪

    链路追踪是指在分布式系统中,将一次请求的处理过程进行记录并聚合展示的一种方法,目的是将一次分布式请求的调用情况集中在一处展示,本文将介绍golang如何使用jaeger进行链路追踪,需要的朋友可以参考下
    2024-06-06
  • 详解Go微服务容错设计(熔断+降级+限流全解析)

    详解Go微服务容错设计(熔断+降级+限流全解析)

    本文概述了Go微服务容错设计,包括超时控制、重试机制、熔断机制和降级策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • go HTTP2 的头部压缩算法hpack实现详解

    go HTTP2 的头部压缩算法hpack实现详解

    这篇文章主要为大家介绍了go HTTP2 的头部压缩算法hpack实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Go使用MongoDB的操作指南(增删改查)

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

    MongoDB 是一种高性能、开源、文档型的 NoSQL 数据库,广泛应用于 Web 应用、大数据以及云计算领域,Go 语言则以其快速、开发效率高、代码可维护性强著称,本指南将详细介绍如何在 Go 语言中使用 MongoDB 进行数据库操作,需要的朋友可以参考下
    2024-08-08
  • go colly 爬虫实现示例

    go colly 爬虫实现示例

    这篇文章主要为大家介绍了go colly 爬虫实现示例,效果是根据输入的浏览器cookie及excel必要行列号,从excel中读取公司名称,查询公司法人及电话号码。并写回到excel中指定行
    2022-09-09

最新评论