使用 grpc
- 安装
# 安装grpc
go get -u google.golang.org/grpc# 安装protobuf
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zip
unzip protobuf-all-3.5.1.zip
cd protobuf-3.5.1/
./configure
make
make install
# 检查是否安装成功
protoc --version# 安装go protoc plugin
go get -u github.com/golang/protobuf/protoc-gen-go
- 【RPC的使用和原理】grpc是一个高性能、开源的通用RPC框架,具有以下特性:
- 强大的IDL,使用Protocol Buffers作为数据交换的格式,支持v2、v3(推荐v3)
- 跨语言、跨平台,也就是Grpc支持多种平台和语言
- 支持HTTP2,双向传输、多路复用、认证等
- gRPC 的服务接口实现类的调用并不是通过动态代理和反射机制,而是通过 protoc 工具生成代码
- 在服务端启动时,将服务接口实现类实例注册到 gRPC 内部的服务注册中心上
- 请求消息接入之后,可以根据服务名和方法名,直接调用启动时注册的服务实例,而不需要通过反射的方式进行调用,性能更优
- 除了simple PRC模式,grpc也支持streaming模式
- 包括client_to_server_streaming、server_to_client_streaming、bidirectional_streaming三种类型
- 就是说同时支持单边流和双向流
- 对于 streaming 模式,可以充分利用 HTTP/2.0 协议的多路复用功能,实现在一条 HTTP 链路上并行双向传输数据,有效的解决了 HTTP/1.X 的数据单向传输问题,在大幅减少 HTTP 连接的情况下,充分利用单条链路的性能,可以媲美传统的 RPC 私有长连接协议
文章图片
- 包括client_to_server_streaming、server_to_client_streaming、bidirectional_streaming三种类型
- grpc 的协议支持流量控制,这里也是采用了 http2 的 flow control 机制
- message编码成二进制消息体时字段编号1-15将会占用1个字节,16-2047将占用两个字节
- 所以在一些频繁使用用的message中,你应该总是先使用前面1-15字段编号
.proto
文件中的注释和C,C++的注释风格相同,使用//
和/ ... /
- 如果添加了新字段,任何由旧版消息格式生成的代码所序列化的消息,仍能被依据新消息格式生成的代码所解析
- 类似的,新代码创建的消息也能由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增的字段
文章图片
- grpc-gateway读取gRPC服务定义,并生成一个反向代理服务器,将 RESTful JSON API转换为gRPC
- 假定希望用Rpc作为内部API的通讯,同时也想对外提供Restful Api,又不想写两套,于是可以使用Grpc Gateway
- gRPC 的协议是基于 HTTP/2 的,因此应用程序能够在单个 TCP 端口上提供 HTTP 和 RPC 接口服务(两种不同的流量)
- 对于HTTP流量,必须使用TLS加密,即必须采取https的形式
- 因为 net/http2 仅支持 “h2” 标识,而 “h2” 标识 HTTP/2 必须使用传输层安全性(TLS)的协议
文章图片
- 因为 net/http2 仅支持 “h2” 标识,而 “h2” 标识 HTTP/2 必须使用传输层安全性(TLS)的协议
- https://zhuanlan.zhihu.com/p/82604466
- https://eddycjy.com/posts/go/talk/2019-06-29-talking-grpc/
原理
- RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节
- 服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程
文章图片
- 服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程
![RPC的使用和原理](https://img.it610.com/image/info8/3afc5f3d6bf544788b93bc7f958ef231.jpg)
文章图片
推荐阅读
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- docker|Docker
- #|7.分布式事务管理
- python|PyTorch单机多卡分布式训练教程及代码示例
- 分布式 | 动态调整 DBLE 内线程池的数目