pub struct CanaryLayer { /* private fields */ }Expand description
Weighted traffic-splitting proxy middleware.
Clone is cheap and shares state — all clones distribute traffic against
the same underlying [CanaryState], so a CanaryLayer::update on one
clone is immediately visible to a clone already wrapped into a running
Application (see the module docs for the clone-before-wrapping pattern).
Implementations§
Source§impl CanaryLayer
impl CanaryLayer
Sourcepub fn new(backends: Vec<WeightedBackend>) -> CanaryLayer
pub fn new(backends: Vec<WeightedBackend>) -> CanaryLayer
Build a CanaryLayer from the given weighted backends.
Backends with weight == 0 are ignored. Equivalent to
CanaryLayer::from_parts(backends, vec![]).
Sourcepub fn with_pools(pools: Vec<WeightedPool>) -> CanaryLayer
pub fn with_pools(pools: Vec<WeightedPool>) -> CanaryLayer
Build a CanaryLayer whose groups are all dynamically-discovered
BackendPools rather than fixed URLs. Equivalent to
CanaryLayer::from_parts(vec![], pools).
Sourcepub fn from_parts(
backends: Vec<WeightedBackend>,
pools: Vec<WeightedPool>,
) -> CanaryLayer
pub fn from_parts( backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>, ) -> CanaryLayer
Build a CanaryLayer from a mix of fixed backends and dynamic pools.
Sourcepub fn add_pool(self, pool: BackendPool, weight: u32) -> CanaryLayer
pub fn add_pool(self, pool: BackendPool, weight: u32) -> CanaryLayer
Append one more dynamically-discovered group to an already-built
layer (e.g. adding a canary BackendPool alongside stable backends
passed to CanaryLayer::new). A weight of 0 is a no-op.
This is a builder method for use before .wrap(...) — for changing
an already-wrapped, already-running layer’s configuration, use
CanaryLayer::update instead.
Sourcepub fn update(&self, backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>)
pub fn update(&self, backends: Vec<WeightedBackend>, pools: Vec<WeightedPool>)
Replace the entire backend/pool configuration in place — the runtime
equivalent of building a fresh layer with
CanaryLayer::from_parts, except every existing clone of this
layer (including one already wrapped into a running Application)
picks up the change on its very next request. No restart required.
Sourcepub fn path_prefix(self, prefix: impl Into<String>) -> CanaryLayer
pub fn path_prefix(self, prefix: impl Into<String>) -> CanaryLayer
Only proxy requests whose URI starts with prefix; pass others through.
Sourcepub fn connect_timeout_ms(self, ms: u64) -> CanaryLayer
pub fn connect_timeout_ms(self, ms: u64) -> CanaryLayer
Override the TCP connect timeout (default: 5 000 ms).
Sourcepub fn read_timeout_ms(self, ms: u64) -> CanaryLayer
pub fn read_timeout_ms(self, ms: u64) -> CanaryLayer
Override the response read timeout (default: 30 000 ms).
Trait Implementations§
Source§impl Clone for CanaryLayer
impl Clone for CanaryLayer
Source§fn clone(&self) -> CanaryLayer
fn clone(&self) -> CanaryLayer
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Middleware for CanaryLayer
impl Middleware for CanaryLayer
fn handle( &self, request: &Request, connection: &ConnectionInfo, next: &dyn Application, ) -> Result<Response, String>
Source§fn runs_inline(&self, _request: &Request, _connection: &ConnectionInfo) -> bool
fn runs_inline(&self, _request: &Request, _connection: &ConnectionInfo) -> bool
true when this layer’s own work for request never blocks (in-memory
state, atomics, short mutexes) — see Application::runs_inline. A
WithMiddleware stack runs inline only if every layer and the inner
application agree. Default false.Source§fn is_passthrough(
&self,
_request: &Request,
_connection: &ConnectionInfo,
) -> bool
fn is_passthrough( &self, _request: &Request, _connection: &ConnectionInfo, ) -> bool
true when handle would do nothing for request but call next
(e.g. a rate limit that isn’t configured). A WithMiddleware stack
offers the inner application’s execute_async only if every layer
passes the request through. Default false.Source§fn accepts_streamed_body(
&self,
_request: &Request,
_connection: &ConnectionInfo,
) -> bool
fn accepts_streamed_body( &self, _request: &Request, _connection: &ConnectionInfo, ) -> bool
true when this layer never reads request.body, so the inner
application may receive it as a stream (Application::streams_body).
A layer that inspects the body (CSRF tokens in a form, request
signatures, rewriting) must keep the default false: it would see an
empty body.Source§fn answers_streamed_body(
&self,
_request: &Request,
_connection: &ConnectionInfo,
) -> bool
fn answers_streamed_body( &self, _request: &Request, _connection: &ConnectionInfo, ) -> bool
true when this layer answers request itself — it doesn’t call
next — and reads its body as a stream (a proxy forwarding it as it
arrives). The body is then streamed whatever the layers after it and
the application would say. Requires accepts_streamed_body. Since
18.3.0.Source§fn layer_name(&self) -> &'static str
fn layer_name(&self) -> &'static str
Application::middleware_names): by default the type’s name
without its module path or generic parameters (CacheLayer). Since
18.28.0.Auto Trait Implementations§
impl Freeze for CanaryLayer
impl RefUnwindSafe for CanaryLayer
impl Send for CanaryLayer
impl Sync for CanaryLayer
impl Unpin for CanaryLayer
impl UnsafeUnpin for CanaryLayer
impl UnwindSafe for CanaryLayer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> ServiceExt for T
impl<T> ServiceExt for T
Source§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
map-response-body only.Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
trace only.Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
trace only.