diff --git a/envoy/config/filter/network/dubbo_proxy/v2alpha1/BUILD b/envoy/config/filter/network/dubbo_proxy/v2alpha1/BUILD index 98107daf..2e88b619 100644 --- a/envoy/config/filter/network/dubbo_proxy/v2alpha1/BUILD +++ b/envoy/config/filter/network/dubbo_proxy/v2alpha1/BUILD @@ -4,5 +4,14 @@ licenses(["notice"]) # Apache 2 api_proto_library( name = "dubbo_proxy", - srcs = ["dubbo_proxy.proto"], + srcs = [ + "dubbo_proxy.proto", + "route.proto", + ], + deps = [ + "//envoy/api/v2/core:base", + "//envoy/api/v2/route", + "//envoy/type:range", + "//envoy/type/matcher:string", + ], ) diff --git a/envoy/config/filter/network/dubbo_proxy/v2alpha1/dubbo_proxy.proto b/envoy/config/filter/network/dubbo_proxy/v2alpha1/dubbo_proxy.proto index fd7a0200..e38e50a5 100644 --- a/envoy/config/filter/network/dubbo_proxy/v2alpha1/dubbo_proxy.proto +++ b/envoy/config/filter/network/dubbo_proxy/v2alpha1/dubbo_proxy.proto @@ -1,27 +1,54 @@ syntax = "proto3"; -package envoy.extensions.filters.network.dubbo_proxy.v2alpha1; -option java_package = "io.envoyproxy.envoy.extensions.filters.network.dubbo_proxy.v2alpha1"; +package envoy.config.filter.network.dubbo_proxy.v2alpha1; +option java_package = "io.envoyproxy.envoy.config.filter.network.dubbo_proxy.v2alpha1"; option go_package = "v2"; +import "envoy/config/filter/network/dubbo_proxy/v2alpha1/route.proto"; + +import "google/protobuf/any.proto"; + import "validate/validate.proto"; +import "gogoproto/gogo.proto"; // [#protodoc-title: Dubbo Proxy] // Dubbo Proxy filter configuration. - message DubboProxy { // The human readable prefix to use when emitting statistics. string stat_prefix = 1 [(validate.rules).string.min_bytes = 1]; // Configure the protocol used. - enum ProtocolType { - Dubbo = 0; // the default protocol. - } ProtocolType protocol_type = 2 [(validate.rules).enum.defined_only = true]; // Configure the serialization protocol used. - enum SerializationType { - Hessian2 = 0; // the default serialization protocol. - } SerializationType serialization_type = 3 [(validate.rules).enum.defined_only = true]; + + // The route table for the connection manager is static and is specified in this property. + repeated RouteConfiguration route_config = 4; + + // A list of individual Dubbo filters that make up the filter chain for requests made to the + // Dubbo proxy. Order matters as the filters are processed sequentially. For backwards + // compatibility, if no dubbo_filters are specified, a default Dubbo router filter + // (`envoy.filters.dubbo.router`) is used. + repeated DubboFilter dubbo_filters = 5; } + +enum ProtocolType { + Dubbo = 0; // the default protocol. +} + +enum SerializationType { + Hessian2 = 0; // the default serialization protocol. +} + +// DubboFilter configures a Dubbo filter. +// [#comment:next free field: 3] +message DubboFilter { + // The name of the filter to instantiate. The name must match a supported + // filter. + string name = 1 [(validate.rules).string.min_bytes = 1]; + + // Filter specific configuration which depends on the filter being + // instantiated. See the supported filters for further documentation. + google.protobuf.Any config = 2; +} \ No newline at end of file diff --git a/envoy/config/filter/network/dubbo_proxy/v2alpha1/route.proto b/envoy/config/filter/network/dubbo_proxy/v2alpha1/route.proto new file mode 100644 index 00000000..26ee2209 --- /dev/null +++ b/envoy/config/filter/network/dubbo_proxy/v2alpha1/route.proto @@ -0,0 +1,103 @@ +syntax = "proto3"; + +package envoy.config.filter.network.dubbo_proxy.v2alpha1; +option java_package = "io.envoyproxy.envoy.config.filter.network.dubbo_proxy.v2alpha1"; +option go_package = "v2"; + +import "envoy/api/v2/route/route.proto"; +import "envoy/type/matcher/string.proto"; +import "envoy/type/range.proto"; + +import "google/protobuf/wrappers.proto"; + +import "validate/validate.proto"; +import "gogoproto/gogo.proto"; + +// [#protodoc-title: Dubbo route configuration] + +message RouteConfiguration { + // The name of the route configuration. Reserved for future use in asynchronous route discovery. + string name = 1; + + // The interface name of the service. + string interface = 2; + + // Which group does the interface belong to. + string group = 3; + + // The version number of the interface. + string version = 4; + + // The list of routes that will be matched, in order, against incoming requests. The first route + // that matches will be used. + repeated Route routes = 5 [(gogoproto.nullable) = false]; +} + +message Route { + // Route matching prarameters. + RouteMatch match = 1 [(validate.rules).message.required = true, (gogoproto.nullable) = false]; + + // Route request to some upstream cluster. + RouteAction route = 2 [(validate.rules).message.required = true, (gogoproto.nullable) = false]; +} + +message MethodMatch { + // The name of the method. + envoy.type.matcher.StringMatcher name = 1; + + // The parameter matching type. + message ParameterMatchSpecifier { + oneof parameter_match_specifier { + // If specified, header match will be performed based on the value of the header. + string exact_match = 3; + + // If specified, header match will be performed based on range. + // The rule will match if the request header value is within this range. + // The entire request header value must represent an integer in base 10 notation: consisting + // of an optional plus or minus sign followed by a sequence of digits. The rule will not match + // if the header value does not represent an integer. Match will fail for empty values, + // floating point numbers or if only a subsequence of the header value is an integer. + // + // Examples: + // + // * For range [-10,0), route will match for header value -1, but not for 0, + // "somestring", 10.9, + // "-1somestring" + envoy.type.Int64Range range_match = 4; + } + } + + // Method parameter definition. + // The key is the parameter index, starting from 0. + // The value is the parameter matching type. + map params_match = 2; +} + +message RouteMatch { + // Method level routing matching. + MethodMatch method = 1; + + // Specifies a set of headers that the route should match on. The router will check the request’s + // headers against all the specified headers in the route config. A match will happen if all the + // headers in the route are present in the request with the same values (or based on presence if + // the value field is not in the config). + repeated envoy.api.v2.route.HeaderMatcher headers = 2; +} + +// [#comment:next free field: 2] +message RouteAction { + oneof cluster_specifier { + option (validate.required) = true; + + // Indicates the upstream cluster to which the request should be routed. + string cluster = 1; + + // Multiple upstream clusters can be specified for a given route. The + // request is routed to one of the upstream clusters based on weights + // assigned to each cluster. + // + // .. note:: + // Currently ClusterWeight only supports the name and weight fields. + envoy.api.v2.route.WeightedCluster weighted_clusters = 2; + } +}