1.gRPC简介
- gRPC是由google开源的一个高性能的RPC框架。是由Stubby Google内部的RPC演化而来的,在2015正式开源。云原生时代是一个RPC标准。
- gRPC核心的设计思路
- 网络通信--->gRPC自己封装网络通信的部分,提供多种语言的网络通信的封装(C Java[Netty] GO)
- 协议--->采用HTTP2 传输数据,二进制数据内容。支持双向流(双工)连接的多路复用。
- 序列化--->protobuf (Protocol Buffers) google开源一种序列化方式,时间效率和空间效率是JSON的3---5倍。IDL语言
- 代理的创建---> 让调用者像调用本地方法那样 去调用远端的服务方法。stub
- gRPC的优势
- 网络通信协议为HTTP2,优于HTTP1.x
- gRPC大厂背书(Google),云原生时代 与其他组件合作的顺利。所以gRPC应用更广泛。
- gRPC的好处
- 高效的进行进程间通信。
- 支持多种语言,原生支持C、Go、Java实现。C语言版本上扩展 C++ C# NodeJS Python Ruby PHP..
- 支持多平台运行 Linux Android IOS MacOS Windows。
- gRPC序列化方式采用protobuf,效率高。
2.Http2.0协议
2.1回顾Http1.x协议
- HTTP1.0协议:请求响应的模式、短连接协议(无状态协议),即请求一次就结束,无状态不能保证用户认证,浏览器用session和cookie来解决。传输数据为文本结构、单工,无法实现服务端主动向客户端推送,变相实现推动的方式:(客户端轮训的方式)。
- Http1.1协议:请求响应的模式,有限的长连接,升级的方式WebSocket、双工,实现服务器向客户端推送。
- 总结Http1.x协议共性:
- 传输数据文本格式,可读性好的但是效率差。
- 本质上Http1.x协议无法实现双工通信。
- 资源的请求。需要发送多次请求,建立多个连接才可以完成。例如HTML、js、css分多次请求
- HTTP2.0协议
- HTTP2.0协议是一个二进制协议,效率高于Http1.x协议,可读性差。
- 可以实现双工通信。
- 一个请求 一个连接 可以请求多个数据。【多路复用】
- HTTP2.0协议的三个概念
- 数据流 stream
- 消息 message
- 帧 frame
3.Protocol Buffers [protobuf]
- protobuf是一种与编程语言无关【IDL】,与具体的平台无关【OS】。他定义的中间语言,可以方便的在client 于 server中进行RPC的数据传输。
- protobuf 两种版本 proto2 proto3,但是目前主流应用的都是proto3。
- protobuf主要安装protobuf的编译器,编译器目的,可以把protobuf的IDL语言,转换成具体某一种开发语言。
3.1protobuf编译器的安装
https://github.com/protocolbuffers/protobuf/releases
windows版本
- 直接解压缩,放在一个特定的目录之下
- 直接配置环境变量path
3.2protobuf IDEA插件
- 2021.2版本后面的新版本 IDEA内置了Protobuf插件
- 之前版本 可以选装第三方Protobuf插件
- 二者不能共存
3.3protobuf的语法详解
- 文件格式
.proto
UserService.proto
OrderService.proto
- 版本设定
syntax = "proto3";
- 与Java语言相关的语法
#后续protobuf生成的java代码 一个源文件还是多个源文件 xx.java
option java_multiple_files = false;
#指定protobuf生成的类 放置在哪个包中
option java_package = "com.suns";
#指定的protobuf生成的外部类的名字(管理内部类【内部类才是真正开发使用】)
option java_outer_classname = "UserServce";
- protobuf与Java对应的基本类型
- 枚举类型
enum SEASON{
SPRING = 0;
SUMMER = 1;
}
枚举的值,必须是0开始
- 消息 message
message LoginRequest {
string username = 1;
singular string password = 2;
int32 age = 3;
}
编号从1开始 到2^29-1 注意:19000 - 19999 不能用这个区间内的编号,因为他是protobuf自己保留的。
singular : 这个字段的值 只能是0个或1个 (默认关键字)
repeated
message Result{
string content = 1;
repeated string stutas = 2; //这个字段 返回值 是多个 等价于 Java List Protobuf getStatusList()-->List
}
protobuf [grpc]
可以定义多个消息
message LoginRequest{
....
}
message LoginResponse{
...
}
消息可以嵌套
message SearchResponse{
message Result{
string url = 1;
string title = 2;
}
string xxx = 1;
int32 yyy = 2;
Result ppp = 3;
}
SearchResponse.Result
message AAA{
string xxx = 1;
SearchResponse.Result yyy = 2;
}
oneof [其中一个]
message SimpleMessage{
oneof test_oneof{
string name = 1;
int32 age = 2;
}
test_oneof xxx
}
- 服务
service HelloService{
rpc hello(HelloRequest) returns(HelloResponse){}
}
# 里面是可以定义多个服务方法。
# 定义多个服务接口
# gPRC 服务 4个服务方式 。