本文介绍go里的rpc开发的知识点与相关使用场景。
什么是RPC
RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。
RPC vs REST
- RPC主要是基于TCP/IP协议的,而REST服务主要是基于HTTP协议的
- REST通常以业务为导向,将业务对象上执行的操作映射到HTTP动词,格式非常简单。
- REST也存在一些弊端,比如只支持请求/响应这种单一的通信方式,对象和字符串之间的序列化操作也会影响消息传递速度。在单个请求获取多个资源时存在着挑战,而且有时候很难将所有的动作都映射到HTTP动词。比如注册、授权等等。
- 由于HTTP在应用层中完成,整个通信的代价较高,远程过程调用中直接基于TCP进行远程调用,数据传输在传输层TCP层完成,更适合对效率要求比较高的场景,RPC主要依赖于客户端和服务端之间建立Socket链接进行,底层实现比REST更复杂。
主流的RPC框架
主要用的就是GRPC,Thrift,Dubbo这三个,下面分别介绍下使用方式。
GRPC
GRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言(Golang,C++,Java,Php,Python等等)。
安装
建议先配置go module代理。否则不开VPN下载速度可能会很慢,也许直接下载失败。1
2
3
4
5
6// 安装protobuf插件
go get -u github.com/golang/protobuf/protoc-gen-go
// 再去下载protoc,地址:https://github.com/golang/protobuf/releases
unzip protoc-x.x.x-linux-x86_64.zip -d /usr/local/
// 查看版本
protoc --version示例1 校验用户
目录结构如下:1
2
3
4
5
6
7
8.
├── client # 客户端
│ └── main.go
├── proto
│ └── user_auth.proto
└── server # 服务端
└── main.go
首先需要定义user_auth.proto文件:
1 | syntax="proto3"; |
通过protoc生成go的编译文件
1 | cd proto |
服务端server/main.go:
1 |
|
客户端client/main.go:
1 | package main |
运行:
1 | // terminal1 |
- 备注说明
一直纠结如参数错误
,数据不存在
等业务状态码应该使用error的code存储,还是在每个response里定义一个公共的code字段,在查阅相关资料:1
https://www.bookstack.cn/read/API-design-guide/API-design-guide-07-%E9%94%99%E8%AF%AF.md
开发人员不太可能编写大量处理逻辑错误的代码,所以单独的API应该避免定义额外的错误代码。 作为参考,每个API调用平均处理3个错误就意味着大多数应用程序只是处理错误了,这对开发者来说体验不够友好。
如果选择在Response里定义code字段,调用方也许需要判断两次code。故我推荐使用GRPC里error定义好的code存储即可。
Thrift
thrift 最初是 facebook 开发使用的 rpc 通信框架,后来贡献给了 apache 基金会,出来得比较早,几乎支持所有的后端语言,使用非常广泛,是不可不知的一个网络框架
下载go库
1
go get git.apache.org/thrift.git/lib/go/thrift/...
编译安装
前往http://thrift.apache.org/download
下载源文件,我下载的版本是https://mirror.bit.edu.cn/apache/thrift/0.13.0/thrift-0.13.0.tar.gz
1
2
3
4
5
6// 解压
tar -zxvf thrift-0.13.0.tar.gz
cd thrift-0.13.0/
// 编译
./configure --prefix=/usr
make -j8
怎么都编译失败。。这特么。。先暂停。。
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2020/04/01/golang-rpc/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!