• 谈谈RPC——golang中jsonrpc和grpc的使用


    前言

    不知从什么时候rpc这个东西开始进入我们的视野,一开始做开发的时候经常使用的都是http,偶尔使用的是socket进行通信,使用的是restful的方式。但是,一次偶然的机会你会发现RPC这个东西进入了你的视野,而且由于微服务的兴起然他迅速被人们所知,那么它是什么,又如何使用呢?

    RPC定义

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。
    说的再实际一点:
    如果我们之前使用UserService.getUser(1)这样的方式调用本地服务,而rpc就是要让调用远程服务也是这样。

    jsonrpc

    其实说多了也没用,还是直接上代码,让我实际来看看使用方式你就瞬间明白了。
    首先举个jsonrpc的例子。
    golang自带了"net/rpc/jsonrpc"的库,所以我们利用它来做。
    首先是我们需要调用的服务

    非常简单的一个定义,定义了一个获取用户的服务,返回用户信息。
    其中需要说明的是,入参是需要遵循jsonrpc的一个定义规范,将返回值以指针的方式传入。
    注册和启动服务

    注册我们刚才写好的服务,然后监听一个端口,并且准备接受请求。

    最后最重要的就是我们的客户端调用

    我们通过连接对应端口,通过Call方法调用对应服务的方法,传入对应的参数和返回值。
    我们看到,虽然这个rpc服务没有写在我们本地,但是我们看到使用UserService.GetUser这样的写法调用这个服务,这其实就是所谓的rpc

    对比http来看,http服务你需要给出对应的接口地址,需要定义http method,等等。从我个人的看法来说:rpc更像是熟人之间的对话,http更多的陌生人之间的约定 因为rpc调用的时候,我都知道你的方法命名和位置,对你很了解;而http调用的时候我必须按照文档的定义。所以rpc多用于微服务之间的调用也是有道理的。

    grpc

    上面我们看到jsonrpc的实现还是比较简单的,只需要把对应的服务进行注册即可调用,而grpc会稍微复杂一些,不过grpc也被更多人所知道,因为它的性能和语言支持,grpc支持各种语言哦。

    由于国内某些你懂的原因,grpc安装使用go get会有问题,下面是我的安装步骤,可以参考

    grpc的安装

    首先需要一些依赖
    cd $GOPATH/src/golang.org/x
    git clone https://github.com/golang/net.git
    git clone https://github.com/golang/text.git
    git clone https://github.com/golang/crypto.git

    mkdir -p (GOPATH/src/google.golang.org/
    cd )GOPATH/src/google.golang.org
    git clone https://github.com/Agzs/grpc grpc

    cd $GOPATH/src/
    go install google.golang.org/grpc

    如果没有任何提示,证明安装完成,如果提示问题,查询一下应该可以解决

    如果你懂一点shell可以直接运行下面的脚本进行安装这些依赖

    #!/bin/bash
    MODULES="crypto net oauth2 sys text tools"
    for module in ${MODULES}
    do
    wget https://github.com/golang/${module}/archive/master.tar.gz -O ${GOPATH}/src/golang.org/x/${module}.tar.gz
    cd ${GOPATH}/src/golang.org/x && tar zxvf ${module}.tar.gz && mv ${module}-master/ ${module}
    done


    wget https://github.com/google/go-genproto/archive/master.tar.gz -O ${GOPATH}/src/google.golang.org/genproto.tar.gz
    cd ${GOPATH}/src/google.golang.org && tar zxvf genproto.tar.gz && mv go-genproto-master genproto

    protocol-buffer的安装

    grpc的使用还需要这个东西的帮忙
    官网:https://developers.google.com/protocol-buffers/
    我的安装方式:
    首先:
    https://github.com/protocolbuffers/protobuf/releases
    在这里下载需要的版本

    然后下载完成之后找到


    将protoc拷贝到环境变量PATH中的一个目录下就可以了

    可以放在/usr/local/sbin,我就偷懒喜欢放在gopath下的bin里面

    然后在命令行输入

    protoc --version

    libprotoc 3.7.1
    看到这个提示证明安装成功

    grpc的使用

    1、首先编写一个proto文件,用于定义你的服务接口
    syntax = "proto3";

    package grpc_demo;

    message Request {
    int64 a = 1;
    int64 b = 2;
    }

    message Response {
    int64 result = 1;
    }

    service AddService {
    rpc Add (Request) returns (Response);
    }

    2、然后使用命令生成对应的pb文件
    protoc -I ./ ./demo.proto --go_out=plugins=grpc:./

    3、然后编写服务端

    可以看到这里的写法和jsonrpc是类似的,但是因为生成了pb文件的原因,所以不可能写错,都是引用的代码,需要注意的是,这个的Add方法就是实现了我们在protoc文件中定义的接口。

    4、最后编写客户端

    在这里我们明显可以看出,在grpc中的写法更加的稳一些,不容易出错。调用的入参和出参都非常的明确。

    到这里,grpc的使用就完成了。我们也明显可以对比出两者的区别。同时你也发现,如果是一些复杂的服务情况对于grpc的proto你需要更加的了解。

    详细了解可以查看
    https://blog.didiyun.com/index.php/2018/12/12/grpc-golang-1/
    https://blog.didiyun.com/index.php/2018/12/29/grpc-golang-2/

    总结

    实际我们可以看到,其实rpc没有我们想的很复杂,它与http的使用上面差别也不是很大,但是从服务的角度来说,确实rpc更多适用于内部服务的调用,这样服务的调用会非常方便,就像在使用本地服务一样。同时我们也对比了jsonrpc和grpc从实现的角度上面来说jsonrpc实现起来更加方便一些,不过grpc从性能和使用的角度来说更加稳健一些。

  • 相关阅读:
    VB运算符总结
    动态实现树形菜单
    使用C#开发ActiveX控件
    jquery+ajax加载xml文件到页面
    C#序列化与反序列化
    jquery之ajax——全局事件引用方式以及各个事件(全局/局部)执行顺序
    SerialPort实现对串口COM的操作(有些纠结)
    jquery+ajax+C#实现无刷新操作数据库数据
    超过一百多个Web2.0在线生成器
    asp.net URL Rewriter 问题
  • 原文地址:https://www.cnblogs.com/linkstar/p/10895791.html
Copyright © 2020-2023  润新知