rust 第一个练习项目, RPC 设计思想分享
·
rpc 基于 tokio 实现的,能够完成 socket, websocket, udp 三种通信模式。 整个设计思想基于 http, 让编写 socket 和和编写 http 一样简单。
主要组件如下:
RpcConnection: 通信基础组件。
RpcContext: 通信基础组件的辅助组件。
RpcChannel: 数据输出管道流。
RpcConnectionManager: 通信连接管理器;能够完成消息转发,重发等功能
RpcRouter: Router 组件,提供服务,相当于 spring mvc 中的 Controller
Service: 客户接口,和 router 配套,调用 service 能够和 router 进行通信。只需要编写接口,自动完成接口实现。
RpdEvent: 事件接口 RpcFilter: 过滤器,对请求进行拦截,能够完成权限控制等功能
RpcCodec: 编码接口, 默认支持 json 和 bincode 二进制编码两种模式,实现此接口,能够完成其他编码格式
RpcSession: 连接会话,可以存储会话信息
服务端用例:
开启服务
let _ = RpcServerBuilder::new(8888)
.router("/hello", router!(hello))
.set_current_codec_type("json")
.set_local_seq_creator(DefaultLocalSeqCreator::new("server-demo".to_string()))
.build().start_server().await;
编写 Router,提供服务用例:
#[rpc_router]
fn hello(context: &mut dyn RpcContext, data: i32, value: String) -> i32 {
context.send_event(Box::new(HelloEvent {})).unwrap();
data + 100
}
事件接口:
struct HelloEvent {}
impl RpcEvent for HelloEvent {
fn consume(&self) -> RpcResult<()> {
println!("received hello message");
Ok(())
}
}
客户端用例:
let (context, mut channel) = RpcClientBuilder::new(&format!("localhost:{}", port))
.set_current_codec_type("json")
.set_local_seq_creator(DefaultLocalSeqCreator::new("demo".to_string()))
.build().connection().await?;
let mut hello_service = sender!(context, HelloService);
for i in 0..100 {
let result = hello_service.hello(&mut channel, i, "hello".to_string()).await?;
println!("call result: {}", result);
assert_eq!(result, i+100);
}
编写 Service
#[rpc_sender]
#[async_trait::async_trait]
trait HelloService {
#[path = "/hello"]
async fn hello(&mut self, channel: &mut impl RpcChannel, value: i32, data: String) -> RpcResult<i32>;
}
更多推荐


所有评论(0)