Skip to content

Commit eadd6d5

Browse files
committed
feat grpc: add per-service middleware config overriding
Relates: <HIDDEN_URL> commit_hash:0c3ff8492fc854cbdacea653291cce9861af2177
1 parent 34571a0 commit eadd6d5

File tree

40 files changed

+254
-174
lines changed

40 files changed

+254
-174
lines changed

.mapping.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,9 +1978,11 @@
19781978
"grpc/include/userver/ugrpc/server/impl/service_worker_impl.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/impl/service_worker_impl.hpp",
19791979
"grpc/include/userver/ugrpc/server/metadata_utils.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/metadata_utils.hpp",
19801980
"grpc/include/userver/ugrpc/server/middlewares/baggage/component.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/baggage/component.hpp",
1981+
"grpc/include/userver/ugrpc/server/middlewares/baggage/middleware.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/baggage/middleware.hpp",
19811982
"grpc/include/userver/ugrpc/server/middlewares/base.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/base.hpp",
19821983
"grpc/include/userver/ugrpc/server/middlewares/congestion_control/component.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/congestion_control/component.hpp",
19831984
"grpc/include/userver/ugrpc/server/middlewares/deadline_propagation/component.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/deadline_propagation/component.hpp",
1985+
"grpc/include/userver/ugrpc/server/middlewares/deadline_propagation/middleware.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/deadline_propagation/middleware.hpp",
19841986
"grpc/include/userver/ugrpc/server/middlewares/field_mask/component.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/field_mask/component.hpp",
19851987
"grpc/include/userver/ugrpc/server/middlewares/fwd.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/fwd.hpp",
19861988
"grpc/include/userver/ugrpc/server/middlewares/groups.hpp":"taxi/uservices/userver/grpc/include/userver/ugrpc/server/middlewares/groups.hpp",
@@ -2092,16 +2094,12 @@
20922094
"grpc/src/ugrpc/server/impl/service_worker_impl.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/impl/service_worker_impl.cpp",
20932095
"grpc/src/ugrpc/server/impl/topology_sort.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/impl/topology_sort.cpp",
20942096
"grpc/src/ugrpc/server/impl/topology_sort.hpp":"taxi/uservices/userver/grpc/src/ugrpc/server/impl/topology_sort.hpp",
2095-
"grpc/src/ugrpc/server/middlewares/baggage/component.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/baggage/component.cpp",
20962097
"grpc/src/ugrpc/server/middlewares/baggage/middleware.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/baggage/middleware.cpp",
2097-
"grpc/src/ugrpc/server/middlewares/baggage/middleware.hpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/baggage/middleware.hpp",
20982098
"grpc/src/ugrpc/server/middlewares/base.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/base.cpp",
20992099
"grpc/src/ugrpc/server/middlewares/congestion_control/component.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/congestion_control/component.cpp",
21002100
"grpc/src/ugrpc/server/middlewares/congestion_control/middleware.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/congestion_control/middleware.cpp",
21012101
"grpc/src/ugrpc/server/middlewares/congestion_control/middleware.hpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/congestion_control/middleware.hpp",
2102-
"grpc/src/ugrpc/server/middlewares/deadline_propagation/component.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/deadline_propagation/component.cpp",
21032102
"grpc/src/ugrpc/server/middlewares/deadline_propagation/middleware.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/deadline_propagation/middleware.cpp",
2104-
"grpc/src/ugrpc/server/middlewares/deadline_propagation/middleware.hpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/deadline_propagation/middleware.hpp",
21052103
"grpc/src/ugrpc/server/middlewares/field_mask/component.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/field_mask/component.cpp",
21062104
"grpc/src/ugrpc/server/middlewares/field_mask/middleware.cpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/field_mask/middleware.cpp",
21072105
"grpc/src/ugrpc/server/middlewares/field_mask/middleware.hpp":"taxi/uservices/userver/grpc/src/ugrpc/server/middlewares/field_mask/middleware.hpp",

grpc/functional_tests/basic_server/static_config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ components_manager:
3737
disable-all-pipeline-middlewares: true
3838
middlewares:
3939
grpc-server-headers-propagator:
40+
enabled: true
4041

4142
grpc-server-middlewares-pipeline:
4243

grpc/functional_tests/middleware_server/src/my_middleware.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ void MyMiddleware::CallResponseHook(const ugrpc::server::MiddlewareCallContext&,
1818

1919
void MyMiddleware::Handle(ugrpc::server::MiddlewareCallContext& context) const { context.Next(); }
2020

21-
std::shared_ptr<ugrpc::server::MiddlewareBase> MyMiddlewareComponent::GetMiddleware() { return middleware_; }
21+
std::shared_ptr<ugrpc::server::MiddlewareBase>
22+
MyMiddlewareComponent::CreateMiddleware(const ugrpc::server::ServiceInfo&, const yaml_config::YamlConfig&) const {
23+
return middleware_;
24+
}
2225

2326
} // namespace functional_tests

