# 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协议数据传输格式:

2、IP网络层常用协议:ICMP(ping|traceroute), IGP(RIP|OSPF), EGP(BGP), IGMP, TCP, UDP, ESP
2、IP网络层安全IPsec策略: AH | ESP(源点鉴别、数据完整性、保密)

3、传输层TCP协议通信格式:

3、传输层UDP协议通信格式:

4、安全传输层SSL: 报文鉴别, 报文完整性, 报文加密, 对称加密(DES)|非对称加密(MD5|SHA)
4、应用层常用协议: HTTP, WebSocket, MQTT, RTSP(RTP, RTCP), FTP
5、RTP通信协议格式:

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