Skip to main content

GrpcPlugin

Struct GrpcPlugin 

Source
pub struct GrpcPlugin { /* private fields */ }
Expand description

Serves tonic services from an Autumn app, on a dedicated HTTP/2 listener or on Autumn’s HTTP port (listener = "shared").

ⓘ
use autumn_plugin_grpc::GrpcPlugin;

autumn_web::app()
    .plugin(
        GrpcPlugin::new()
            .add_service(GreeterServer::new(MyGreeter))
            .file_descriptor_set(greeter::FILE_DESCRIPTOR_SET),
    )
    .run()
    .await;

The plugin reads [grpc] from autumn.toml (see GrpcConfig). Fluent setters apply on top of the file values.

On boot, the plugin:

  • builds the services (with AppState for add_service_with),
  • binds the listener (a failure aborts boot),
  • serves health and (in dev/test) reflection,
  • adds a grpc health indicator and grpc_server_* metrics to the actuator,
  • puts a GrpcHandle into AppState.

On shutdown, it drains (see GrpcHandle::shutdown).

Implementations§

Source§

impl GrpcPlugin

Source

pub fn new() -> Self

A plugin with no services, configured from [grpc].

Source

pub fn add_service<S>(self, service: S) -> Self
where S: Service<Request<TonicBody>, Error = Infallible> + NamedService + Clone + Send + Sync + 'static, S::Response: IntoResponse, S::Future: Send + 'static,

Serve a tonic service, for example GreeterServer::new(MyGreeter).

Source

pub fn add_service_with<S, F>(self, build: F) -> Self
where F: FnOnce(&AppState) -> S + Send + 'static, S: Service<Request<TonicBody>, Error = Infallible> + NamedService + Clone + Send + Sync + 'static, S::Response: IntoResponse, S::Future: Send + 'static,

Serve a tonic service that the plugin builds at startup, from AppState. Use this when the service needs the database pool or other app state.

ⓘ
GrpcPlugin::new().add_service_with(|state| {
    GreeterServer::new(MyGreeter::new(state.clone()))
})
Source

pub fn file_descriptor_set(self, encoded: &'static [u8]) -> Self

Add an encoded FileDescriptorSet for server reflection. Get it from tonic_prost_build (file_descriptor_set_path) and include_bytes!.

Source

pub fn layer<L>(self, layer: L) -> Self
where L: Layer<Route> + Clone + Send + Sync + 'static, L::Service: Service<Request> + Clone + Send + Sync + 'static, <L::Service as Service<Request>>::Response: IntoResponse + 'static, <L::Service as Service<Request>>::Error: Into<Infallible> + 'static, <L::Service as Service<Request>>::Future: Send + 'static,

Wrap every user service with a tower layer (for example rate limits or tracing). The layer does not wrap health or reflection, so probes and tools still work. For an auth layer, use guard.

Layers apply in call order: the last layer is the outermost.

Source

pub fn interceptor<F>(self, interceptor: F) -> Self
where F: Interceptor + Clone + Send + Sync + 'static,

Run a tonic interceptor before every user call. Like layer, it does not wrap health or reflection. For an auth interceptor, use guard_interceptor.

ⓘ
GrpcPlugin::new().interceptor(|mut request: tonic::Request<()>| {
    request.extensions_mut().insert(RequestStart(Instant::now()));
    Ok(request)
})
Source

pub fn guard<L>(self, layer: L, label: impl Into<String>) -> Self
where L: Layer<Route> + Clone + Send + Sync + 'static, L::Service: Service<Request> + Clone + Send + Sync + 'static, <L::Service as Service<Request>>::Response: IntoResponse + 'static, <L::Service as Service<Request>>::Error: Into<Infallible> + 'static, <L::Service as Service<Request>>::Future: Send + 'static,

Guard every user service with layer, for example an auth layer. autumn routes then shows the services as gated, with label as the middleware name.

Source

pub fn guard_interceptor<F>( self, interceptor: F, label: impl Into<String>, ) -> Self
where F: Interceptor + Clone + Send + Sync + 'static,

Guard every user service with a tonic interceptor. Like guard, with an interceptor in place of a layer.

Source

pub fn public(self) -> Self

Declare the user services open to all clients. autumn routes then shows them as public. Without guard* or public, the services are unclassified, and autumn routes audit fails.

Source

pub fn route_infos(&self) -> Vec<RouteInfo>

The gRPC services as autumn routes lists them. The method is GRPC and the path is /<service>/*. These routes are on the gRPC listener, or on the HTTP port in shared mode. A plugin on a non-default section uses the method GRPC:<section>. Autumn 0.8 refuses two plugins that declare the same method and path, and two servers can serve one service on different ports.

Source

pub fn configure( self, apply: impl Fn(&mut GrpcConfig) + Send + Sync + 'static, ) -> Self

Change the configuration in code, after files and environment.

Source

pub fn config(self, config: GrpcConfig) -> Self

Use config and read no files or environment variables. Fluent setters still apply on top.

Source

pub fn config_section(self, section: impl Into<String>) -> Self

Read a different section than [grpc]. The environment prefix changes with the section: grpc_admin reads AUTUMN_GRPC_ADMIN__*. Use this to run two servers.

Source

pub fn development(self, development: bool) -> Self

Force development (true) or production (false) defaults for auto settings. By default, the active profile decides.

Source

pub fn listener(self, listener: Listener) -> Self

Choose the listener: Listener::Dedicated (default) or Listener::Shared (Autumn’s HTTP port, feature multiplex).

Source

pub fn bind(self, addr: impl Into<String>) -> Self

Set the listen address, IP:port.

Source

pub fn handle(&self) -> GrpcHandle

A handle to this plugin’s server. It is valid before and after boot.

Source

pub fn service_names(&self) -> &[&'static str]

Names of the services added with add_service*.

Source

pub fn effective_config(&self) -> Result<&GrpcConfig, &ConfigError>

The configuration after files, environment and code.

§Errors

The ConfigError that aborts boot.

Trait Implementations§

Source§

impl Debug for GrpcPlugin

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for GrpcPlugin

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Plugin for GrpcPlugin

Source§

fn name(&self) -> Cow<'static, str>

The name contains the config section. Two servers need two sections.

Source§

fn build(self, app: AppBuilder) -> AppBuilder

Apply this plugin’s configuration to the builder. Read more
Source§

fn route_group(&self) -> Cow<'static, str>

The route group of the routes this plugin adds (#3544). Read more
Source§

fn contract(&self) -> Option<PluginContract>

Declare which autumn-web versions this plugin supports, and any experimental surface it knowingly depends on. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<P> Plugins for P
where P: Plugin,

Source§

fn apply(self, app: AppBuilder) -> AppBuilder

Apply every plugin in this bundle to the builder, in declaration order.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more