The gRPC server can be extended by middlewares. Middleware is called on each incoming (for service) or outgoing (for client) RPC request. Different middlewares handle the call in the defined order. A middleware may decide to reject the call or call the next middleware in the stack. Middlewares may implement almost any enhancement to the gRPC server including authorization and authentication, ratelimiting, logging, tracing, audit, etc.
There is an ugrpc::server::MiddlewarePipeline
component for configuring the middlewares pipeline. There are default middlewares:
All of these middlewares are enabled by default. However, you must register components of these middlewares in the component list. You should use ugrpc::server::DefaultComponentList
or ugrpc::server::MinimalComponentList
.
ugrpc::server::MiddlewarePipeline
is a global configuration of server middlewares. So, you can enabled/disable middlewares with the option enabled
in the global (grpc-server-middlewares-pipeline
) or middleware config.
Example configuration:
If you implement your server middleware, you must register it in config grpc-server-middlewares-pipeline
.
Example:
Your middleware will be called after all userver middlewares. Your middlewares will be lexicographic ordered.
It possible to order middlewares in the pipeline. Use ugrpc::server::MiddlewareDependencyBuilder
and (optional) enum ugrpc::server::DependencyType
.
Then the middleware of the component MiddlewareComponent
will be after path_to_my_middleware::Component
in the pipeline.
@warn Middlewares that ordered with ugrpc::server::MiddlewareDependencyBuilder::Before
and ugrpc::server::MiddlewareDependencyBuilder::After
must be in the same group.
If then someone disable middleware path_to_my_middleware::Component
, userver does not start, because MiddlewareComponent
requested this middleware. So, this connection is strong (ugrpc::server::DependencyType::kStrong
). You can set ugrpc::server::DependencyType::kWeak
to ignore disabling of path_to_my_middleware::Component
.
@warn The middlewares pipeline can't has a cycles. Userver does not start. So, be careful when order middlewares.
The middlewares pipeline consists of groups (ordered from begin to end):
ugrpc::server::groups::PreCore
ugrpc::server::groups::Logging
ugrpc::server::groups::Auth
ugrpc::server::groups::Core
ugrpc::server::groups::PostCore
ugrpc::server::groups::User
All user middlewares will be in ugrpc::server::groups::User
group by default. But you can register your middleware in any group such as:
You can don't pass ugrpc::server::MiddlewareDependencyBuilder
in ugrpc::server::MiddlewareComponentBase
and middleware will be in the group User
by default.