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>;
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