从最简单的单体 Server 架构,将模块化功能解耦,逐步演化为 Tomcat 现有的整体架构。从静态设计、动态设计和类加载机制三个方面介绍 Tomcat 的优势以及架构的优美。
Redis 多机数据库的实现
先介绍了 Redis 中主从服务器复制的流程,后介绍到实现 Sentinel 机制来保证故障的发现和转移,进一步介绍集群的数据流转原理。而这些机制合而为一,共同构成了 Redis 的多机数据库的实现原理,即:主从复制、数据 slot 化管理、故障的监察与转移等。
Redis 数据持久化
Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RDB 和 AOF 两种持久化方案,包括操作方法和持久化的实现原理。
Redis 数据结构与对象系统
对于 Redis 来说,它的高性能是取决于多个方面的。而高效的数据结构以及合理的数据编码使得 Redis 在保持高效读写的同时,更好的利用内存。
JDK 函数式编程及Stream流
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。Lambda 表达式增强了集合库。Java SE 8 添加了2个对集合数据进行批量操作的包:java.util.function
包以及java.util.stream
包。流(Stream)就如同迭代器,但附加了许多额外的功能,能让原先复杂的代码变得简洁而优雅,这无疑得到了一些人的青睐。Lambda 表达式的本质只是一个”语法糖”,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。但随之而来的问题是难以调试。
JDK Reference Object
对 Java 的五种引用(强引用、软引用、弱引用、虚引用、终引用)进行了概念上的介绍,着重介绍了 Reference 配合 ReferenceQueue 的状态流转、ReferenceQueue 的原理介绍和 FinalReference 与 JVM 的调用关系和原理。
Netty 私有协议栈开发
对自定义协议栈的网络拓扑图、通信模型、消息定义、链路的建立关闭、可靠性设计、安全性设计、可扩展性设计七个方面进行介绍,并通过 Netty 实现一套相应的简单的的通信协议,加强对网络传输和 Netty 的了解。
Netty EventLoop和EventLoopGroup
Netty 框架的主要线程就是 IO 线程,线程模型设计的好坏,决定了系统的吞吐量、并发性和安全性等架构质量属性。Netty 的线程模型(也就是 Reactor 模型)被精心地设计,既提升了框架的并发性能,又能在很大程度避免锁,局部实现了无锁化设计。
Netty Channel和Unsafe
提起 Channel,可以联想到java.nio.SocketChannel
和java.nio.ServerSocketChannel
,它们用于非阻塞的IO操作。类似于 NIO 的 Channel,Netty 提供了自己的 Channel 和其子类实现,用于异步 IO 操作和其他相关的操作。
Unsafe 是个内部接口,聚合在 Channel 中协助进行网络读写相关的操作,因为它的设计初衷就是 Channel 的内部辅助类,不应该被 Netty 框架的上层使用者调用,所以被命名为 Unsafe。这里不能仅从字面理解认为它是不安全的操作,而要从整个架构的设计层面体会它的设计初衷和职责。
Netty 内存池优化原理
为了提升消息接收和发送性能,Netty 针对 ByteBuf 的申请和释放采用了池化技术,通过 PooledByteBufAllocator 可以创建基于内存池分配的 ByteBuf 对象,这样就避免了每次消息读写都申请和释放ByteBuf,这样很大程度减少了 GC 的次数,对性能提升是非常可观的。