3个版本
0.1.2 | 2023年12月15日 |
---|---|
0.1.1 | 2023年9月12日 |
0.1.0 | 2023年9月11日 |
#465 in 异步
11KB
203 行
Serviceless
Serviceless 是一个简单的 Rust actor 模型,类似于 actix,但更简单且支持异步。
目前,这个crate只使用 tokio 作为后端。
这个crate没有不安全的代码。
使用方法
这个crate提供与 actix
相同的API。但所有API都是异步的,包括处理器。
服务
Service
是 Actor 模型中的 Actor
。
我们可以在一个 struct 上实现一个 Service
来声明一个 Service
。
pub struct Service0 {}
impl Service for Service0 {}
Service
提供了名为 started
和 stopped
的钩子,它们都是异步的。请使用 async_trait
宏。
pub struct Service1 {}
#[async_trait]
impl Service for Service1 {
async fn started(&mut self, _ctx: &mut Context<Self>) {
println!("Started")
}
}
启动服务
启动服务非常简单,只需创建它并调用 start
方法。
let svc = Service1 {};
svc.start();
注意:此函数必须在异步函数中调用或在异步运行时初始化之后调用。否则,它将引发恐慌。
停止和暂停
当服务启动时,我们可以在 context
上调用停止和暂停方法。
您可以在服务钩子或处理器中调用这些函数。
处理器和消息
一个服务可以向其他服务发送消息,或被其他服务调用。
消息
要调用其他服务,我们必须首先声明一个 Message
。
任何类型都可以是消息,只需在 struct 上实现 Message 特性并定义一个结果。
pub struct Messagep {}
pub struct MessageResult {}
impl Message for Message0 {
type Result = MessageResult;
}
处理器
在服务上实现处理器,我们可以使服务接受来自其他服务的调用。
#[async_trait]
impl Handler<U8> for Service0 {
async fn handler(&mut self, message: U8, _ctx: &mut Context<Self>) -> U8 {
U8(message.0 + 2)
}
}
处理器也是一个异步函数,请使用 async_trait
宏。
地址
当我们启动一个服务时,我们可以获取一个地址。我们也可以从 Context 中获取它。
调用和发送
地址可以进行调用或发送。
- 调用意味着调用者想要知道结果。
- 这是一个异步函数
- 当服务停止时,调用者将从错误中获取
ServiceStopped
。 - 当服务暂停时,调用者将从错误中获取
ServicePaused
。
- 发送意味着调用者不关心结果,因此
- 这是一个普通函数
- 当服务停止时,调用者将从错误中获取
ServiceStopped
。 - 调用者无法知道服务已暂停
依赖关系
~2.3–4MB
~66K SLoC