pub struct TrafficSplitPlugin {
rules: Vec<Rule>,
timeout: Duration,
client: Arc<OutboundClient>,
}Expand description
Steers matching requests to a weighted set of upstream targets, or lets them fall through to the route’s normal upstream.
Fields§
§rules: Vec<Rule>§timeout: DurationWhole-call deadline per request the plugin proxies itself.
client: Arc<OutboundClient>Shared pooled HTTP client (from PluginResources).
Implementations§
Source§impl TrafficSplitPlugin
impl TrafficSplitPlugin
Sourcepub fn from_config(
config: &HashMap<String, Value>,
resources: &Arc<PluginResources>,
) -> Result<Self, String>
pub fn from_config( config: &HashMap<String, Value>, resources: &Arc<PluginResources>, ) -> Result<Self, String>
Builds the plugin from node config. All match expressions are compiled
here at config load (fail-fast), weights must be non-negative integers,
and every rule needs at least one positively-weighted slot.
Accepted keys:
rules(array, required, non-empty): evaluated in order; the first rule whosematchpasses is used.match(array, optional): an APISIX triple-array condition (rules AND-ed, seecrate::vars). Omit to match every request.weighted_upstreams(array, required, non-empty): the weighted slots one of which is chosen by weighted round-robin. Each slot:upstream(object, optional):{targets: [{host, port}], ...}. When present, this slot proxies matching requests to one of the targets (round-robin within the set). When absent, the slot is the “default” — matching requests fall through to the route’s normal upstream.weight(integer >= 0, default1): selection weight.
timeout_ms(integer, default60000): whole-call deadline for requests the plugin proxies itself.
type: traffic-split
config:
timeout_ms: 60000
rules:
- match:
- ["arg_canary", "==", "1"]
weighted_upstreams:
# 90% fall through to the route's normal upstream
- weight: 90
# 10% proxied to the canary target set
- upstream:
targets:
- host: canary-backend
port: 8080
weight: 10Sourcefn select_rule(&self, ctx: &Context) -> Option<&Rule>
fn select_rule(&self, ctx: &Context) -> Option<&Rule>
Returns the first rule whose match passes (or that has no match),
or None when no rule matches (→ passthrough to the normal upstream).
Sourceasync fn proxy_to_target(
&self,
ctx: &mut Context,
target: &Target,
) -> Result<(), (&'static str, String)>
async fn proxy_to_target( &self, ctx: &mut Context, target: &Target, ) -> Result<(), (&'static str, String)>
Proxies the request to target, writing the backend reply onto
ctx.response. Mirrors the upstream node: overrides the Host header
with the target and forwards method/headers/body unchanged. On success
returns Ok(()); on transport/timeout failure returns the gateway
error code + message so the caller can prepare a 502.
Trait Implementations§
Source§impl Plugin for TrafficSplitPlugin
impl Plugin for TrafficSplitPlugin
Source§fn plugin_type(&self) -> &str
fn plugin_type(&self) -> &str
Source§fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: Context,
_named_inputs: &'life1 HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn execute<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: Context,
_named_inputs: &'life1 HashMap<String, Value>,
) -> Pin<Box<dyn Future<Output = Result<PluginOutput, PluginExecutionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Auto Trait Implementations§
impl Freeze for TrafficSplitPlugin
impl !RefUnwindSafe for TrafficSplitPlugin
impl Send for TrafficSplitPlugin
impl Sync for TrafficSplitPlugin
impl Unpin for TrafficSplitPlugin
impl UnsafeUnpin for TrafficSplitPlugin
impl !UnwindSafe for TrafficSplitPlugin
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more