golang中的net/rpc包使用概述(小结)
作者:andyidea 发布时间:2024-05-29 22:05:54
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。
我的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,消耗的系统资源越来越多,于是乎就希望可以改成用rpc来做内部的通讯,对外依然用Restful。于是就想到了golang标准库的rpc包和google的grpc。
这篇文章重点了解一下golang的rpc包。
介绍
golang的rpc支持三个级别的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是独一无二的RPC,它和传统的RPC系统不同,它只支持Go开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编码。
Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
函数必须是导出的(首字母大写)
必须有两个导出类型的参数,
第一个参数是接收的参数,第二个参数是返回给客- 户端的参数,第二个参数必须是指针类型的
函数还要有一个返回值error
举个例子,正确的RPC函数格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
T、T1和T2类型必须能被encoding/gob包编解码。
示例
举一个http的例子。
下面是http服务器端的代码:
package main
import (
"errors"
"net"
"net/rpc"
"log"
"net/http"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
log.Fatal("listen error:", e)
}
http.Serve(l, nil)
}
简单分析一下上面的例子,先实例化了一个Arith对象arith,然后给arith注册了rpc服务,然后把rpc挂载到http服务上面,当http服务打开的时候我们就可以通过rpc客户端来调用arith中符合rpc标准的的方法了。
请看客户端的代码:
package main
import (
"net/rpc"
"log"
"fmt"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
func main() {
client, err := rpc.DialHTTP("tcp", "127.0.0.1:1234")
if err != nil {
log.Fatal("dialing:", err)
}
// Synchronous call
args := &Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)
// Asynchronous call
quotient := new(Quotient)
divCall := client.Go("Arith.Divide", args, quotient, nil)
replyCall := <-divCall.Done // will be equal to divCall
if replyCall.Error != nil {
log.Fatal("arith error:", replyCall.Error)
}
fmt.Printf("Arith: %d/%d=%d...%d", args.A, args.B, quotient.Quo, quotient.Rem)
// check errors, print, etc.
}
简单说明下,先用rpc的DialHTTP方法连接服务器端,调用服务器端的函数就要使用Call方法了,Call方法的参数和返回值已经很清晰的表述出rpc整体的调用逻辑了。
我们把服务器端跑起来,再把客户端跑起来,这时候客户端会输出:
Arith: 7*8=56
Arith: 7/8=0...7
到此,整个rpc的调用逻辑就完成了。
来源:https://segmentfault.com/a/1190000011891865


猜你喜欢
- 本文实例讲述了Thinkphp5.0 框架的请求方式与响应方式。分享给大家供大家参考,具体如下:Thinkphp5.0 的请求方式方法一(使
- 先说明,我并不知道出现坑的原因是什么。我只是按照别人的写法就连上了。我的处境是这样的我的前台是用了 vue 全家桶,启动了一个 9527 端
- 1. watch 与 computed 的巧妙结合如上图,一个简单的列表页面。你可能会这么做: created(){ this.
- auth模块简介auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合
- 目录1. pgzeropgzero的安装2. 游戏设计的过程3. pgzero基础4. pgzero游戏例子5. 总结6. 参考资料1. p
- 1. 问题引出许多时候,我们对程序的速度都是有要求的,速度自然是越快越好。对于Python的话,一般都是使用multiprocessing这
- 本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下代码:# -*- coding: gb2312 -*- c
- 身份证号码的编排规则前1、2位数字表示:所在省份的代码;第3、4位数字表示:所在城市的代码;第5、6位数字表示:所在区县的代码;第7~14位
- 常用树形结构设计总结开发中,经常会遇到树形结构的设计,所谓的树形结构,其实就是数据与关系的设计,本文用来总结常用的树形结构设计1. 递归表i
- Oracle的Nvl函数nvl( ) 函数从两个表达式返回一个非null 值。语法NVL(eExpression1, eExpression
- 前言 随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也
- python打印完整异常import tracebackif __name__ == "__main__":
- 完美的渐变透明效果。支持IE,Firefox渐变,自己写的JS框架中用的东西,发出来了。修正完全隐藏时,偶尔不display = "
- 在pandas中的groupby和在sql语句中的groupby有异曲同工之妙,不过也难怪,毕竟关系数据库中的存放数据的结构也是一张大表罢了
- time()方法返回时间,在UTC时代以秒表示浮点数。注意:尽管在时间总是返回作为一个浮点数,并不是所有的系统提供时间超过1秒精
- 本文实例分析了GO语言文件的创建与打开用法。分享给大家供大家参考。具体分析如下:文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是
- 本文实例为大家分享了javascript实现tab切换特效代码,供大家参考,具体内容如下效果图:实现代码:<!DOCTYPE html
- 今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家:首先安装xlrd:
- 看下面的一组例子:alert(true.toString());alert(false.toString());alert(1.123.to
- <html> <head> <title> New Document </title> &l