随笔分类 - Netty
摘要:Java 提供的对象输入流(ObjectInputStream)和输出流(ObjectOutputStream),可以直接把 Java 对象作为可存储的字节数据写入文件,也可以传输到网络上。对于程序员来说,基于 JDK 默认的序列化机制可以避免操作底层的字节数组,从而提高开发效率。Java 序列化的
阅读全文
摘要:更多内容,前往个人博客 当说到 Netty 线程模型的时候,一般首先会想到经典的 Reactor 线程模型,尽管不同的 NIO 框架对于 Reactor 模式的实现存在差异,但本质上还是遵循了 Reactor 的基础线程模式。 一、Reactor 单线程模型 无论是C++ 还是 Java 编写的网络
阅读全文
摘要:一、粘包出现的原因 服务端与客户端没有约定好要使用的数据结构。Socket Client实际是将数据包发送到一个缓存 buffer中,通过 buffer刷到数据链路层。因服务端接收数据包时,不能断定数据包1何时结束,就有可能出现数据包2的部分数据结合数据包1发送出去,导致服务器读取数据包1时包含了数
阅读全文
摘要:优秀博文:IT-BLOG-CN 序列化 :把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口 Serializable:Java.io.Serializable 接
阅读全文
摘要:更多内容,前往个人博客 Protobuf 全称:Google Protocol Buffers,由谷歌开源而来,经谷歌内部测试使用。它将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的方法和属性。 一、 Protocol 的特
阅读全文
摘要:更多内容,前往个人博客 Thrift 源于 Facebook,在 2007 年 Facebook 将 Thrift 作为一个开源项目提交给了 Apache 基金会。对于当时的 Facebook 来说,创造 Thrift 是为了解决 Facebook 各系统间大数据量的传输通信以及系统之间语言环境不同
阅读全文
摘要:更多内容,前往个人博客 零拷贝是指避免在用户态(User-space)与内核态(Kernel-space)之间来回拷贝数据的技术。 一、传统 IO 传统 IO(InputStream/OutputStream)读取数据并通过网络发送数据的流程,如下图: 【1】当用户空间使用 read() 询问内
阅读全文
摘要:一、BIO、NIO 和 AIO 【1】阻塞 IO(Blocking I/O):同步阻塞I/O模式,当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取一些数据或者写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。在活动连接数不是特别高(小于单机1000
阅读全文
摘要:Dubbo 底层使用 Netty 作为网络通信框架。【网络传输问题】:相对于传统的 RPC 或者 RMI 等方式的远程服务过程调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增长之后,同步阻塞 I/O 会由于频繁的等待导致 I/O 线程经常性阻塞,由于线程无法高效的工作,I/O处理能力自然会下
阅读全文
摘要:一、阻塞IO / 非阻塞NIO 阻塞IO:当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。 非阻塞NIO:NIO 与原有的 IO 有同样的作用和目的,但是使用的方式完全不同,NIO
阅读全文
摘要:项目有一段时间,不常用的应用响应变慢,每次持续几秒钟到几十秒钟就自动恢复。如果响应变慢是持续的还好办,直接用 jstack 抓线程堆栈,基本可以很快定位问题。关键持续时间只有最多几十秒钟,而且是偶发的,一天只发生一两次,有时几天才发生一次,发生时间点也不确定,人盯着然后用 jstack手工抓线程堆栈
阅读全文
摘要:计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的 CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SSD(固态硬盘)硬盘价格高昂,不能在短时间内完全替代传统硬盘。传统磁盘的 I/O读写速度成为了计算机系
阅读全文
摘要:SimpleChannelInboundHandler 【类的关系】:如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAdapter的。也就是说SimpleChannelInboundHandler 也拥有 Channel
阅读全文
摘要:一、Netty 服务端启动过程 【1】创建服务端 Channel;【2】初始化服务端 Channel;【3】注册 Selector;【4】端口绑定:我们分析源码的入口从端口绑定开始, ServerBootstrap 的 bind(int inetPort)方法,实际上是 AbstractBootst
阅读全文