# MyRemoteServer **Repository Path**: org_mkg/MyRemoteServer ## Basic Information - **Project Name**: MyRemoteServer - **Description**: 分布式技术栈: 网络通信组件(NIO + Selector + ByteBuffer) - **Primary Language**: Java - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: https://gitee.com/org_mkg/MyRemoteServer - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-10-16 - **Last Updated**: 2021-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyRemoteServer #### 介绍 基于Netty的async|sync通信组件 #### 软件架构 1、基于reactor模式的实现, 利用java nio中selector对象 详情请看pdf: https://cugxdy.oss-cn-beijing.aliyuncs.com/java/nio.pdf
2、计算机网络基础:
 1、网络层IP协议数据传输格式:
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/IP%E5%8D%8F%E8%AE%AE.png)
 2、IP网络层常用协议:ICMP(ping|traceroute), IGP(RIP|OSPF), EGP(BGP), IGMP, TCP, UDP, ESP
 2、IP网络层安全IPsec策略: AH | ESP(源点鉴别、数据完整性、保密)
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/ESP.png)
 3、传输层TCP协议通信格式:
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/TCP.png)
 3、传输层UDP协议通信格式:
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/UDP.png)
 4、安全传输层SSL: 报文鉴别, 报文完整性, 报文加密, 对称加密(DES)|非对称加密(MD5|SHA)
 4、应用层常用协议: HTTP, WebSocket, MQTT, RTSP(RTP, RTCP), FTP
 5、RTP通信协议格式:
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/ESP.png)
 5、协议设计感想:
  1、字节:totalLength(4), version(1), flag(1),
  2、结构:FixedHeader + VaribleHeader + ProtocolData
2、netty高性能之道:
 1、Netty服务中独特线程无锁化设计
```Java @Override // 减少线程锁竞争, 关键代码之处 public boolean inEventLoop(Thread thread) { return thread == this.thread; } ```  2、Netty服务中资源Recycler复用对象
 3、Netty服务中对Selector对象下Set优化SelectionKey[]数组形式
```Java Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys"); Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys"); Throwable cause = ReflectionUtil.trySetAccessible(selectedKeysField, true); if (cause != null) { return cause; } cause = ReflectionUtil.trySetAccessible(publicSelectedKeysField, true); if (cause != null) { return cause; } selectedKeysField.set(unwrappedSelector, selectedKeySet); publicSelectedKeysField.set(unwrappedSelector, selectedKeySet); ```  4、Netty服务中FastThreadLocal对象设计
 5、Netty服务中零拷贝技术运用Unsafe对象(copy,allocate、reallocate、set)
 6、Netty服务中Direct类型内存满二叉树内存管理复用(Pooled)
 7、Netty服务中异步(ASYNC)处理逻辑
 8、Netty服务中责任链模式, 双向流inbound、outbound流处理对象
 9、MpscQueue队列: SConsumer-MProducer模式
 10、Future-Promoise机制: 提供了Netty服务中异步通知机制FutureListener
3、Netty中线程池与JDK中线程池差异比较:
 1、任务执行顺序: Netty线程池中SThread-SQueue对象, 即保证了Queue队列任务执行顺序;JDK线程池中MThread-SQueue线程模型, 即不能保证Queue中任务按顺序执行
 2、负载均衡: Netty线程池可以User自主选择提交的Queue对象, 当然这需要User自身实现;JDK线程池只存在单一Queue对象, User灵活性不足。
 3、Queue: Netty线程池可以选择MpscQueue队列以替代JDK下Queue对象来提升性能
 4、JDK线程池在core|max线程数量上比Netty线程池灵活
 5、性能比较:
4、netty服务中网络层拆包对象: FixedLengthFrameDecoder、LengthFieldBasedFrameDecoder、LineBasedFrameDecoder
5、netty服务中应用层分包对象:ChunkedWriteHandler
5、netty网络通信设计模式:
 1、单例模式
 2、责任链模式
 3、工厂模式
 4、适配器模式
 5、委托模式
4、netty中代码出奇之处:
 1、使用BitSet对象来校验无效字符
 2、使用数组形式去优化Set
