Envoy Dubbo Proxy 网络过滤器:协议解码、路由配置与自定义过滤器开发指南

Envoy Dubbo Proxy 网络过滤器:协议解码、路由配置与自定义过滤器开发指南 Envoy Dubbo Proxy 网络过滤器协议解码、路由配置与自定义过滤器开发指南【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy导读Dubbo Proxy 是 Envoy 内置的网络层过滤器Network Filter负责在 Dubbo 客户端与服务端之间解析 RPC 协议它将解码后的 RPC 信息转换为可供路由决策使用的元数据包含请求 ID、请求类型、序列化类型以及路由所需的 service name、method name、parameter name 与 parameter value并配合 Dubbo Router 过滤器完成服务转发。本文以docs/root/configuration/listeners/network_filters/dubbo_proxy_filter.rst为核心骨架结合api/envoy/extensions/filters/network/dubbo_proxy/v3/下的 Protocol Buffer 定义与source/extensions/filters/network/dubbo_proxy/的源码实现系统讲解 Dubbo Proxy 的配置模型、统计指标、路由匹配规则以及如何基于 DecoderFilter 接口开发自定义过滤器帮助你在一份配置文件中完成 Dubbo 流量的透明代理。一、Dubbo Proxy 过滤器概述1.1 功能定位根据官方文档描述dubbo proxy filter 的工作方式如下解码Dubbo 客户端与服务端之间的 RPC 协议将解码后的 RPC 信息转换为元数据metadata元数据包括基础请求 ID、请求类型、序列化类型以及路由所需的 service name、method name、parameter name 和 parameter value路由决策完全基于这些解码出的元数据进行因此无需感知 Dubbo 二进制协议的内部细节即可完成转发。从源码结构看Dubbo Proxy 在source/extensions/filters/network/dubbo_proxy/目录下划分出清晰的职责模块decoder.h 与 decoder.cc 负责协议解码dubbo_protocol_impl.cc 实现协议解析dubbo_hessian2_serializer_impl.cc 实现 Hessian2 反序列化conn_manager.cc 作为连接管理器串起整条处理链路而 metadata.h 承载解码后的元数据结构。1.2 配置方式与类型 URL该过滤器应使用如下 type URL 进行配置type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy对应的 v3 API 消息为envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy其完整字段定义见 dubbo_proxy.proto。二、DubboProxy 消息核心配置字段逐项解析DubboProxy消息dubbo_proxy.proto定义了过滤器的主体配置字段如下字段类型必填/校验说明stat_prefixstring必填min_len: 1统计指标的可读前缀所有指标均以dubbo.stat_prefix.*为根protocol_typeProtocolTypedefined_only使用的 Dubbo 协议类型目前仅支持Dubbo默认值serialization_typeSerializationTypedefined_only使用的序列化协议目前仅支持Hessian2默认值route_configrepeated RouteConfiguration已废弃deprecated_at_minor_version 3.0静态路由表官方建议改用drds或multiple_route_configdrdsDrdsoneofroute_specifier通过 xDS 动态获取路由配置与route_config不能同时定义multiple_route_configMultipleRouteConfigurationoneofroute_specifier静态命名的多份路由配置dubbo_filtersrepeated DubboFilter可选过滤器链若未指定默认使用envoy.filters.dubbo.router2.1 协议与序列化枚举enum ProtocolType { Dubbo 0; // 默认协议 } enum SerializationType { Hessian2 0; // 默认序列化协议 }当前版本协议层仅支持 Dubbo 协议、序列化层仅支持 Hessian2这与源码中 protocol.h / serializer.h 抽象的协议/序列化接口设计一致——Enovy 通过接口预留了未来扩展更多协议与序列化方式的余地。2.2 Drds基于 xDS 的动态路由配置message Drds { config.core.v3.ConfigSource config_source 1; // 必填api_config_source 仅支持 aggregated api_type string route_config_name 2; // 指定要拉取的多路由配置名留空表示未命名配置 }要点config_source必填且当使用api_config_source时仅支持 aggregatedADSapi_typeroute_config_name用于区分多份路由配置决定从配置源拉取哪一份不填写则拉取未命名的那一份。2.3 DubboFilter过滤器链配置message DubboFilter { string name 1; // 过滤器名必须与已支持的过滤器匹配min_len: 1 google.protobuf.Any config 2; // 过滤器专属配置取决于具体过滤器 }过滤器链按顺序依次处理请求顺序敏感。出于向后兼容若未配置任何dubbo_filters将默认注入 Dubbo router 过滤器envoy.filters.dubbo.router。三、路由配置RouteConfiguration 与匹配规则路由相关消息定义在 route.protoDubbo 的路由模型与 HTTP 路由类似但匹配维度是 Dubbo 特有的服务接口与方法。3.1 RouteConfiguration字段说明name路由配置名预留给将来的异步路由发现使用interface服务接口名支持通配符见下文group接口所属的组version接口版本号routes路由列表按顺序匹配命中第一条即生效通配符规则源码注释原文语义*.methods.add可匹配com.dev.methods.add、com.prod.methods.add等com.dev.methods.*可匹配com.dev.methods.add、com.dev.methods.update等特殊通配符*匹配任意接口注意通配符不匹配空字符串例如*.methods.add不会匹配.methods.add。3.2 Route、RouteMatch 与 RouteActionRoute由必填的matchRouteMatch与必填的routeRouteAction组成RouteMatch支持方法级匹配method以及一组基于config.route.v3.HeaderMatcher的请求头匹配headers——当请求头与路由配置中所有指定头一致未配置值时按存在性匹配即命中RouteAction通过 oneofcluster_specifier指定目标二选一cluster请求路由到的上游集群名weighted_clusters按权重将请求分发到多个上游集群当前仅支持name与weight字段另可选metadata_match用于子集负载均衡subset LB的端点元数据匹配条件过滤器名须为envoy.lb。3.3 MethodMatch方法级参数匹配message MethodMatch { type.matcher.v3.StringMatcher name 1; // 方法名匹配器 mapuint32, ParameterMatchSpecifier params_match 2; // key 为参数索引从 0 开始 }ParameterMatchSpecifier支持两种参数匹配方式oneofexact_match参数值精确匹配range_matchtype.v3.Int64Range参数值落入指定整数区间。要求请求参数值整体为十进制整数可带正负号非整数浮点数、字符串混合等或空值均匹配失败。例如区间[-10,0)可匹配参数值-1但不匹配0、somestring、10.9、-1somestring。3.4 MultipleRouteConfiguration静态多路由配置message MultipleRouteConfiguration { string name 1; // 命名路由配置名用于异步路由发现 repeated RouteConfiguration route_config 4; // 连接管理器的路由表 }通过DubboProxy.multiple_route_config可直接在监听器配置中内联定义命名路由无需依赖 xDS 控制面适合小型或静态场景。四、完整配置示例官方示例深入注释以下 YAML 来自官方文档展示了在filter_chains中配置 Dubbo Proxy 的完整姿势并附上字段注释filter_chains: - filters: - name: envoy.filters.network.dubbo_proxy typed_config: type: type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy stat_prefix: dubbo_incomming_stats # 统计前缀指标形如 dubbo.dubbo_incomming_stats.request protocol_type: Dubbo # 协议类型当前仅支持 Dubbo serialization_type: Hessian2 # 序列化类型当前仅支持 Hessian2 multiple_route_config: # 使用静态多路由配置推荐替代已废弃的 route_config name: local_route # 命名路由配置 route_config: - interface: org.apache.dubbo.demo.DemoService # 服务接口名支持通配符 routes: - match: method: name: exact: sayHello # 方法名精确匹配 route: cluster: user_service_dubbo_server # 转发到上游集群 dubbo_filters: # 过滤器链顺序执行 - name: envoy.filters.dubbo.testFilter # 自定义过滤器见第五节 typed_config: type: type.googleapis.com/google.protobuf.Struct value: name: test_service - name: envoy.filters.dubbo.router # 路由过滤器负责最终转发4.1 关于 Router 过滤器Router 过滤器router.proto实现 Dubbo 转发几乎所有 Dubbo 代理场景都会用到。其核心职责是遵照配置的路由表执行转发指令type URL 为type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.router.v3.router。Router消息本身为空无字段全部行为由外层DubboProxy的路由配置驱动。4.2 配置要点总结若使用 xDSdrds则不能再同时配置静态route_config两者互斥若使用静态路由优先选择multiple_route_configroute_config已在 3.0 版本废弃自定义过滤器必须出现在 router 过滤器之前且链路末尾通常是envoy.filters.dubbo.router未显式配置dubbo_filters时Enovy 自动补全默认的 Dubbo router 过滤器。五、统计指标Statistics每个已配置的 dubbo proxy 过滤器都会在dubbo.stat_prefix.*命名空间下产生指标官方文档统计表整理如下指标名类型说明requestCounter总请求数request_twowayCounter双向twoway请求总数request_onewayCounter单向oneway请求总数request_eventCounter事件event请求总数request_decoding_errorCounter解码失败请求数request_decoding_successCounter解码成功请求数request_activeGauge当前活跃请求数responseCounter总响应数response_successCounter成功响应数response_errorCounter协议解析错误的响应数response_error_caused_connection_closeCounter因下游连接关闭导致的响应数response_business_exceptionCounter业务层返回异常信息的响应数response_decoding_errorCounter解码失败的响应数response_decoding_successCounter解码成功的响应数local_response_successCounter本地成功响应数local_response_errorCounter本地编码错误响应数local_response_business_exceptionCounter本地业务异常响应数cx_destroy_local_with_active_rqCounter有活跃请求时本地销毁的连接数cx_destroy_remote_with_active_rqCounter有活跃请求时远端销毁的连接数这些指标定义可在源码 stats.h 的ALL_DUBBO_FILTER_STATS宏中一一对应验证其中request_active为Accumulate类型的 Gauge此外源码还额外定义了request_time_msMilliseconds 直方图用于统计请求耗时。六、基于 DecoderFilter 开发自定义过滤器Dubbo Proxy 与 HTTP 过滤器类似提供了非常便捷的扩展机制官方文档给出的步骤为实现 DecoderFilter 接口并为过滤器命名例如testFilter添加过滤器配置配置方式即第四节示例中的dubbo_filters列表。官方示例片段dubbo_filters: - name: envoy.filters.dubbo.testFilter typed_config: type: type.googleapis.com/google.protobuf.Struct value: name: test_service - name: envoy.filters.dubbo.router从源码结构看DecoderFilter 接口定义于 decoder_event_handler.h 所在的解码事件处理体系之中Dubbo 过滤器实现位于 source/extensions/filters/network/dubbo_proxy/filters/ 目录Router 过滤器实现位于 source/extensions/filters/network/dubbo_proxy/router/。自定义过滤器注册后即可在解码阶段介入读取元数据接口名、方法名、参数等进行鉴权、限流、观测或改写等处理最后交由 router 过滤器完成转发。七、扩展阅读过滤器总览文档network_filters.rstDubbo Proxy 配置指南本文主要依据dubbo_proxy_filter.rstRouter 过滤器文档router_filter.rstv3 API 定义dubbo_proxy.proto、route.proto、router.proto源码实现dubbo_proxy 源码目录如需验证本文的 YAML 配置可在 Envoy 监听器配置中引入该过滤器链并通过dubbo.stat_prefix.*指标观察请求解码成功/失败、双向/单向/事件请求等运行状况。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考