1/6

The whole Tower ecosystem is two traits.

trait Service { fn call(&mut self, req: &Req) -> Resp; }
trait Layer<S> { type Svc; fn layer(&self, inner: S) -> Self::Svc; }

Service is request in, response out. Layer takes a service and returns a service. That is the entire abstraction — timeout, retry, concurrency limit, auth, tracing, load balancing are all one struct holding an inner S, implementing Service by doing something and then calling self.inner.call(req).

Real Tower adds poll_ready — the backpressure channel, where a service says "not now" before you hand it a request — plus associated Response, Error and Future types. The shape is what you build here.