前言

不知从什么时候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从性能和使用的角度来说更加稳健一些。

谈谈RPC——golang中jsonrpc和grpc的使用的更多相关文章

  1. golang中的RPC开发-2

    RPC简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程 如果 ...

  2. golang中的rpc包用法

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服 ...

  3. golang中的rpc开发

    golang中实现RPC非常简单,官方提供了封装好的库,还有一些第三方的库 golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp和http数据传输方式,由于其他语言不支 ...

  4. google的grpc在golang中的使用

    GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...

  5. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

  6. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  7. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  8. Golang中设置函数默认参数的优雅实现

    在Golang中,我们经常碰到要设置一个函数的默认值,或者说我定义了参数值,但是又不想传递值,这个在python或php一类的语言中很好实现,但Golang中好像这种方法又不行.今天在看Grpc源码时 ...

  9. Golang中如何正确的使用sarama包操作Kafka?

    Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...

随机推荐

  1. Java的常见术语(PO/POJO/VO/BO/DAO/DTO)

    PO(persistant object) 持久对象在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库 ...

  2. upd

    今天是中华人民共和国成立70周年,先祝我的祖国母亲生日快乐 由于最近嗓子不太好使,我就不发歌了 分割线 在学校挤了一点本来应该发呆的时间写了点没用的 前一部分是对一点OI知识的复习,后一部分是最近高中 ...

  3. POJ 3322 Bloxorz

    #include<cstring> #include<algorithm> #include<iostream> #include<cstdio> #i ...

  4. HDU6625: three arrays (字典树处理xor)

    题意:给出A数组,B数组,你可以对A和B分别进行重排列,使得C[i]=A[i]^B[i]的字典序最小. 思路:对于这类题,显然需要建立字典树,然后某种形式取分治,或者贪心.  假设现在有了两颗字典树A ...

  5. 接口自动化测试框架【windows版】:jmeter + ant + jenkins

    为了提高回归效率及保证版本质量,很多公司都在做自动化测试,特别是接口自动化.接口自动化测试框架很多,有写代码的,也有不写代码的,我觉得没有谁比谁好,谁比谁高级之说,只要适用就好. 今天给大家分享一个不 ...

  6. jdk是什么

    jdk是对java基础环境和相应开发平台标准和工具包的封装(zip) 开发平台 j2se j2ee j2me; 基础环境: 虚拟机.运行环境 JDK是整个JAVA的核心,包括了Java运行环境JRE( ...

  7. rushjs来自微软的单体仓库管理工具

    rushjs 是来自微软的单体仓库管理工具 ,与lerna 类似但是使用上稍显复杂 安装 npm install -g @microsoft/rush   简单使用 一个传统的基于npm 的处理 ~$ ...

  8. 格式化输出(%用法和fomat用法)

    一:%用法 1.整数输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 2.浮点数输出 %f ——保留小数点后面六位有效数字 %.3f,保留3位小数位%e ——保留 ...

  9. 拼图验证码 js,vue

    可查看github网站

  10. ARC098F Donation

    传送门 Atcoder Solution 首先是几个引理: 重新定义权值\(val_i=max(a_i-b_i,0)\),那么通过这个点必须需要\(val_i+b_i\)的钱. 多次经过一个点一定是在 ...