2021SC@SDUSC
前言
作为本次软件工程创新与实践的课题项目,ActiveJ的代码分析与研究就从这篇博文开始。
首先是自己向自己提出问题,什么是ActiveJ?
引用ActiveJ网站的介绍:
"-----Created from the ground up as an alternative Spring/ Micronauts/ Netty/ Jetty"
ActiveJ在自己的摘要中着重指出其是Spring,netty等现有服务器框架的优秀替换者,定义为一个全新的、轻量的、无大量抽象和第三方依赖的后端框架。
以我的角度来看ActiveJ的描述,结合自己对于Springboot的使用,ActiveJ被描述为一个全功能的服务器,不仅仅是最初创造时对于AdKernel大规模数据的处理,也可以处理一般的HTTP和I/O请求。从官网上给的HTTP请求简单案例来看,是和Tomcat的示例一样的,在认识和学习过程中可以以稍微熟悉的Tomcat来分析ActiveJ的功能。
作为一个全新的优秀框架,ActiveJ特别地在网站上罗列了在Webframe上的一系列测评,来展现ActiveJ的优越性,这里引用一个launch time案例:
通过GitHub一个maven案例:
mvn archetype:generate -DarchetypeGroupId=io.activej -DarchetypeArtifactId=archetype-http -DarchetypeVersion=5.0-rc3
其会在本地创建一个my-web-app项目来:
public class WebApp extends HttpServerLauncher {
@Provides
AsyncServlet servlet() {
return request -> Promise.of(
HttpResponse.ok200()
.withPlainText("Hello, World!"));
}
public static void main(String[] args) throws Exception {
Launcher launcher = new WebApp();
launcher.launch(args);
}
}
AsycServlet servlet()显示出了ActiveJ在使用异步I/O技术来处理并发、大量的HTTP请求。作为ActiveJ的起步,便从这几行中出发去认识和学习ActiveJ这个雄心勃勃的全新服务器框架吧。
结构分析
ActiveJ共有八个组成部分:
Async-I/O
————异步I/O处理 ,包含Promise,Eventloop,Net
HTTP
————高效的异步HTTP服务,并且可以作为独立的组件使用
Inject
————提供强大工具的微依赖注解库
Serializer
————基于运行时字节码生成的世界最快JVM串行器
Codegen
————排除复杂的直接字节操作的动态字节生成器
Specializer
————由JVM优化而加速代码构建的ActiveJ技术
FS
————远程文件操作的有力工具
RPC
————在分布式应用和微处理领域的轻量而快速的二进制协议
这8个组成部分共同构成了ActiveJ能够大规模处理数据、提供优秀的后端应用服务的原因。
基于Gitee上源代码来分析,严格的在源代码中确立分工是有些困难的,因为作为一个整体的框架来看,ActiveJ的很多功能都要基于其它部分提供的支持,因此在小组合作时根据这8个功能进行整体分工,而在具体的分析上需要成员们相互帮助来获得更全面的知识。
本系列博客将围绕Codegen和Specializer两部分展开。
小队其他成员分工情况:
Async-I/O和HTTP部分---Mar3
Inject和Serializer部分----zth_idea
FS和RPC部分----LeapFrogFe
项目源码从gitee(https://gitee.com/mirrors/ActiveJ)或者GitHub(https://github.com/activej/activej)均可下载,下载完成后使用集成开发工具IDEA直接打开即可,初次打开项目时IDEA会自动从Maven中央仓库里下载项目的依赖,完成后结构如下:
其中源码里标亮的/example以及之后的util部分属于公共代码,个人判断不属于核心代码分析,因此分析集中于/core部分的代码,但每人负责的部分互相亦有渗透,之后分析范围会逐渐确定。
依赖下载完成后还需要在IDEA里等待更新项目所需要的index,过程也是由IDEA自动完成。
源码的结构和SpringBoot文件夹的结构大致相同,
项目整体的概述在根目录下的README.md文件下,和官网和GitHub上是一致的,并无太多参考价值,整体Maven依赖在根目录下的pom.xml里。但是在子项目里(比如/core-specializer),也给出了子项目所需要的具体依赖,记录在子项目中的pom.xml里。
而在具体的项目里(比如我负责的Codegen):
在src/main/java/io.activej目录下是子项目codegen的对外代码,即会被外部访问的功能,分析这些java文件是本次课程的核心内容,需要在这里面查看activej所提供的功能是什么,递归的查看其引用的定义和依赖。
而src/test是开发者在开发过程中内部进行测试的包,其一般都是测试单个或局部的功能,以实现计划的需求分析或者是开发时提出的新需求。这些代码相比于/main中在结构上会有些简单,可以通过@test来测试,但是依旧是分析功能时所可以参考的来源。
在子项目里还有自己的pom.xml和README.md
但是这里的README.md文件只是将我们引到官网中的ActiveJ-Codege(https://activej.io/codegen)上去,并没有什么额外的内容。
综述结语首先是从ActiveJ的源码结构上来看,相比于自己在前两年里写的项目结构组织,确实是显得很专业和严谨。分析源码,对我来说也是学习软件项目如何更专业的起步的过程,构建出一个漂亮的,悦目而整洁的项目结构亦是一个成功的软件项目的一部分。
Spring由于其体量庞大,在快速构建自定义项目时被人所诟病,而ActiveJ以极其自信的态度来提出要作为最快、最方便的后端服务器框架,在读ActiveJ官网时着实被其所震惊。对于用SpringBoot搭建过上学期数据库课设的我来说,对于ActiveJ的这种说法抱有很大的好奇和探索心理。并且目前无论是国内的搜索,还是国外Google里的搜索,关于ActiveJ的相关搜索,除了官网以外均没有其他的内容,或许这个全新的ActiveJ的时代就在未来吧。



