gRPC首次使用问题
- 报错信息1:
- 造成原因:客户端与服务端采用模式不同,服务端采用PLAINTEXT模式,客户端默认采用TSL模式。
- 解决方案:参考,添加配置信息:
grpc.client.注册服务名.negotiationType=PLAINTEXT
- 报错信息2:
Runnable threw exception java.lang.NoSuchMethodError: com.google.protobuf.GeneratedMessageV3.isStringEmpty(Ljava/lang/Object;)Z
- 造成原因:
protobuf-java
依赖版本冲突,经排查项目引用了MySQL连接相关依赖mysql-connector-java
且较先声明,其内包含低版本的protobuf-java
(Maven依赖采用了此低版本),导致与给定的gRPC SDK所需要的版本冲突而运行时报错。 - 解决方案:统一依赖版本,排除mysql依赖中的
protobuf-java
或较先声明需要版本的protobuf-java
依赖。
gRPC 高性能RPC框架
- 造成原因:
- RPC 的全称是 Remote Procedure Call Protocol,中文名是远程过程调用协议。
gRPC简介
- google开源的高性能RPC框架
- 支持异构编程语言的调用
- gRPC核心设计思路:
- 网络通信:自己封装了网络通信的部分,包括多种语言的网络通信封装,如C、Go、Java
- 协议:http2,传输二进制数据内容,支持双工通信
- 序列化:基于文本-json,基于二进制-Java原生序列化,gRPC的序列化采用的是二进制序列化方式-protobuf
- 代理的创建:让调用者像调用本地方法一样调用远程的方法,stub存根
gRPC优点
- 高效的进程间通信
- 支持多种语言,对主流语言原生支持-C、Go、Java
- 支持多平台运行
- 高效的序列化方式protobuf
- 使用http2
HTTP 协议
- HTTP1.0协议:
- 请求响应模式,短连接协议(无状态协议),可以用WEB开发的HttpSession解决无状态问题。
- http协议是基于tcp协议之上的,tcp是长连接,而http是短连接的原因是服务器资源及硬件环境有限。
- 传输数据结构为文本结构,单工通信,无法实现推送,可采用客户端轮询的方式变相实现推送。
- HTTP1.1协议:
- 请求响应模式,可实现有限长连接,通过头信息中的keepalive来保持一段时间的长连接
- 衍生一种升级的技术方式WebSocket协议,可以双工,实现服务器向客户端推送
- HTTP2.0协议:
- 是一个二进制协议,效率高于HTTP1.x协议,可读性较差
- 可以实现双工通信
- 一个请求可以请求多次或多个数据,多路复用
- HTTP2.0协议的三个概念:
- 数据流 stream
- 消息 message
- 帧 frame
- 其他相关概念:
- 数据流的优先级,通过设置stream的权重来限制不同流的传输顺序
- 流控,客户端发送太快,服务端处理不过来,通知客户端暂停发送数据流
Protocol Buffers(ProtoBuf)
- 一种与编程语言无关(IDL),与具体平台无关(OS),定义的一种中间语言,可以方便再client和server间进行RPC数据传输
- protobuf语言两个版本:proto2,proto3(主流应用)
- 需要安装protobuf的编译器来将protobuf的IDL语言转化为具体的某种开发语言
ProtoBuf语法详解
- 文件格式:*.proto,Hello.proto
- 版本设定:
syntax="proto3";
- 注释:单行注释:
// 注释内容
,多行注释:/* 注释内容 */
- 与Java语言相关的语法:
# 后续protobuf生成的Java代码是一个源文件还是多个源文件 option java_multiple_files=true # 指定Java类的包结构 option java_package="" # 指定生成的外部类的名字(内部类才是后续开发中真正使用的) option java_outer_classname=""
- 逻辑包:
package xxx
protobuf对于文件的管理 - 导入:
import "xxx/xxx.proto"
,在当前proto中导入其他proto - 数据类型
- 消息Message
message UserRequest{ string username = 1; string password = 2; int32 age = 3; }
- 编号从1到2^29-1之间,注意:19000-19999这个区间内的编号不能用,被protobuf保留了
- singular:对应0或1个值:null或"某个值"
- repeated:修饰集合字段的关键字
- 消息可以嵌套,可以定义多个消息
- 服务Service
gRPC四种通信方式
- 简单rpc 一元rpc (Unary RPC):一请求一响应
- 服务端流式rpc (Server Streaming RPC)
- 客户端流式rpc (Client Streaming RPC)
- 双向流式rpc (Bi-directional Streaming RPC)