【Golang】源码学习:net/rpc包——基于Http协议的 RPC 服务(一)

一、基本原理

       远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

       具体原理参考

       引用其中一图,本文就以此架构图对官方net/rpc库分析:

        golang官方的net/rpc库使用encoding/gob进行编解码,gob编码方式仅被Go所支持,因此net/rpc库只能用于Go内部的rpc调用,无法进行跨语言调用, 但可以使用基于json编码的net/rpc/jsonrpc包进行这项工作。net/rpc同时支持tcphttp数据传输方式。

        本文将首先展示使用net/rpc包进行rpc调用的主要方法,随后对于net/rpc包的结构和流程进行具体分析。

二、使用方法:

1、在一个独立的包rpc_objects中新建类型及方法

新定义一个类型 Args 及其方法 Multiply,该方法将Args类型的参数中的两个整形成员相乘后,赋值给引用类型的参数Reply。

此处,net/rpc包要求要注册的函数必需以error类型作为返回值,因此函数运行结果反映在按引用传递的参数中。

package rpc_objects

type Args struct{
	N,M int
}
//要对外提供的远程调用方法Multiply
func (a *Args)Multiply(args *Args,reply *int)error{
	*reply=args.M*args.N
	return nil
}

2、定义服务提供方,即rpc协议下的服务器端rpc_server.go

依次进行了服务方法注册、http请求处理函数注册、http端口的监听和对外服务。

package main
import (
	"../rpc_objects"
	"log"
	"net"
	"net/http"
	"net/rpc"
	"time"
)
func main() {
	calc := new(rpc_objects.Args)   //新建Args类型实例
	rpc.Register(calc)              //调用rpc.Register()函数进行注册
	rpc.HandleHTTP()                //调用rpc.HandleHTTP()
	listener, e := net.Listen("tcp", "localhost:1234")    //使用net包监听端口
	if e != nil {
		log.Fatal("Starting RPC-server -listen error:", e)
	}
	go http.Serve(listener, nil)    //新建协程提供对外服务
	time.Sleep(1000e9)
}

3、新建rpc协议客户端rpc_client.go

向服务端进行客户端连接后,调用call()函数,传递服务函数名(类型名.函数名)和调用函数参数,完成服务调用。

package main
import(
"../rpc_objects"
"fmt"
"log"
"net/rpc"
)
const serverAddress
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值