dubbo学习(五)路由

 
 
 

dubbo的路由规则,是基于invoker集合进行筛选,过滤出可用的invoker集合用于后续的执行。

网关黑白名单场景如下所示:

黑白名单的数据来源一般分两类,一类是静态内置,如:

  • 来自某个网段的请求加入黑名单
  • 来自预设的指定IP列表的请求加入黑名单

第二类是动态列表,比如来自flink按时间区间动态计算的阈值计算出来的清单,如:

  • 按IP在10s内的访问频次阈值
  • 按用户id在30s内的访问频次阈值

在dubbo网关下,黑白名单场景却不适合使用dubbo的路由规则来执行,以常用的ConditionRouter来解释。

从ConditionRouter的matchCondition方法可以得知,规则的定义,来自router配置,规则匹配的数据参数则来自consumer&provider的url。基于url就存在一个严重的问题,即受限于数据量&刷新成本。

在黑白名单场景下,规则的命中规模可膨胀,可收缩,也可以剧烈变化。如果使用dubbo的条件路由,则会面临url剧烈变化导致同步成本剧增,url膨胀导致同步效率极差。

针对这种情况,可以自定义router实现,不从url获取参数与值,仅根据调用上下文来获取数据。

从源码角度来看,router的触发有2个地方。其一是在RegistyDirectory在收到url更新时触发的刷新invoker来触发的,其二是在Directory的list时会对提取到的invoker集合进行router处理。故,可以自定义一个router实现,在这一个环节进行黑白名单处理。

但是,实际场合,一般不会通过这种方式来处理,网关实现时,目前依赖的是spring webFlux框架,在接入http请求时,可以扩展filter来支持,并不需要下层到dubbo的执行层面由路由来支持。当然,如果是dubbo直接对外另说。

 

网关灰度路由的场景:

灰度路由一般是某个应用的某个url基于一定的条件定向转发请求到指定机器上。

这种情况下,路由规则也可以以筛选器的身份参与进来。

posted @ 2020-10-22 16:38  飞昂之雪  阅读(468)  评论(0编辑  收藏  举报