golang python rpc_golang实现RPC的几种方式

本文介绍了在Golang中实现RPC的三种方式:官方的net/rpc库,net/rpc/jsonrpc库以及protorpc库,强调了跨语言调用的重要性。示例代码包括服务端和客户端实现,展示了如何在Golang和PHP之间进行RPC调用。
摘要由CSDN通过智能技术生成

什么是RPC

远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。维基百科:远程过程调用

用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。打个比方,我用go语言写了个获取用户信息的方法getUserInfo,并把go程序部署在阿里云服务器上面,现在我有一个部署在腾讯云上面的php项目,需要调用golang的getUserInfo方法获取用户信息,php跨机器调用go方法的过程就是RPC调用。

golang中如何实现RPC

在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。Go RPC可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式。golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。

golang官方还提供了net/rpc/jsonrpc库实现RPC方法,JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。但目前的jsonrpc库是基于tcp协议实现的,暂时不支持使用http进行数据传输。

除了golang官方提供的rpc库,还有许多第三方库为在golang中实现RPC提供支持,大部分第三方rpc库的实现都是使用protobuf进行数据编解码,根据protobuf声明文件自动生成rpc方法定义与服务注册代码,在golang中可以很方便的进行rpc服务调用。

net/rpc库

下面的例子演示一下如何使用golang官方的net/rpc库实现RPC方法,使用http作为RPC的载体,通过net/http包监听客户端连接请求。

$GOPATH/src/test/rpc/rpc_server.go

package main

import (

"errors"

"fmt"

"log"

"net"

"net/http"

"net/rpc"

"os"

)

// 算数运算结构体

type Arith struct {

}

// 算数运算请求结构体

type ArithRequest struct {

A int

B int

}

// 算数运算响应结构体

type ArithResponse struct {

Pro int // 乘积

Quo int // 商

Rem int // 余数

}

// 乘法运算方法

func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {

res.Pro = req.A * req.B

return nil

}

// 除法运算方法

func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {

if req.B == 0 {

return errors.New("divide by zero")

}

res.Quo = req.A / req.B

res.Rem = req.A % req.B

return nil

}

func main() {

rpc.Register(new(Arith)) // 注册rpc服务

rpc.HandleHTTP() // 采用http协议作为rpc载体

lis, err := net.Listen("tcp", "127.0.0.1:8095")

if err != nil {

log.Fatalln("fatal error: ", err)

}

fm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值