2个版本
0.0.2 | 2022年4月21日 |
---|---|
0.0.1 | 2021年10月30日 |
#74 in #connection-pool
115KB
2.5K SLoC
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