rpc

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框架

支持多语言框架:

  1. 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
  2. Facebook的 thrift
  3. 百度 brpc

支持服务治理微服务化特性框架,底层仍为rpc框架,阿里dubbo,jsf

Grpc框架原理及底层实现

参考链接:https://www.jianshu.com/p/5c3489d0da46

grpc图.png

原理解析

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 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.支持服务治理

你可能感兴趣的:(rpc)