资讯专栏INFORMATION COLUMN

dubbo源码解析——Router

zhangqh / 1068人阅读

摘要:我们先来看看的继承体系图从图中可以看出他有三个实现类分别是,,判断是否需要筛选的路由,相对比较简单没有配置参数,直接选择正常的获取配置参数,判断是否需要选择正常选择剔除的判断是否的方式判断是否协议脚本路由规则支持脚本引擎的所有脚本,比如等,

我们先来看看Router的继承体系图

从图中可以看出,他有三个实现类,分别是ConditionRouter,MockInvokersSelector,ScriptRouter

MockInvokersSelector

判断是否需要筛选mock invoker的路由,相对比较简单

@Override
    public  List> route(final List> invokers,
                                      URL url, final Invocation invocation) throws RpcException {
        if (invocation.getAttachments() == null) {
            // 没有配置参数,直接选择正常的invoker
            return getNormalInvokers(invokers);
        } else {
            // 获取mock配置参数,判断是否需要mock
            String value = invocation.getAttachments().get(Constants.INVOCATION_NEED_MOCK);
            if (value == null)
                // 选择正常invoker
                return getNormalInvokers(invokers);
            else if (Boolean.TRUE.toString().equalsIgnoreCase(value)) {
                // 选择mock invoker
                return getMockedInvokers(invokers);
            }
        }
        return invokers;
    }

    private  List> getMockedInvokers(final List> invokers) {
        if (!hasMockProviders(invokers)) {
            return null;
        }
        List> sInvokers = new ArrayList>(1);
        for (Invoker invoker : invokers) {
            if (invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) {
                sInvokers.add(invoker);
            }
        }
        return sInvokers;
    }

    private  List> getNormalInvokers(final List> invokers) {
        if (!hasMockProviders(invokers)) {
            return invokers;
        } else {
            // 剔除mock的invoker
            List> sInvokers = new ArrayList>(invokers.size());
            for (Invoker invoker : invokers) {
                if (!invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) {
                    sInvokers.add(invoker);
                }
            }
            return sInvokers;
        }
    }

    private  boolean hasMockProviders(final List> invokers) {
        boolean hasMockProvider = false;
        for (Invoker invoker : invokers) {
            // 判断是否mock invoker的方式:判断protocol是否mock协议
            if (invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) {
                hasMockProvider = true;
                break;
            }
        }
        return hasMockProvider;
    }
ScriptRouter

脚本路由规则 支持 JDK 脚本引擎的所有脚本,比如:javascript, jruby, groovy 等,通过 type=javascript 参数设置脚本类型,缺省为 javascript。

ConditionRouter

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72130.html

相关文章

  • dubbo源码解析——概要篇

    摘要:服务提供者代码上面这个类会被封装成为一个实例,并新生成一个实例。这样当网络通讯层收到一个请求后,会找到对应的实例,并调用它所对应的实例,从而真正调用了服务提供者的代码。 这次源码解析借鉴《肥朝》前辈的dubbo源码解析,进行源码学习。总结起来就是先总体,后局部.也就是先把需要注意的概念先抛出来,把整体架构图先画出来.让读者拿着地图跟着我的脚步,并且每一步我都提醒,现在我们在哪,我们下一...

    Meathill 评论0 收藏0
  • dubbo源码解析——消费过程

    摘要:上一篇源码解析概要篇中我们了解到中的一些概念及消费端总体调用过程。由于在生成代理实例的时候,在构造函数中赋值了,因此可以只用该进行方法的调用。 上一篇 dubbo源码解析——概要篇中我们了解到dubbo中的一些概念及消费端总体调用过程。本文中,将进入消费端源码解析(具体逻辑会放到代码的注释中)。本文先是对消费过程的总体代码逻辑理一遍,个别需要细讲的点,后面会专门的文章进行解析。...

    darkbug 评论0 收藏0
  • Dubbo 源码分析 - 集群容错之 Router

    摘要:源码分析条件路由规则有两个条件组成,分别用于对服务消费者和提供者进行匹配。如果服务提供者匹配条件为空,表示对某些服务消费者禁用服务。此时第六次循环分隔符,,。第二个和第三个参数来自方法的参数列表,这两个参数分别为服务提供者和服务消费者。 1. 简介 上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router...

    jcc 评论0 收藏0
  • dubbo源码解析(四十)集群——router

    摘要:源码分析一创建一个该类是基于条件表达式规则路由工厂类。路由工厂获得配置项,默认为获得获得类型读取规则获得脚本路由获得路由后记该部分相关的源码解析地址该文章讲解了集群中关于路由规则实现的部分。 集群——router 目标:介绍dubbo中集群的路由,介绍dubbo-cluster下router包的源码。 前言 路由规则 决定一次 dubbo 服务调用的目标服务器,分为条件路由规则和脚本路...

    FullStackDeveloper 评论0 收藏0
  • dubbo源码解析(三十七)集群——directory

    摘要:首先将根据路由规则服务提供者和配置规则三种类型分开,分别放入三个集合,然后对每个集合进行修改或者通知设置禁止访问置空关闭所有的关闭禁止访问引用老的传入的为空,说明是路由规则或配置规则发生改变,此时是空的,直接使用。 集群——directory 目标:介绍dubbo中集群的目录,介绍dubbo-cluster下directory包的源码。 前言 我在前面的文章中也提到了Directory...

    blastz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<