Page not found :(
+The page you are looking for doesn't exist or has been moved.
+diff --git a/404.html b/404.html new file mode 100644 index 0000000..cecb6b3 --- /dev/null +++ b/404.html @@ -0,0 +1,207 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The page you are looking for doesn't exist or has been moved.
+插件系统可以实现弱耦合,模块化,模块可独立开发、测试、维护。
+发布-订阅模式是一种行为设计模式,它允许多个插件或实例通过事件的发布和订阅来进行通信。
+
+在这种模式中,发布者(又称为主题)负责发布事件,而订阅者(也称为观察者)则通过订阅主题来接收这些事件。
+
+这种模式使得应用程序的不同部分能够松散耦合,并且可以动态地添加或删除订阅者。
鉴于发布-订阅模式支持动态特性,Kokoro 也采用了这种模式。我们提供了 kokoro-flume-channel
(以下简称 flume-channel
),它基于 flume 库实现了进程内的发布-订阅模式。flume
库的详细特性可在其官方仓库中查看。我们对 flume
进行了封装,以简化发布-订阅模式的实现。
// flume-channel 提供的函数,用于创建一个 `Mode` 为 `MPSC` 的 `Context`,其 `Resources` 为 `()`
+let ctx = channel_ctx();
+
+// 注册一个 `Subscriber`
+ctx.subscribe(..);
+
+Subscriber
是一个 trait
,任何实现了 trait Subscriber
的类型都可以注册为订阅者。默认实现包括:
FnMut()
FnMut(&Context)
FnMut(Query)
FnMut(&Context, Query)
订阅者被执行的时机由 Query
决定,有关 Query
的相关信息,请参阅 关于订阅查询 (待补充)。
// 定义事件 `Hello`
+#[derive(Event)]
+struct Hello(String);
+
+fn foo(e: &Hello) {
+ println!("{}", e.0);
+}
+
+let ctx = channel_ctx();
+ctx.subscribe(foo); // 订阅事件 `Hello`
+ctx.publish(Hello("Hello World".to_string())); // 发布事件 `Hello`
+
+在上述代码中,订阅者不会立即执行,因为发布操作本质上是 sender.send
,还需要调用 receiver.recv
。因此,我们提供了以下方法:
ctx.run()
- 迭代 receiver
(会阻塞线程)ctx.next()
- 单次 recv
(暂未实现)ctx.run_no_block()
- 非阻塞迭代 receiver
(暂未实现)最终,我们实现了一个简单的发布-订阅示例 Hello World:
+#[derive(Event)]
+struct Hello(String);
+fn foo(e: &Hello) {
+ println!("{}", e.0);
+}
+let ctx = channel_ctx();
+ctx.subscribe(foo);
+ctx.publish(Hello("Hello World".to_string()));
+// 运行
+ctx.run();
+// 输出:Hello World
+
+在 kokoro-flume-channel
中,一个事件可以由多个发布者发布,并且可以由多个订阅者订阅。需要注意的是,这是一个广播系统,而不是单一消费者模型。
在 Hello World 示例中,发布操作并不是常规的发布方式。发布者应在单独的线程中工作,以便与 ctx.run()
协同运行。关于线程的生成和终止时机,请参阅 关于线程 (待补充)。
Kokoro 是为了构建高解耦的应用程序而存在的。 +
+Kokoro 框架的设计理念主要聚焦于抽象和可扩展性,它旨在成为一种编程范式而非传统库。在 Rust 语言中,我们能够为几乎所有类型实现自定义特征。
+利用这一特性,Kokoro 将 Context
定义为一个可扩展的上下文。通过在 Context
上实现方法,用户可以扩展当前上下文的功能。
此外,用户可以将自己的类型实例包装在 Context
实例中,从而利用 Context
提供的独特方法。值得注意的是,Context
支持在线程间转移且可复制,因此需要使用 Arc
对类型进行包装。
当 Context
解引用时,它将变为被包装类型实例的引用,从而在扩展的同时保持实例的可访问性。
struct MyStruct;
+impl MyStruct {
+ fn hello_kokoro() {
+ println!("Kokoro yyds");
+ }
+}
+let context = context.with(Arc::new(Scope::create(Arc::new(MyStruct))));
+context.hello_kokoro();
+
+在这个例子中,Context
作为扩展的载体,为用户自定义类型提供了扩展能力。
同时,Context
不仅具备扩展其他类型的能力,还拥有一个伴随其生命周期的类型实例。
struct Global;
+struct MyStruct;
+let scope = Scope::create(Arc::new(MyStruct));
+let context = Context::create(Arc::new(scope), Arc::new(Global));
+
+在 Context
中,Global
负责承载 Context
自身扩展过程中所需的类型实例。这与 kokoro-flume-channel
中的 MPSC
类似,后者存储了 sender
、receiver
和 runner
。
在泛型中,我们将 Global
称为 Mode
,因为它代表了 Context
的工作模式。
关于发布订阅功能,Kokoro 最初是作为发布订阅模式框架而诞生的。尽管我们对 Kokoro 的定义和实现进行了调整,但这并不影响其作为发布订阅模式框架的使用。
+为了方便用户实现 Mode MPSC,我们提供了一个官方包 kokoro-flume-channel
。该包遵循 Context
的设计原则,支持可扩展性。
kokoro-core
作为 Kokoro 框架的核心组件,虽然其本身并未包含完整的默认实现,但它在整个框架中扮演着至关重要的角色。由于 kokoro-core
高度抽象,它的存在感知度可能较低,但过度抽象是为了实现更高的可扩展性和灵活性。
那么,kokoro-core
的真正定位是什么呢?我们认为主要包括以下几点:
提供核心抽象:kokoro-core
定义了 Kokoro 框架的核心抽象,如 Context
和 Scope
,这些抽象为用户提供了丰富的扩展点,使得框架能够适应各种不同的应用场景。
促进代码复用:通过提供通用的接口和抽象,kokoro-core
鼓励开发者编写可复用的代码。这样,在不同的项目或领域中,开发者可以利用现有的实现快速构建出符合需求的应用程序。
支持模块化开发:kokoro-core
的设计允许开发者根据自己的需求选择性地引入和使用不同的模块。这种模块化开发方式有助于减少项目的复杂性,提高代码的可维护性。
推动生态发展:通过提供清晰、稳定的接口和抽象,kokoro-core
鼓励第三方开发者为其编写扩展和插件。这将有助于形成一个繁荣的生态系统,使得 Kokoro 框架能够不断发展和壮大。
总之,kokoro-core
的定位是为用户提供一个灵活、可扩展且易于使用的核心框架。虽然它在某些方面可能显得过于抽象,但这种设计选择是为了更好地满足用户的多样化需求,推动框架的长远发展。
关于 Kokoro 这一名称的起源,其初衷是向 JavaScript 库 cordis 致敬。
+
+随着 Kokoro 的发展,它在理念上已经与 cordis 有所偏离。我们更希望您将 Kokoro 理解为 心,它不仅仅是一个实现发布/订阅模式的框架,而是成为高度解耦合应用程序的核心。
+
+有关 kokoro-core 的更多信息,请参阅关于 kokoro-core。
+
使用 Kokoro 完成一个简单的 Web 服务器 开始吧 →
+了解如何为 Kokoro 组织 贡献 →
+有问题可以询问亲爱的群友 QQ群聊 →
+ + + + + +使用 Kokoro 完成一个最简单的 Web 服务器吧!
+为了开始使用 Rust 进行项目开发,您首先需要配置 Rust 开发环境。详细的安装指南请参考 Rust 官方文档。
+一旦您的开发环境准备就绪,您可以创建一个新的 Rust 项目。Rust 的包管理器 Cargo 允许您轻松管理项目依赖。
+可以通过以下 Cargo 命令将其添加到您的项目中:
+cargo add kokoro
+
+在项目中的适当位置,您需要引入 Kokoro 库以使用其功能。
+use kokoro::prelude::*;
+
+在完成基本的环境搭建和依赖管理后,您可以阅读 创建上下文 部分来进一步了解如何在您的项目中有效地使用 Kokoro 库。
+ + + + + +亲,还没写完呢。
+Kokoro 交流群:787163897
+ + + + + +本文将带您了解如何在 Kokoro 中构建上下文。
+在 Kokoro 框架中,Context
是核心组件,负责协调资源和行为模式。
Context
结构体包含两个泛型参数:Resource
和 Mode
,它们定义了上下文的资源类型和工作模式。
您需要首先确定 Context
的工作模式。在本例中,我们采用 MPSC
模式,该模式源自 kokoro-flume-channel,支持发布-订阅机制,适用于 kokoro-plugin-tiny-http
等基于发布-订阅的插件。
使用 kokoro-flume-channel 提供的工具函数,您可以轻松创建一个 MPSC
模式的 Context
:
fn main() {
+ // 在 MPSC 模式下初始化上下文
+ let ctx = channel_ctx();
+}
+
+默认情况下,创建的 Context
的 Resource
类型为 ()
,这意味着初始资源为空。
进阶用户可能希望从头开始构建自定义的 Context
。
例如,如果您希望 Resource
使用自定义类型,如下所示:
struct MyName {
+ name: String
+}
+
+您可以按照以下步骤创建一个携带自定义资源的 Context
:
fn main() {
+ let res = MyName { name: "Kokoro".to_string() };
+ let scope = Scope::create(Arc::new(res));
+ let mode = MPSC::<()>::default();
+ let ctx = Context::create(Arc::new(scope), Arc::new(mode));
+}
+
+在这个过程中,您会看到多个 Arc
的使用,这是为了确保资源在多线程中的安全共享。
Scope
是另一个重要概念,我们将在后续章节中详细介绍。
通过以上步骤,您可以灵活地创建和管理 Kokoro 中的上下文,为接下来的开发打下坚实基础。
+在成功创建 Context 之后,下一步是将插件注册到上下文中。详细请参阅 注册插件 部分。
+ + + + + +插件是 Kokoro 实现松散耦合、高度模块化的关键。
+在 kokoro-default-impl 中定义的插件是一个特征。
+这个特征看起来是这样的:
+trait Plugin: Resource {
+ type MODE: Mode + 'static;
+ const NAME: &'static str;
+ fn apply(ctx: Context<Self, Self::MODE>) -> Result<()>;
+}
+
+Plugin 必须实现 Resource。这是因为 Plugin 将被作为 Resource 存储,并且会被 Context 包装。
+NAME 标明了插件的名字,理论上可以是任意字符串,但我们约定只能使用蛇命名。该规则不会被检查。
+当插件被插入上下文时会被执行的函数。在 关于 kokoro-core 中有提及,Context 可以被解引用为 Resource 的引用,这里用到了该特性。所以 apply 函数通过 ctx 可访问 self。通过这点使得 apply 很像是 Plugin 上的方法而不是函数。
+该文档暂时废弃。请勿以该文档为准!
+ 快速开始 + +基于 Rust 语言,保证了内存安全性,无需手动管理副作用。
+设计高效,确保快速响应,性能不凡。
+框架正在持续优化,旨在未来提供稳定可靠的生产环境支持。
+支持动态插件,包括 wasm、动态链接库,以实现功能扩展。
+基于动态插件的热更新流程,易于理解,便于操作。
+自身高度解耦,可随意扩展或更改。模块化,松散耦合,可热更新,分布式,尽在 Kokoro。
+