TChannel is a network multiplexing and framing RPC protocol created by Uber (protocol specs).
Features of TChannel protocol implemented so far:
Other TODOs:
The goal of the project is to provide a similar API to Java TChannel implementation which is why both connection pools and server task handler are hidden from user.
It is an unofficial implementation of TChannel protocol. The project is used to learn Rust and it still has some missing features, so it will not go out of
0.0.x
before implementing them and a proper testing. Future 0.0.x releases may include API breaking changes.
```rust use tchannelrs::{Config, TChannel, TResult}; use tchannelrs::handler::{HandlerResult, RequestHandler}; use tchannel_rs::messages::{MessageChannel, RawMessage};
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(())
}
struct Handler {}
impl RequestHandler for Handler {
type REQ = RawMessage;
type RES = RawMessage;
fn handle(&mut self, request: Self::REQ) -> HandlerResult
To run above example following dependencies are required:
toml
tchannel_rs = *
tokio = { version = "^1", features = ["macros"] }
env_logger = "^0" # log impl to print tchannel_rs logs
Sample server:
shell
RUST_LOG=DEBUG cargo run --example server
Sample client:
shell
RUST_LOG=DEBUG cargo run --example client
Sample tchannel-java
server (to check Rust client compatibility):
```shell
mvn -f examples-jvm-server package exec:exec -Pserver
docker-compose --project-directory examples-jvm-server up
podman build --file examples-jvm-server/Dockerfile podman run -p 8888:8888 localhost/examples-jvm-server_tchannel-jvm-server ```
shell
cargo install cargo-readme
cargo readme > README.md
License: MIT