```Java selectedKeysField.set(unwrappedSelector, selectedKeySet); publicSelectedKeysField.set(unwrappedSelector, selectedKeySet); ``` 2、通信模块数据传输字节格式: ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/U%7EWLQ_G%5BX%25%7D2XZAZXL%29B9HW.png)
2、netty中处理流的channelhandler继承图: ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/PLN%29GVYXDIQDZF_%28GNHA%5BSS.png)
7、Netty中线程模型图, 记录了Netty高并发来源, inEventLoop设计以及线程模式设计。它给Netty高并发、高性能提供了线程池: ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/NettyThread.png)
9、Netty服务中FastThreadLocal性能较ThreadLocal对象性能快三倍: https://www.cnblogs.com/jiangxinlingdu/p/11123538.html
10、Netty服务中WeakRerference虚引用内存泄露检测机制图解:
 1、强引用: GC不会去回收强引用下对象, 即是内存不足时, OutOfMemoryError;
 2、软引用(SoftReference): 在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常.;
 3、弱引用(WeakReference): 无论内存是否足够,只要 JVM开始进行垃圾回收,那些只被弱引用关联的对象都会被回收.;
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/WeakRerference.png)
7、Http协议:
 1、Http协议版本: 1.0 | 1.1 | 2.0;
 2、Http协议编码类继承图:
 3、HttpRequest请求方法:GET/POST/HEAD/CONNECT/OPTION/DELETE等
 4、HttpPost压缩数据gzip|zlib:
 4、Http请求中常用HeaderKV对象:
  Connection: close(DRR)|keepalive(MRR)|upgrade(WebSocket);
  Cache-control: no-cache
  Transfer-Encoding: chunked(分片)
 4、Http协议编码格式:
![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/HttpMessage.png)
8、HttpPost请求数据解析 = Attribute对象 + FileUpload对象
 1、Multipart/form-data: Attribute数据格式: --DataBoundary\r\nContent-Disposition: form-data; name="field"\r\nContent-Type: text/plain; charset="UTF-8"\r\n\r\nvalue
 2、Multipart/form-data: FileUpload数据格式: --DataBoundary\r\nContent-Disposition: form-data; name="field"; fileName="fileName"\r\nContent-Type: image/jpg\r\nContent-Transfer-Encoding: binary\r\n\r\nFileContent
 3、Multipart/form-data: FileUpload数据格式: --DataBoundary\r\nContent-Disposition: form-data; name="field"\r\nContent-Type: Multipart/Mixed; boundary:MixedBoundry\r\nContent-Disposition: attachment; fileName="filename"\r\nContent-Type: image/jpg\r\nContent-Transfer-Encoding: binary\r\n\r\nFileContent
 4、application/x-www-form-urlencoded: Attribute数据格式: name=value&address=beijing
 5、HttpPost请求发送处理流程: HttpPostRequestEncoder -> ChunkedWriteHandler -> HttpContentEncompressor -> HttpRequestEncoder;
 6、HttpPost请求接收处理流程: HttpRequestDecoder -> HttpContentDecompressor -> HttpContentEncompressor -> HttpPostMultipartRequestDecoder;
9、WebSocket协议:
 1、WebSocket协议类型: CLOSE/PING/PONG TEXT/BINARY/CON;
 2、WebSocket版本类型: 00/07/08/13;
 3、WebSocket协议服务责任链: HttpServerCodec -> HttpObjectAggregator -> WebSocketServerProtocolHandler -> WebSocketFrameAggregator -> IdleStateHandler -> MyHandler
 4、WebSocket协议客户责任链: HttpClientCodec -> HttpObjectAggregator -> WebSocketClientProtocolHandler -> WebSocketFrameAggregator(ChunkedWriteHandler) -> IdleStateHandler -> MyHandler;
 5、WebSocket协议下(限流(ChannelTrafficShapingHandler)|Idle(IdleStateHandler)|分片(ChunkedWriteHandler))
 6、WebSocket协议通信字节格式: ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/WebSocketProto.png)
 7、WebSocket协议详细代码:MyRemoteServer/src/main/java/org/cugxdy/bytes/codec/http/websocket ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/WebSocket.png)
10、MQTT协议:  1、MQTT协议类型: CONN|PUBLISH|UNSUBSCRIBE|SUBSCRIBE|DISCONN|PUBREC|PUBREL|PUBCOMP等类型
 2、MQTT协议版本:3.1.1 | 3.1;
 3、MQTT协议: FixedHeader + VariableHeader + Payload;
 4、MQTT协议下编解码器: MqttDecoder | MqttEncoder;
 5、MQTT协议详细代码:MyRemoteServer/src/main/java/org/cugxdy/bytes/codec/mqtt ![Image text](https://cugxdy.oss-cn-beijing.aliyuncs.com/picture/MQTT.png)
#### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)