Dubbo 路由规则之条件路由

本文介绍了 Dubbo 的条件路由规则,包括概念、使用方式、常见场景及实现原理。条件路由允许根据接口服务或消费者应用配置路由规则,实现如黑名单、读写分离等场景。文中还通过实例演示了如何配置和使用条件路由,并解析了路由规则匹配的源码,帮助读者深入理解这一功能。
摘要由CSDN通过智能技术生成

Dubbo 路由规则之条件路由

前言

大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 路由规则之条件路由。在前一个章节中我们介绍了 Dubbo 令牌验证和优雅停机,以及我们也例举了常见的使用场景并且进行了源码解析来分析其实现原理,同时知道 Dubbo 中的令牌验证核心思想就是通过服务提供端提供的token或者随机产生的token放入注册中心进行管理,然后服务消费端获取token令牌并且在调用服务提供端时携带 token,服务提供端根据消费端携带的token进行验证。有的小伙伴可能会想:我们多个服务提供者能否通过一定的规则对调用的服务提供者进行过滤和限制呢?那接下来我们就围绕着这个问题一起来学习下 Dubbo 中的路由规则。下面就让我们快速开始吧!

1. 条件路由简介

首先我们得了解什么是路由规则?假设有这样一个场景如下图所示:

路由规则

上图中我们可以看到有两个机房分别是机房A、机房B,其中机房A只能访问到 Service A 和 Service B ,而机房B 只能访问到 Service C 和 Service D。要实现上面这种场景我们就需要用到所谓的路由规则。路由规则是在发起一次RPC调用前过滤目标服务器地址,而过滤后的地址列表,将作为消费端最终发起RPC调用的备选地址。在 Dubbo 中支持两种路由规则今天我们主要讨论条件路由。

  • 条件路由:支持以接口服务或消费者应用为粒度配置路由规则。

2. 使用方式

下面我们简单的讨论下条件路由使用方式:

条件路由

  • 接口服务粒度

    # demo-consumer1 的消费者只能消费所有端口为20880的服务实例
    # demo-consumer2 的消费者只能消费所有端口为20881的服务实例
    ---
    scope: application #应用粒度
    force: true
    runtime: true
    enabled: true
    key: demo-provider 
    conditions:
      - application=demo-consumer1 => address=*:20880
      - application=demo-consumer2 => address=*:20881
    
  • 应用粒度

    # BookFacade 的 queryAll 方法只能消费所有端口为20880的服务实例
    # BookFacade 的 queryByName 方法只能消费所有端口为20881的服务实例
    ---
    scope: service #服务粒度
    force: true
    runtime: true
    enabled: true
    key: com.muke.dubbocourse.common.api.BookFacade
    conditions:
      - method=queryAll => address=*:20880
      - method=queryByName => address=*:20881
    
  • 字段说明:

    编号 字段名称 说明 必填
    1 scope 路由规则的作用粒度,scope的取值会决定key的取值。
    service 服务粒度 application 应用粒度。
    必填
    2 Key 明确规则体作用在哪个接口服务或应用。 scope=service时,
    key取值为[{group}:]{service}[:{version}]的组合 scope=application时,
    key取值为application名称 。
    必填
    3 enabled enabled=true 当前路由规则是否生效,,缺省生效。 可不填
    4 force force=false 当路由结果为空时,是否强制执行,如果不强制执行,
    路由结果为空的路由规则将自动失效,缺省为 false
    可不填
    5 runtime runtime=false 是否在每次调用时执行路由规则,
    否则只在提供者地址列表变更时预先执行并缓存结果,
    调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为 true
    需要注意设置会影响调用的性能,缺省为 false
    可不填
    6 priority priority=1 路由规则的优先级,用于排序,优先级越大越靠前执行,缺省为 0 可不填
    7 conditions 定义具体的路由规则内容。 必填
  • Conditions规则体

    格式:

    • => 之前的为消费者匹配条件,所有参数和消费者的 URL 进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。
    • => 之后为提供者地址列表的过滤条件,所有参数和提供者的 URL 进行对比,消费者最终只拿到过滤后的地址列表。
    • 如果匹配条件为空,表示对所有消费方应用,如:=> host != 192.168.53.11
    • 如果过滤条件为空,表示禁止访问,如:host = 192.168.53.10 =>

    表达式:

    参数支持:

    • 服务调用信息,如:method, argument 等,暂不支持参数路由
    • URL 本身的字段,如:protocol, host, port 等
    • 以及 URL 上的所有参数,如:application, organization 等

    条件支持:

    • 等号 = 表示"匹配",如:host = 192.168.53.10
    • 不等号 != 表示"不匹配",如:host != 192.168.53.10

    值支持:

    • 以逗号 , 分隔多个值,如:host != 192.168.53.10,192.168.53.11
    • 以星号 * 结尾,表示通配,如:host != 10.20.*
    • 以美元符 $ 开头,表示引用消费者参数,如:host = $host

Tips:conditions部分是规则的主体,由1到任意多条规则组成,下面我们就每个规则的配置语法做详细说明:

3. 使用场景

从上面的简单介绍我们可以大致了解到,当我们消费对访问服务提供者时我们可以通过一定的规则对服务提供者列表进行过滤。那下面我们列举下工作中常使用的场景:

  1. 黑名单: 比如我们需要禁止某些服务消费者消费服务
host = 192.168.53.10,192.168.53.11 =>

上面配置表示禁止192.168.53.10192.168.53.11消费者访问服务提供者。

  1. 服务寄宿在应用上,只暴露一部分的机器,防止整个集群挂掉
=> host = 192.168.53.1*,192.168.53.2*

上面配置表示只能放192.168.53.1*192.168.53.2 ip 地址开头的服务提供者。

  1. 读写分离:读取数据和写入数据操作分开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年IT男

您的打赏就是对我的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值