兄弟连区块链培训分享Go语言-实现RPC的方式

兄弟连区块链培训 · · 3781 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  “区块链是一门集合密码学、共识算法、智能合约、超级账本等多门技术的复杂性综合学科。”尹正表示,区块链培训机构的师资质量及其对区块链行业的认知水平参差不齐,普通消费者也无从考究。

  Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。

什么是RPC

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

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

如何实现RPC

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

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

除了提供的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)

    }


    fmt.Fprintf(os.Stdout, "%s", "start connection")


    http.Serve(lis, nil)

}

上述服务端程序运行后,将会监听本地的8095端口,我们可以实现一个客户端程序,连接服务端并实现RPC方法调用。


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


package main


import (

    "fmt"

    "log"

    "net/rpc"

)


// 算数运算请求结构体

type ArithRequest struct {

    A int

    B int

}


// 算数运算响应结构体

type ArithResponse struct {

Pro int // 乘积

Quo int // 商

Rem int // 余数

}


func main() {

    conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8095")

    if err != nil {

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

    }


    req := ArithRequest{9, 2}

    var res ArithResponse


err = conn.Call("Arith.Multiply", req, &res) // 乘法运算

    if err != nil {

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

    }

    fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)


    err = conn.Call("Arith.Divide", req, &res)

    if err != nil {

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

    }

    fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)

}

net/rpc/jsonrpc库

高能预警,兄弟连教育区块链直播课程8月持续火爆来袭!

原价1188元的12节区块链进阶课程,现仅需1元!

还可免费领取《Go语言基础实战项目开发》与《Go语言高级实战项目开发》教材两本!!

限时限量!!先到先得!!

http://www.ydma.cn/open/course/24


关注兄弟连区块链公众号可以获得更多区块链技术干货!!!


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:兄弟连区块链培训

查看原文:兄弟连区块链培训分享Go语言-实现RPC的方式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3781 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传