gRPC首次使用问题

  • 报错信息1:企业微信截图_17085708151420.png
    • 造成原因:客户端与服务端采用模式不同,服务端采用PLAINTEXT模式,客户端默认采用TSL模式。
    • 解决方案:参考,添加配置信息:grpc.client.注册服务名.negotiationType=PLAINTEXT
  • 报错信息2:Runnable threw exception java.lang.NoSuchMethodError: com.google.protobuf.GeneratedMessageV3.isStringEmpty(Ljava/lang/Object;)Z企业微信截图_17085797339551.png
    • 造成原因: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)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

古乃特

Java Developer

不积跬步无以至千里~

最新文章

Docker 入门详解

2024年2月29日

Docker 入门详解 初识docker...

Linux使用记录

2024年2月29日

Linux 25.8K 开源的 Linu...

gRPC框架学习记录

2024年2月29日

gRPC首次使用问题 报错信息1: 造成...

多线程间ThreadLocal数据传递

2024年2月29日

多线程编程ThreadLocal数据传递...

世界,您好!

2023年9月13日

欢迎使用WordPress。这是您的第一...

All Rights Reserved. 版权所有 © 2024 古乃特

黔ICP备2024019367号
0
希望看到您的想法,请您发表评论x
滚动至顶部