vlambda博客
学习文章列表

【框架推荐】ActiveJ 概述。新的全栈 Java 框架

ActiveJ 是一个全新的开发平台,用于创建具有任何复杂性的各种现代应用程序,具有轻量级和本机可扩展的异步架构,可以从硬件中榨取最后一点性能。让我们概述一下框架的核心组件!


什么是 ActiveJ?

ActiveJ[https://activej.io/]是一个全新的全栈 Java 框架,可用于各种 Web、云和微服务高负载场景。


ActiveJ 是一种原生的高性能解决方案。根据 ActiveJ 网站的说法,它最初是作为一个 RTB 广告平台的解决方案从头开始开发的,该平台每天处理超过 1000 亿个入站请求。

“ActiveJ 背后的理念是用突破性技术彻底改变 Java 行业。”


为了匹配这个想法,ActiveJ 不仅非常高效,而且还提供了另一种开发方法。它具有最少的第三方依赖,可实现高性能、一致性和简化的开发过程。ActiveJ 使应用程序业务逻辑超越了框架规范和限制。


让我们概述一下框架的核心组件!



ActiveJ 组件

ActiveJ 有一组松散耦合的组件,涵盖了整个应用程序堆栈。一些组件没有依赖关系,可以作为独立库使用。


异步核心

ActiveJ 有自己的高性能异步 I/O 核心:Eventloop[https://activej.io/eventloop]、Promise[https://activej.io/promise]和Net[https://activej.io/net]。它还具有异步数据流处理功能:CSP[https://activej.io/csp]和Datastream[https://activej.io/datastream]

主动注入[https://inject.activej.io/]

快速和轻量级的依赖注入库。它是多线程友好的、功能丰富的,并且可以拥有闪电般的启动时间和运行时间。它支持嵌套范围、单例和瞬态绑定、模块、编程绑定生成、依赖关系图的自省、转换、丢失绑定的自动生成以及现有绑定的修改。它没有第三方依赖,可以独立于 ActiveJ 平台使用。您可以在ActiveInject 的网站[https://inject.activej.io/docs]上找到一些使用示例。


ActiveJ HTTP[https://activej.io/http]

高性能异步 HTTP 客户端和服务器。根据基准测试[https://github.com/activej/activej/blob/v2.2/benchmarks/http/src/main/java/io/activej/http/HttpServerWorkloadBenchmark.java],在某些用例中,它比多线程 Vert.x HTTP 服务器快 15%,即使在单核上,总 CPU 负载也减少 50%。带有嵌入式 HTTP 服务器的最小 ActiveJ Web 应用程序的完整大小仅为 1.4MB,启动时间仅为 0.65 秒,而 Spring 为 17MB 和 14 秒。


让我们使用 HTTP 组件创建一个简单的服务器。它具有预定义的 HTTP 客户端和服务器实现,具有显着的性能。我们还将使用 ActiveJ Launcher 模块。Launcher 是对处理应用程序生命周期、依赖项和日志记录的主要方法的高度概括的抽象。

public final class HttpHelloWorldExample extends HttpServerLauncher { @Provides AsyncServlet servlet() { return request -> HttpResponse.ok200().withPlainText("Hello World!"); } public static void main(String[] args) throws Exception { Launcher launcher = new HttpHelloWorldExample(); launcher.launch(args); }}


我们从 Launcher 模块扩展了 HttpServerLauncher 类。

ActiveInject @Provides 注释创建一个 AsyncServlet。它异步接收来自客户端的 HTTP 请求并发送 HTTP 响应。要启动服务器,只需使用 Launcher.launch 方法,就是这样。转到 localhost:8080 以检查您的服务器。感谢 ActiveInject,您可以轻松扩展示例以使其更复杂。

您可以在 GitHub 上找到此示例的源代码,或在 ActiveJ HTTP 文档中找到更多信息。


活动代码生成器[https://codegen.activej.io/]


动态字节码生成器,它使用流线型和简洁的 API 封装直接字节码操作的复杂性。它使用自动类型推断直接将类似 Lisp 的 AST 树表达式编译成字节码,开销基本为零。下面是一个实现 Example 接口的 sayHello 方法的小例子。


Class<Example> example = ClassBuilder// DefiningClassLoader represents a loader for defining dynamically generated classes .create(DefiningClassLoader.create(Thread.currentThread().getContextClassLoader()), Example.class) .withMethod("sayHello", call(staticField(System.class, "out"), "println", value("Hello world"))) .build();Example instance = example.getDeclaredConstructor().newInstance();instance.sayHello();


主动序列化器[https://serializer.activej.io/]

ActiveSerializer 是使用 ActiveCodegen 实现的,并引入了一种无模式方法,以实现序列化过程的最佳性能。它完全支持 Java 子类、集合(包括具有循环引用的图以及 HPPC 等专门的集合)。此外,它支持插件、扩展、版本控制,可以使用 Java 注释进行微调等等。根据 ActiveSerializer 网站上的基准测试,它是世界上最快的基于 JVM 的序列化器。这是其用例的一个小示例:

public static class Person { public Person(@Deserialize("age") int age, @Deserialize("name") String name) { this.age = age; this.name = name; } @Serialize(order = 0) public int age; @Serialize(order = 1) public final String name;}


您可以在GitHub[https://github.com/activej/activej/tree/v2.2/examples/core/serializer/src/main/java]或 ActiveSerializer文档[https://serializer.activej.io/examples]中找到更多示例。ActiveSerializer 可以作为独立库独立于框架使用。


ActiveSpecializer[https://specailizer.activej.io/]

一种独特的技术,通过在运行时重写字节码来自动加速您的代码。与传统的编译器优化工具不同,它使用类实例的运行时信息:将所有类字段转化为静态类字段,将所有虚拟方法调用去虚拟化,替换为静态方法调用。根据基准[https://specializer.activej.io/examples.html],在某些用例中,ActiveSpecializer 可以使您的代码速度提高 7 倍。


例如,让我们看看如何使用 ActiveSpecializer 优化典型的 AST 表达式树 f(x) = ((x + 5) – 5) * (-1)。表达式将如下所示:

static IntUnaryOperator INT_UNARY_OPERATOR = new IntUnaryOperatorProduct( new IntUnaryOperatorSum( new IntUnaryOperatorSum( new IntUnaryOperatorIdentity(), new IntUnaryOperatorConst(5)), new IntUnaryOperatorConst(-5)), new IntUnaryOperatorConst(-1));//And it is equivalent to this manually optimized equation:static IntUnaryOperator INT_UNARY_OPERATOR_OPTIMIZED_MANUALLY = new IntUnaryOperator() { @Override public int applyAsInt(int x) { return -x; } };


让我们看看 ActiveSpecializer 将如何自动处理第一个表达式:

static IntUnaryOperator INT_UNARY_OPERATOR_OPTIMIZED_AUTOMATICALLY = SPECIALIZER.specialize(INT_UNARY_OPERATOR);


根据基准,原始方程的运行时间为 69.938 ns,而手动和自动专门化分别只用了 26.533 ns 和 26.691 ns。


然而,ActiveSpecializer 远远超出了算术方程。您可以在GitHub[https://github.com/activej/activej/tree/v2.2/examples/core/specializer]或 ActiveSpecializer文档[https://specializer.activej.io/]中找到 ActiveSpecializer 示例。它可以作为独立库独立于框架使用。


主动式RPC[https://rpc.activej.io/]

用于开发分布式应用程序和微服务解决方案的闪电般快速的二进制协议。为了最小化开销,ActiveRPC 不使用带有 JSON 或 XML 编码的 HTTP。相反,它由闪电般快速的 ActiveSerializer 提供支持,在 TCP 上运行,并具有自定义的高性能二进制流协议。


ActiveRPC 具有高度优化的服务器和客户端实现以及预定义的云策略,有助于管理服务器或服务器分片之间的请求安排。这些策略包括first availableround-robinrendezvous hashing等。您可以组合这些策略。例如,让我们使用第一个可用循环策略来管理一个包含 4 个连接的池:

RpcStrategy strategy = roundRobin( firstAvailable(servers(ADDRESS_1, ADDRESS_2)), firstAvailable(servers(ADDRESS_3, ADDRESS_4)));


您可以更改连接数量,应用不同的策略,您的应用程序将能够原生处理高负载场景:

RpcStrategy strategy = rendezvousHashing(hashFunction) .withShard(1, firstAvailable(servers(ADDRESS_1, ADDRESS_2))) .withShard(2, firstAvailable(servers(ADDRESS_3, ADDRESS_4))) .withShard(3, server(ADDRESS_5));


您可以在GitHub[https://github.com/activej/activej/tree/v2.2/examples/cloud/rpc/src/main/java]或 ActiveRPC文档[https://rpc.activej.io/examples]中找到 ActiveRPC 示例。


活动文件系统[https://fs.activej.io/]

通过上传、下载、追加、列出、复制、移动、删除和其他方法来操作本地、远程或分布式存储,提供一个微小的异步抽象。它具有一个简单的类似 FTP 的协议,具有零开销流,并支持数据冗余、重新平衡和重新分片。

private RemoteFsClusterClient client; ...Eventloop eventloop = Eventloop.create();Map<Object, FsClient> clients = ...;client = RemoteFsClusterClient.create(eventloop, clients) .withReplicationCount(N / 2) .withServerSelector(RENDEZVOUS_HASH_SHARDER);


专业数据库

ActiveJ 具有一系列专门的数据库实现,例如Operational Transformation 数据库[https://github.com/activej/activej/tree/v2.2/cloud-ot]、CRDT 服务器数据库[https://github.com/activej/activej/tree/v2.2/cloud-crdt]和OLAP 数据库[https://github.com/activej/activej/tree/v2.2/cloud-lsmt-cube]


实用程序

包括应用程序引导、生命周期和管理组件,例如Launcher[https://activej.io/launcher]、Service Graph[https://activej.io/service-graph]、JMX[https://github.com/activej/activej/tree/v2.2/boot-jmx/src/main/java/io/activej/jmx]、Triggers[https://github.com/activej/activej/tree/v2.2/boot-triggers/src/main/java/io/activej/trigger]


结论

ActiveJ 是一个全新的开发平台,用于创建具有任何复杂性的各种现代应用程序,具有轻量级和本机可扩展的异步架构,可以从硬件中榨取最后一点性能。


您可以在GitHub 存储库[https://github.com/activej/activej]上探索 ActiveJ 源代码。ActiveJ 的文档和示例可以在官方网站[https://activej.io/]上找到。