#rpc #networking #connection-pool #protcol

tchannel_rs

网络复用和帧RPC协议

2个版本

0.0.2 2022年4月21日
0.0.1 2021年10月30日

#74 in #connection-pool

MIT 许可证

115KB
2.5K SLoC

build status License: MIT crate documentation

tchannel_rs

TChannel是由Uber创建的网络复用和帧RPC协议(协议规范)。

概述

已实现的TChannel协议功能

  • 请求/响应模型,
  • 在相同的TCP套接字上复用多个请求,
  • 乱序响应,
  • 流式请求和响应,
  • 帧参数的校验和(仅None),
  • 传输任意有效载荷
    • Thrift
    • SThrift(流式Thrift)
    • JSON
    • HTTP
    • 原始
  • 路由网格
  • 跟踪

其他待办事项

  • 请求响应TTL
  • 取消请求
  • 声明请求
  • 使用Tower?
  • 实现消息类型的Serde序列化/反序列化
  • 在实现Thrift有效载荷时,将Thrift相关的Makefile转换为build.rs
  • 适当的测试(目前只有一些测试路径)
  • 使请求处理器通用(无关联类型)

该项目的目标是提供一个类似于Java TChannel实现的API,因此连接池和服务器任务处理器都隐藏在用户面前。

免责声明

这是TChannel协议的非官方实现。该项目用于学习Rust,并且仍然缺少一些功能,因此在没有实现它们并进行适当的测试之前,它不会发布0.0.x版本。未来的0.0.x版本可能包含API破坏性更改。

示例

use tchannel_rs::{Config, TChannel, TResult};
use tchannel_rs::handler::{HandlerResult, RequestHandler};
use tchannel_rs::messages::{MessageChannel, RawMessage};

#[tokio::main]
async fn main() -> TResult<()> {
    // Server
    let mut tserver = TChannel::new(Config::default())?;
    let subchannel = tserver.subchannel("service").await?;
    subchannel.register("endpoint", Handler {}).await?;
    tserver.start_server()?;

    // Client
    let tclient = TChannel::new(Config::default())?;
    let subchannel = tclient.subchannel("service").await?;
    let request = RawMessage::new("endpoint".into(), "header".into(), "req body".into());
    let response = subchannel.send(request, "127.0.0.1:8888").await.unwrap();

    // Server shutdown
    tserver.shutdown_server();

    assert_eq!("header", response.header());
    assert_eq!("res body".as_bytes(), response.body().as_ref());
    Ok(())
}

#[derive(Debug)]
struct Handler {}
impl RequestHandler for Handler {
    type REQ = RawMessage;
    type RES = RawMessage;
    fn handle(&mut self, request: Self::REQ) -> HandlerResult<Self::RES> {
        Ok(RawMessage::new(request.endpoint().clone(), request.header().clone(), "res body".into()))
    }
}

要运行上面的示例,需要以下依赖项

tchannel_rs = *
tokio =  { version = "^1", features = ["macros"] }
env_logger = "^0" # log impl to print tchannel_rs logs

构建

示例子项目

示例服务器

RUST_LOG=DEBUG cargo run --example server

示例客户端

RUST_LOG=DEBUG cargo run --example client

示例tchannel-java服务器(以检查Rust客户端兼容性)

# with local Maven/JDK
mvn -f examples-jvm-server package exec:exec -Pserver
# or with Docker
docker-compose --project-directory examples-jvm-server up
# or with Podman (no podman-compose because of network issues)
podman build --file examples-jvm-server/Dockerfile
podman run -p 8888:8888 localhost/examples-jvm-server_tchannel-jvm-server

更新README.md

cargo install cargo-readme
cargo readme > README.md

许可证:MIT

依赖项

~6–16MB
~192K SLoC