Expand description
An experimental service framework.
The Service trait is the central abstraction. It is an
asynchronous function, accepting a request and returning a response, which
can only be executed after a permit is acquired.
The root exports Service constructors, and an extension trait, ServiceExt containing
combinators to modify a Service. Both the combinators and constructors each have an
associated module containing related documentation, traits, and types.
§Example
use burger::*;
let svc = service_fn(|x| async move {
sleep(Duration::from_secs(1)).await;
2 * x
})
.map(|x| x + 3)
.concurrency_limit(1)
.buffer(3)
.load_shed();
let response = svc.oneshot(30).await;
assert_eq!(Ok(63), response);§Usage
A typical Service will consist of distinct layers, each providing specific dynamics. The
following flowchart attempts to categorize the exports of this crate:
---
title: Which constructor should I use?
---
flowchart TD
A{I want to...} --> |Create a fresh service| B{Using a...}
B --> |Closure| service_fn
B --> |tower::Service| compat
A --> |Modify an existing service| C{ }
C --> |Modify the permit| D{ }
D --> |Extend lifetime of permit| ServiceExt::leak
D --> |Reduce backpressure| E{ }
E --> |Buffer| ServiceExt::buffer
E --> |Remove backpressure| ServiceExt::depressurize
E --> |Shed load| ServiceExt::load_shed
D --> |Increase backpressure| F{ }
F --> |Limit concurrency| ServiceExt::concurrency_limit
F --> |Limit rate| ServiceExt::rate_limit
C --> |Modify response| G{ }
G --> |Synchronously| ServiceExt::map
G --> |Asychronously| ServiceExt::then
C --> |Consolidate service types| ServiceExt::left/right
C --> |Add retries| ServiceExt::retry
A --> |Combine existing services| H{By directing \nrequests via...}
H --> |Manual picking| steer
H --> |First permitted| select
H --> |Load balancer| balance
Modules§
- balance
- Various load balancer implementations.
- buffer
- The
ServiceExt::buffercombinator returnsBuffer, whoseService::acquireimmediately resolves until the buffer is at maximum capacity, at which point it defers to the inner service’sService::acquire. The buffer is drained when the inner service’s permit becomes available. - concurrency_
limit - The
ServiceExt::concurrency_limitcombinator returnsConcurrencyLimitwhich restricts the number of inflight calls to a specified value. - depressurize
- In
burgerbackpressure is exerted byService::acquire. TheServiceExt::depressurizecombinator returnsDepressurize, which moves theService::acquireexecution into theService::call, causingService::acquireto resolve immediately. - either
- Often we want the branches of a runtime condition to output different service types. The
EitherServiceallows the reconciliation of two separate types. TheEither::LeftandEither::Rightvariants can be constructed byServiceExt::leftandServiceExt::rightrespectively. - leak
- The
ServiceExt::leakcombinator returnsLeak, which extends the lifetime of theService::Permit. - load
- Load is a measurement of the amount of work a service is experiencing. The
Loadtrait provides an interface to measure it and therefore informs business logic in applications such as load balancers. - load_
shed - The
ServiceExt::load_shedcombinator returnsLoadShed, which causesService::acquireto immediately returnSome(permit)when the inner permit is ready and immediately returnNoneotherwise. - map
- The
ServiceExt::mapcombinator returnsMap, which extends a service with a specified closure from the modifying theService::Response. - rate_
limit - The
ServiceExt::rate_limitcombinator returnsRateLimit, which limits the number ofService::calls invoked per period of time. - retry
- The
ServiceExt::retrycombinator returnsRetry, which retries following a specifiedPolicy. - select
- Given a collection of some services,
selectconstructs aServicewhich uses the first permit available. - service_
fn - The
service_fnfunction accepts a closure accepting a request and returning aFutureand returnsServiceFn, aServicewhich is immediately permitted to run the closure. - steer
- Given a collection of services and a
Picker, thesteerfunction constructs aSteerService. - then
- The
ServiceExt::thencombinator returnsThen, which extends a service with a closure modifying aService::Responseasynchronously.
Structs§
- Middleware
Builder - The root of a chain of
Middlewares.
Traits§
- Middleware
- A middleware, used to incrementally add behaviour to a
Service. - Service
- An asynchronous function call, which can only be executed after obtaining a permit.
- Service
Ext - An extension trait for
Service. - TryService
- A fallible
Service.
Functions§
- select
- Constructs a
Servicefrom a collection (IntoIteratormust be implemented for its reference) of services whoseService::callis the by the first available child. - service_
fn - Constructs a
Servicefrom a closure. - steer
- Constructs a
Servicefrom a collection of services whoseService::callis steered via aPicker.