rpc

一、什么是rpc?


image.png

简而言之,RPC就是一个本地程序可以通过网络调用远程的一个子程序。

二、Go语言的rpc

rpc分为server端和client端。server端即为服务端,即提供服务方,client端为调用端(客户端),即远程调用服务端一方。

实现一个RPC需要解决哪些问题
server端是服务提供方,client端是服务调用方。既然server端可以提供服务,那么它要先实现服务的注册,只有注册过的服务才能被client端调用。前文也说过,client端和server端一般不在一个进程内,甚至不在一个计算机内,那么他们之间的通信必然是通过网络传输,这样就涉及到了网络传输协议,说的更直白的,就是如何将client端的数据(一般是要调用的服务名和相应的参数)安全传输到server端,而server端也能完整的接收到。在client端和server端,数据一般是以对象的形式存在,而对象是无法进行网络传输的,在网络传输之前,我们需要先把对象序列化成字节流,然后传输这些字节流,server端在接收到这些字节流之后,再反序列化得到原始对象,这就是序列化与反序列化。

所以要实现一个rpc要考虑三个问题:

  • 1、服务端注册
  • 2、网络传输
  • 3、序列化和反序列化

go语言自带的标准库中的/net/rpc 包可以帮助实现一个简单的rpc server端。以下是/net/rpc包的一些说明:

rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名。注册之后,对象的导出方法就可以被远程访问。服务端可以注册多个不同类型的对象(服务),但注册具有相同类型的多个对象是错误的。

只有满足如下标准的方法才能用于远程访问,其余方法会被忽略:

  • 方法是导出的
  • 方法有两个参数,都是导出类型或内建类型
  • 方法的第二个参数是指针
  • 方法只有一个error接口类型的返回值

事实上,方法必须看起来像这样:

func (t *T) MethodName(argType T1, replyType *T2) error

一个简单的rpc server端实现如下:

package main

import (
    "log"
    "net"
    "net/rpc"
)

type Args struct {
    A, B int
}

type Arith int

func (t *Arith) Multiply(args Args, reply *int) error {
    *reply = args.A * args.B
    return nil
}

func main() {
    // 创建一个rpc server对象
    newServer := rpc.NewServer()

    // 向rpc server对象注册一个Arith对象,注册后,client就可以调用Arith的Multiply方法
    arith := new(Arith)
    newServer.Register(arith)

    // 监听本机的1234端口
    l, e := net.Listen("tcp", "127.0.0.1:1234")
    if e != nil {
        log.Fatalf("net.Listen tcp :0: %v", e)
    }

    for {
        // 阻塞直到从1234端口收到一个网络连接
        conn, e := l.Accept()
        if e != nil {

            log.Fatalf("l.Accept: %v", e)
        }

        //开始工作
        go newServer.ServeConn(conn)
    }
}

client端调用

package main

import (
    "log"
    "net"
    "net/rpc"
)

type Args struct {
    A, B int
}

func main() {
    conn ,_:= net.Dial("tcp", ":1234")
    defer conn.Close()

    client := rpc.NewClient(conn)
    defer client.Close()

    args := Args{7,8}
    var reply int
    err := client.Call("Arith.Multiply", args, &reply)
    if err != nil {
        log.Fatal("arith error:", err)
    }
    log.Println(reply)

}

我们先连接本机的1234端口(这个端口server.go在监听),得到一个net.Conn对象,然后用这个对象new出来了一个rpc client,然后再通过这个client调用服务端提供的方法Multiply,计算完后把结果存到reply中。

输出结果:


image.png

关于rpc详细的说明可以参考这篇博客https://juejin.im/post/5a69e308518825733b0f151a

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 转自:http://blog.csdn.net/kesonyk/article/details/50924489 ...
    晴天哥_王志阅读 24,787评论 2 38
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 摘自: https://my.oschina.net/hosee/blog/711632摘要: 本文主要说明RPC...
    holy_z阅读 1,123评论 0 7
  • 昨天,7.2,郭强总到达苏州,苏州、广州、上海,青岛,四城互动,开始了苏州第一次磨课。 在磨课开始前,亮叔说有2个...
    思远同学阅读 468评论 -1 4
  • 在学习微信小程序的过程中会遇到各种各样的坑,任何一门语言在刚开始学习的时候不是摸着石头过河?而恰恰是这些坑,...
    梦齐阅读 505评论 0 3