2021SC@SDUSC
一、前言
本系列博客用于记录和学习本次软件工程创新与实践的课题项目,课题选择为ActiveJ。那么ActiveJ的代码分析与研究就从本篇博文开始。
什么是 ActiveJ ?
ActiveJ——用于现代网络、云、高负载和微服务解决方案的Java框架。是全功能的现代Java平台,作为Spring/Micronauts/Netty/Jetty的替代品从头开始创建。它被设计成自给自足(无第三方依赖)、简单、精简并提供终极性能。由一系列库组成,从依赖注入和高性能异步I/O(受Node.js启发),到应用服务器和大数据解决方案。
ActiveJ是本机高性能解决方案,应用于处理大量请求。根据ActiveJ网站的说法,它最初是为RTB广告平台的解决方案重新开发的,该平台每天处理超过1000亿个入站请求。
为了满足这个想法,ActiveJ不仅效率极高,而且还提供了另一种开发方法。它具有最少的第三方依赖关系,可实现高性能,一致性和简化的开发流程。ActiveJ使应用程序业务逻辑超出了框架规范和限制。
根据官网给出的特点介绍有以下几点:
最小的依赖性
轻量级的简约自给自足的Java框架,没有第三方的依赖性
丰富的堆栈
具有丰富的技术堆栈,用于构建闪电般快速的异步应用程序
无顶棚
极简的无开销设计,提供出色的性能
最佳选择
Spring、Micronaut、Apache Spark、Quarkus和其他解决方案的全功能替代品
图片展示更加直观:
由于之前没有接触过ActiveJ,所以很难给出客观的评价。对于ActiveJ的一切,就让我们从这篇博文开始,去学习研究它的代码构成,走到最后再回头看。
二、组成部分
ActiveJ具有一组松散耦合的组件,主要由以下八个部分构成:
Async-IO——异步的IO处理
具有高效的事件循环、承诺和流媒体协议的高性能异步IO。包括:Eventloop,Promise和Net。它还具有异步数据流处理功能:CSP和Datastream。
HTTP——最快的HTTP服务器之一
异步的HTTP服务器和客户端,支持WebSocket。适用于每秒处理数百万次的请求。根据基准测试,在某些使用情况下,即使在单核上并且总CPU负载也要少50%,它比多线程Vert.x HTTP服务器快15%。带有嵌入式HTTP服务器的最小ActiveJ Web应用程序的总大小仅为1.4MB,启动时间仅为0.65秒,而Spring为17MB和14秒。
Inject——依赖性注入库
优化了应用程序的快速启动和最终的运行时的性能。强大的依赖图反省能力。它没有第三方依赖性,可以独立于ActiveJ平台使用。
Serializer——最快的JVM序列化器
基于注解的序列化,动态生成的序列化器。支持子类、集合和特殊集合。ActiveSerializer是使用ActiveCodegen实现的,并引入了无模式的方法来实现序列化过程的最佳性能。它具有对Java子类,集合(包括带有循环引用的图形以及HPPC等专用集合)的全面支持。而且,它支持插件,扩展,版本控制,可以使用Java注释等进行微调。根据ActiveSerializer网站上的基准测试,它是世界上最快的基于JVM的序列化器。
Codegen——即时生成类
在QbjectWeb ASM库的基础上动态生成字节码。通过精简的API封装了直接字节码操作的复杂性。它使用自动类型推断,将开销几乎为零的类Lisp类AST树表达式直接编译为字节码。
Specializer——加快代码速度
通过自动重写类,用静态方法调用代替动态创新,提高类的运行性能。根据基准测试,在某些情况下,ActiveSpecializer可使您的代码速度提高7倍。
FS——管理文件系统
在普通文件操作之上的微小异步抽象。本地或远程文件存储,以及大数据的集群存储。它具有类似于FTP的简单协议以及零开销流传输,并支持数据冗余,重新平衡和重新分片。
RPC——微服务的二进制协议
用于高负荷分布式应用的库。一个没有HTTP开销的微服务构架的替代方案。
这8个功能共同构成了ActiveJ,使其能大规模处理数据的,提供优秀的后端应用服务。
而基于Gitee上源代码来分析,严格的在源代码中确立分工是有些困难的,因为作为一个整体的框架来看,ActiveJ的很多功能都要基于其它部分提供的支持,因此在小组合作时根据这8个功能进行整体分工,而在具体的分析上需要成员们相互帮助来获得更全面的知识。
本系列博客将围绕Async-IO和ActiveJ HTTP两部分展开。
三、源码分析
项目源码从gitee获取,下载并配置其环境后,其结构如下:
下载完成后还需要在IDEA里等待更新项目所需要的index和Maven依赖,过程由IDEA自动完成。
在具体项目中,如下图:
src/main/java/io.activej目录下的是子项目HTTP的对外代码,即会被外部访问的功能,分析这些java文件是本次课程的核心内容,需要在这里面查看并分析ActiveJ所提供的功能,并通过递归的方式查看其引用的定义和依赖。
而src/test是开发者在开发过程中内部进行测试的包,其一般都是测试单个或局部的功能,以实现需求分析。这些代码相比于/main中在结构上会有些简单,但是依旧是分析功能时所可以参考的来源。
其余部分代码不过多分析,在之后的几篇博文中我们将对其进行细致的分析与探讨。
四、结语
从其源码结构上来看,相对于我过去所写的项目文件结构,有许多值得我学习的地方。更加严谨整洁的文件管理,会方便我们进行更好的整理与实现项目。而学习其长处也是我们这门课程的主要目的。
此外,从以上的陈述中,不难看出ActiveJ是一个全新的开发平台,可通过轻量级且可本地伸缩的异步体系结构创建各种复杂程度的现代应用程序,从而从硬件中挤出最后的性能。分析它的源代码,也会给予我们极大帮助,可以让我们熟练的使用ActiveJ。最后,希望ActiveJ能变得更加优秀。