grpc/functional_tests/middleware_server/src/my_middleware.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@ class MyMiddleware final : public ugrpc::server::MiddlewareBase {
2020
void Handle(ugrpc::server::MiddlewareCallContext& context) const override;
2121
};
2222

23-
class MyMiddlewareComponent final : public ugrpc::server::MiddlewareComponentBase {
23+
class MyMiddlewareComponent final : public ugrpc::server::MiddlewareFactoryComponentBase {
2424
public:
2525
static constexpr std::string_view kName = "my-middleware-server";
2626

2727
MyMiddlewareComponent(const components::ComponentConfig& config, const components::ComponentContext& ctx)
28-
: ugrpc::server::MiddlewareComponentBase(config, ctx), middleware_(std::make_shared<MyMiddleware>()) {}
28+
: ugrpc::server::MiddlewareFactoryComponentBase(config, ctx), middleware_(std::make_shared<MyMiddleware>()) {}
2929

30-
std::shared_ptr<ugrpc::server::MiddlewareBase> GetMiddleware() override;
30+
std::shared_ptr<ugrpc::server::MiddlewareBase> CreateMiddleware(
31+
const ugrpc::server::ServiceInfo&,
32+
const yaml_config::YamlConfig& middleware_config
33+
) const override;
3134

3235
private:
3336
std::shared_ptr<ugrpc::server::MiddlewareBase> middleware_;

grpc/functional_tests/middleware_server/src/my_second_middleware.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ void MySecondMiddleware::CallResponseHook(
2424

2525
void MySecondMiddleware::Handle(ugrpc::server::MiddlewareCallContext& context) const { context.Next(); }
2626

27-
std::shared_ptr<ugrpc::server::MiddlewareBase> MySecondMiddlewareComponent::GetMiddleware() { return middleware_; }
27+
std::shared_ptr<ugrpc::server::MiddlewareBase>
28+
MySecondMiddlewareComponent::CreateMiddleware(const ugrpc::server::ServiceInfo&, const yaml_config::YamlConfig&) const {
29+
return middleware_;
30+
}
2831

2932
} // namespace functional_tests

grpc/functional_tests/middleware_server/src/my_second_middleware.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@ class MySecondMiddleware final : public ugrpc::server::MiddlewareBase {
2020
void Handle(ugrpc::server::MiddlewareCallContext& context) const override;
2121
};
2222

23-
class MySecondMiddlewareComponent final : public ugrpc::server::MiddlewareComponentBase {
23+
class MySecondMiddlewareComponent final : public ugrpc::server::MiddlewareFactoryComponentBase {
2424
public:
2525
static constexpr std::string_view kName = "my-second-middleware-server";
2626

2727
MySecondMiddlewareComponent(const components::ComponentConfig& config, const components::ComponentContext& ctx)
28-
: ugrpc::server::MiddlewareComponentBase(config, ctx), middleware_(std::make_shared<MySecondMiddleware>()) {}
28+
: ugrpc::server::MiddlewareFactoryComponentBase(config, ctx),
29+
middleware_(std::make_shared<MySecondMiddleware>()) {}
2930

30-
std::shared_ptr<ugrpc::server::MiddlewareBase> GetMiddleware() override;
31+
std::shared_ptr<ugrpc::server::MiddlewareBase> CreateMiddleware(
32+
const ugrpc::server::ServiceInfo&,
33+
const yaml_config::YamlConfig& middleware_config
34+
) const override;
3135

3236
private:
3337
std::shared_ptr<ugrpc::server::MiddlewareBase> middleware_;

grpc/functional_tests/middleware_server/static_config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ components_manager:
2121
port: 8091
2222

2323
grpc-server-logging:
24-
msg-size-log-limit: 10
24+
msg-size-log-limit: 15
2525

2626
congestion-control:
2727

@@ -37,6 +37,7 @@ components_manager:
3737
disable-all-pipeline-middlewares: true
3838
middlewares:
3939
grpc-server-logging:
40+
msg-size-log-limit: 10
4041
enabled: true
4142
my-middleware-server:
4243
enabled: true

grpc/include/userver/ugrpc/server/middlewares/baggage/component.hpp

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/// @brief @copybrief
55
/// ugrpc::server::middlewares::baggage::Component
66

7-
#include <userver/ugrpc/server/middlewares/base.hpp>
7+
#include <userver/ugrpc/server/middlewares/baggage/middleware.hpp>
88

99
USERVER_NAMESPACE_BEGIN
1010

@@ -25,22 +25,10 @@ namespace ugrpc::server::middlewares::baggage {
2525

2626
// clang-format on
2727

28-
class Component final : public MiddlewareComponentBase {
29-
public:
30-
/// @ingroup userver_component_names
31-
/// @brief The default name of ugrpc::server::middlewares::baggage::Component
32-
static constexpr std::string_view kName = "grpc-server-baggage";
33-
34-
Component(const components::ComponentConfig& config, const components::ComponentContext& context);
35-
36-
std::shared_ptr<MiddlewareBase> GetMiddleware() override;
37-
};
28+
using Component = SimpleMiddlewareFactoryComponent<Middleware>;
3829

3930
} // namespace ugrpc::server::middlewares::baggage
4031

41-
template <>
42-
inline constexpr bool components::kHasValidate<ugrpc::server::middlewares::baggage::Component> = true;
43-
4432
template <>
4533
inline constexpr auto components::kConfigFileMode<ugrpc::server::middlewares::baggage::Component> =
4634
ConfigFileMode::kNotRequired;

grpc/src/ugrpc/server/middlewares/baggage/middleware.hpp renamed to grpc/include/userver/ugrpc/server/middlewares/baggage/middleware.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ namespace ugrpc::server::middlewares::baggage {
88

99
class Middleware final : public MiddlewareBase {
1010
public:
11+
/// @ingroup userver_component_names
12+
/// @brief The default name of ugrpc::server::middlewares::baggage::Component
13+
static constexpr std::string_view kName = "grpc-server-baggage";
14+
15+
/// @brief dependency of this middleware
16+
static inline const auto kDependency = MiddlewareDependencyBuilder();
17+
1118
void Handle(MiddlewareCallContext& context) const override;
1219
};
1320

grpc/include/userver/ugrpc/server/middlewares/base.hpp

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
#include <userver/components/component_base.hpp>
1212
#include <userver/utils/function_ref.hpp>
13+
#include <userver/utils/impl/internal_tag.hpp>
14+
#include <userver/yaml_config/schema.hpp>
15+
#include <userver/yaml_config/yaml_config.hpp>
1316

1417
#include <userver/ugrpc/server/call.hpp>
1518
#include <userver/ugrpc/server/middlewares/fwd.hpp>
@@ -19,6 +22,8 @@ USERVER_NAMESPACE_BEGIN
1922

2023
namespace ugrpc::server {
2124

25+
struct ServiceInfo;
26+
2227
/// @brief Context for middleware-specific data during gRPC call
2328
class MiddlewareCallContext final {
2429
public:
@@ -83,26 +88,63 @@ class MiddlewareBase {
8388
/// @ingroup userver_base_classes
8489
///
8590
/// @brief Base class for middleware component
86-
class MiddlewareComponentBase : public components::ComponentBase {
91+
class MiddlewareFactoryComponentBase : public components::ComponentBase {
8792
public:
88-
MiddlewareComponentBase(
93+
MiddlewareFactoryComponentBase(
8994
const components::ComponentConfig&,
9095
const components::ComponentContext&,
9196
MiddlewareDependencyBuilder&& builder = MiddlewareDependencyBuilder().InGroup<groups::User>()
9297
);
9398

9499
/// @brief Returns a middleware according to the component's settings
95-
virtual std::shared_ptr<MiddlewareBase> GetMiddleware() = 0;
100+
///
101+
/// @param info is a info of a grpc-service
102+
/// @param middleware_config config for the middleware
103+
virtual std::shared_ptr<MiddlewareBase>
104+
CreateMiddleware(const ServiceInfo& info, const yaml_config::YamlConfig& middleware_config) const = 0;
105+
106+
/// @brief This method should return the schema of a middleware configuration.
107+
/// Always write `return GetStaticConfigSchema();` in this method
108+
virtual yaml_config::Schema GetMiddlewareConfigSchema() const { return GetStaticConfigSchema(); }
109+
110+
static yaml_config::Schema GetStaticConfigSchema();
96111

97112
/// @cond
98113
/// Only for internal use.
99-
const impl::MiddlewareDependency& GetMiddlewareDependency() const;
114+
const impl::MiddlewareDependency& GetMiddlewareDependency(utils::impl::InternalTag) const;
115+
116+
const formats::yaml::Value& GetGlobalConfig(utils::impl::InternalTag) const;
100117
/// @endcond
101118

102119
private:
103-
impl::MiddlewareDependency dependency_;
120+
const impl::MiddlewareDependency dependency_;
121+
const formats::yaml::Value global_config_;
122+
};
123+
124+
/// @ingroup userver_middlewares
125+
///
126+
/// @brief A short-cut for defining a middleware-factory
127+
template <typename Middleware>
128+
class SimpleMiddlewareFactoryComponent final : public MiddlewareFactoryComponentBase {
129+
public:
130+
static constexpr std::string_view kName = Middleware::kName;
131+
132+
SimpleMiddlewareFactoryComponent(
133+
const components::ComponentConfig& config,
134+
const components::ComponentContext& context
135+
)
136+
: MiddlewareFactoryComponentBase(config, context, MiddlewareDependencyBuilder{Middleware::kDependency}) {}
137+
138+
private:
139+
std::shared_ptr<MiddlewareBase> CreateMiddleware(const ServiceInfo&, const yaml_config::YamlConfig&)
140+
const override {
141+
return std::make_shared<Middleware>();
142+
}
104143
};
105144

106145
} // namespace ugrpc::server
107146

147+
template <typename Middleware>
148+
inline constexpr bool components::kHasValidate<ugrpc::server::SimpleMiddlewareFactoryComponent<Middleware>> = true;
149+
108150
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)