前言

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

 

RPC定义

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

 

jsonrpc

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

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

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

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

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

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

 

grpc

上面咱们看到jsonrpc的实现仍是比较简单的,只须要把对应的服务进行注册便可调用,而grpc会稍微复杂一些,不过grpc也被更多人所知道,由于它的性能和语言支持,grpc支持各类语言哦。json

因为国内某些你懂的缘由,grpc安装使用go get会有问题,下面是个人安装步骤,能够参考bash

 

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.gitrestful

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

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的使用

一、首先编写一个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);
}

 

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

 

三、而后编写服务端

能够看到这里的写法和jsonrpc是相似的,可是由于生成了pb文件的缘由,因此不可能写错,都是引用的代码,须要注意的是,这个的Add方法就是实现了咱们在protoc文件中定义的接口。

 

四、最后编写客户端

在这里咱们明显能够看出,在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从性能和使用的角度来讲更加稳健一些。