https://blog.csdn.net/beyond_qjm/article/details/79083126
https://blog.csdn.net/u011955252/article/details/78758183
https://blog.csdn.net/u012165769/article/details/88205604
https://www.cnblogs.com/wuzhenzhao/p/10000943.html
grpc
dubbo thrift jsf
RPC RMI
关键字
网络传输 序列号/反序列化 动态代理/反射 协议
RPC框架
支持多语言框架:
- Google的grpc
https://blog.51cto.com/13914991/2309916?source=dra
基于http2协议、protobuf 3.x Netty4.x
使用protobuf定义接口(跨语言实现) 即.proto文件 ->数据模型和RPC接口服务
使用compile工具生成特定语言的代码,(比用反射实现的性能高)
启动Server端,grpc内置netty
Client, request和response均被封装成http2的stream Frame - Facebook的 thrift
- 百度 brpc
支持服务治理微服务化特性框架,底层仍为rpc框架,阿里dubbo,jsf
Grpc框架原理及底层实现
参考链接:https://www.jianshu.com/p/5c3489d0da46
原理解析
gRpc的client与server,均通过Netty Channel作为数据通信,序列化,反序列化使用Protobuf,每个请求都被封装成http2的Stream,在整个周期中,客户端Channel应该保持长连接,而不是每次调用重新创建Channel,响应结束后关闭Channel(即短连接,交互式rpc),目的就是达到连接的复用,进而提高交互效率
ProtocolBuffer(protobuf/pb)
xml,json存储结构化数据
protobuf更加高效,数据压缩地更小,大约是json的1/10,XML格式的1/20
数据结构类型
复合数据类型:
枚举和message类型
标准数据类型:
限定修饰符 | 数据类型 | 字段名称 = |字段编码值| 字段默认值|
字段编码值->该Number是用来比标记该字段在序列化后的二进制数据中所在的field,每个字段的Number在message内部都是独一无二的,也不能进行改变,否则数据就不能正确解包
修饰符:
1. required: proto3去掉
2. optional:proto3去掉
3. repeated (相当于数组):proto3保留
4. map<key_type,value_type> map_field = N;
required PhoneType type = 2[default = HOME]
syntax = "proto2"
message Person{
enum PhoneType{
MOBILE =0;
HOME=1;
WORK=2;
}
required PhoneType type = 2[default = HOME]
}
1. 编译.proto文件 -> 生成xxx_pb2.py文件 ->基于IDL文件定义服务,通过proto3工具生成指定语言多数据结构、服务端接口以及客户端stub
//并不是通过动态代理和发射机制,而是通过proto工具生成代码
from xxx_pb2 import Person
2. 定义服务:如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根
3. 通信协议
基于标准的http2设计,支持双向流,消息头压缩,单TCP的多路复用、服务端推送等特性
定义gRPC服务
// 1. 一个服务通过参数和返回类型来指定可以远程调用的方法
// 我们通过protocol buffers接口定义服务方法,
// 用pb来定义参数和返回类型,
// 客户端和服务端均使用服务定义生成的接口代码
syntax="proto3";
option java_package = "io.grpc.examples";
package helloworld;
service Greeter{
rpc Sayhello (HelloRequest) returns(HelloReply) {}
}
message HelloRequest{
string name = 1;
}
message HelloReply{
String message = 1;
}
=======================================================
2. 生成gRPC代码
// 可以使用protocol buffer 编译器 protoc 来生成创建
// 生成的代码同时包括客户端的存根和服务端要实现的抽象接口
3. 编写补充服务器和客户端逻辑代码
参考链接:https://blog.csdn.net/luanpeng825485697/article/details/81029492
https://doc.oschina.net/grpc?t=58008
https://blog.51cto.com/13914991/2309916?source=dra
各种数据格式序列化和反序列化对比
效率 兼容性 序列化后字节长度
可读性: json,xml序列化后都是文本,便于阅读 hessian 、pb为二进制的序列化后不可读
参考链接 https://www.cnblogs.com/beyondbit/p/4778264.html
RPC框架对比
实时调用,1.目标跨语言 2.支持服务治理
网友评论