Doing
```rust
let clone = self.inner.clone();
Box::pin(async move {
let response = clone.call(request).await?;
Ok(response)
})
```
If `self.inner` is (or contains) a `tower::buffer::Buffer` might panic.
That is because cloning a `Buffer` drops the permit that was acquired in
`poll_ready`, meaning it is no longer ready and panic in `call`.
The solution is to use `mem::replace` to take the ready service and pass
that into the async block.
Fixes https://github.com/hyperium/tonic/issues/545
Examples
Set of examples that show off the features provided by tonic.
Helloworld
Client
$ cargo run --bin helloworld-client
Server
$ cargo run --bin helloworld-server
RouteGuide
Client
$ cargo run --bin routeguide-client
Server
$ cargo run --bin routeguide-server
Authentication
Client
$ cargo run --bin authentication-client
Server
$ cargo run --bin authentication-server
Load Balance
Client
$ cargo run --bin load-balance-client
Server
$ cargo run --bin load-balance-server
Dynamic Load Balance
Client
$ cargo run --bin dynamic-load-balance-client
Server
$ cargo run --bin dynamic-load-balance-server
TLS (rustls)
Client
$ cargo run --bin tls-client
Server
$ cargo run --bin tls-server
Health Checking
Server
$ cargo run --bin health-server
Server Reflection
Server
$ cargo run --bin reflection-server
Tower Middleware
Server
$ cargo run --bin tower-server
Autoreloading Server
Server
systemfd --no-pid -s http::[::1]:50051 -- cargo watch -x 'run --bin autoreload-server'
Notes:
If you are using the codegen feature, then the following dependencies are
required:
The autoload example requires the following crates installed globally: