Netty

Buffer

缓冲区,负责数据存取

Buffer.allocate();//分配缓冲区大小  建立在jvm 内存中
allocateDirect();//缓冲区建立在物理内存上
put();//从指针所在位置写
get();//从指针所在位置读
flip();//写模式切换到读模式, 指针移到可读区首位置, limit为可读取大小
rewind();//指针移到可读区首位置
clear();//指针移到缓冲区0 , limit移到缓冲区尾, 缓冲区内的数据并没有被清除
mark();//记录当前指针的位置
reset();//指针移动到上次mark记录的位置
hasRemaining();//指针之后 是否还有数据

capacity : 缓冲区容量, 分配后不可变 limit: 可以操作数据区的大小, 超过 limit 界限的数据不可操作 position: 当前指针位置 mark: 记录当前指针的位置, 指针可以通过 reset 恢复到 mark 的位置

Channel

数据通道, 负责缓冲区数据传输 FileChannel SockerChannel ServerSocketChannel DatagramChannel 获取 channel: IO 流 getChannel() Channel 各实现类open() Files 类newByteChannel()

分散读取: channel 中的数据依次分散到多个缓冲区 聚集写入: 多个缓冲区的数据聚集到通道

Charset

编码 解码

Charset.forName("UTF-8");
newEncoder();
newDecoder();

Pipe

单向管道 sink 缓冲区的数据写入管道 source 管道中的数据读取到缓冲区

Netty 走起

编解码

HttpServerCodec : http 编解码器 ChunkedWriteHandler : HttpObjectAggregator : 把分散的 http 信息聚合为完整的 FullHttpRequest/FullHttpResponse WebSocketServerProtocolHandler: 处理 websocket 协议, 建立 endpoint DelimiterBasedFrameDecoder: 按分隔符解码

ChannelGroup

一个Set集合,保存 server-client 建立的 channel 对象, 触发 handlerRemove 之后, channelGroup 集合会自动被移除 remove 的 channel 对象

Pipeline

IdleStateHandler: 读写空闲,会触发 userEventTrigered 事件

序列化

ProtoBuf Thrift

.ptoto message 示例

syntax = "proto2";

package tutorial;

option optimize_for = SPEED;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}
protoc --java_out=/xxx/xxx /xx/xxx.proto

序列化: 生成的对象.newBuilder().setXXX().setXXX().build();---->toByteArray(); 反序列化: 生成的对象.parseFrom(byteArray);

grpc

github 按流程来

gradle 插件, 指定.proto 文件位置, generateProto 后, 把文件从 build 下 copy 到 src 下, clean 掉 build 内容

上次更新: 3 个月前