发布于:2021-01-07 17:22:45
0
1565
0
ActiveJ是一个全新的开发平台,可通过轻量级且可本地伸缩的异步体系结构创建各种复杂程度的现代应用程序,从而从硬件中挤出最后的性能。让我们概述框架的核心组件!
什么是ActiveJ?
ActiveJ是全新的全栈Java框架,可用于各种Web,云和微服务高负载场景。
ActiveJ是本机高性能解决方案。根据ActiveJ网站的说法,它最初是为RTB广告平台的解决方案重新开发的,该平台每天处理超过1000亿个入站请求。
为了满足这个想法,ActiveJ不仅效率极高,而且还提供了另一种开发方法。它具有最少的第三方依赖关系,可实现高性能,一致性和简化的开发流程。ActiveJ使应用程序业务逻辑超出了框架规范和限制。
让我们概述框架的核心组件!
ActiveJ组件
ActiveJ具有一组松散耦合的组件,这些组件涵盖了整个应用程序堆栈。有些组件没有依赖性,可以用作独立库。
异步核心
ActiveJ具有自己的高性能异步I / O核心:Eventloop,Promise和Net。它还具有异步数据流处理功能:CSP和Datastream。
主动注入
快速轻量的依赖注入库。它是多线程友好的,功能丰富的,并且具有闪电般的快速启动时间和运行时间。它提供了对嵌套作用域,单例和临时绑定,模块,程序化绑定生成,依赖关系图的自省,转换,丢失绑定的自动生成以及对现有绑定的修改的支持。它没有第三方依赖性,可以独立于ActiveJ平台使用。您可以在ActiveInject的网站上找到其用法的一些示例。
ActiveJ HTTP
高性能异步HTTP客户端和服务器。根据基准测试,在某些使用情况下,即使在单核上并且总CPU负载也要少50%,它比多线程Vert.x HTTP服务器快15%。带有嵌入式HTTP服务器的最小ActiveJ Web应用程序的总大小仅为1.4MB,启动时间仅为0.65秒,而Spring为17MB和14秒。
让我们使用HTTP组件创建一个简单的服务器。它具有预定义的HTTP客户端和服务器实现,并具有出色的性能。我们还将使用ActiveJ启动器模块。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文档中找到更多信息。
ActiveCodegen
动态字节码生成器,通过精简的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();
ActiveSerializer
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或ActiveSerializer docs中找到更多示例。ActiveSerializer可以独立于框架使用,也可以作为独立库使用。
ActiveSpecializer
通过在运行时重写字节码来自动加速代码的独特技术。与传统的编译器优化工具不同,它使用类实例的运行时信息:所有类字段都转换为静态类字段,所有虚拟方法调用都被虚拟化并替换为静态方法调用。根据基准测试,在某些情况下,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或ActiveSpecializer docs中找到ActiveSpecializer示例。可以独立于框架使用它作为独立库。
ActiveRPC
闪电般的二进制协议,用于开发分布式应用程序和微服务解决方案。为了最大程度地减少开销,ActiveRPC不使用HTTP和JSON或XML编码。相反,它由快如闪电的ActiveSerializer驱动,在TCP上运行,并具有自定义的高性能二进制流协议。
ActiveRPC具有高度优化的服务器和客户端实现以及预定义的云策略,这些策略有助于管理服务器之间或服务器分片之间的请求安排。这些策略包括first available,round-robin,集合点哈希等。您可以组合这些策略。例如,让我们使用第一个可用的和循环战略管理的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或ActiveRPC docs中找到ActiveRPC示例。
还请参见:Java(和您)的类型安全单元表达式
ActiveFS
通过上载,下载,追加,列出,复制,移动,删除以及其他用于本地,远程或分布式存储的方法,提供微小的异步抽象。它具有类似于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具有一系列专用数据库实现,例如操作转换数据库,CRDT服务器数据库和OLAP数据库。
实用程序
包括应用程序引导,生命周期和管理组件,如启动器,服务图,JMX和触发器。
结论
ActiveJ是一个全新的开发平台,可通过轻量级且可本地伸缩的异步体系结构创建各种复杂程度的现代应用程序,从而从硬件中挤出最后的性能。
您可以在GitHub存储库上浏览ActiveJ源代码。可以在官方网站上找到有关ActiveJ的文档和示例。
作者介绍