16. Dubbo原理解析-集群&容错之router路由服务

Router服务路由, 根据路由规则从多个Invoker中选出一个子集AbstractDirectory是所有目录服务实现的上层抽象, 它在list列举出所有invokers后,会在通过Router服务进行路由过滤。

Router接口定义

public
interface
Router extendsComparable<Router> {

URL getUrl();

<T> List<Invoker<T>> route(List<Invoker<T>>invokers, URL url, Invocation invocation)throws RpcException;

}

ConditionRouter: 条件路由

我们这里简单分析下代码实现具体功能参考官方文档

条件表达式以 => 分割为whenRule和thenRule

ConditionRouter创建,构造器初始

1)从url根据RULE_KEY获取路由条件路由内容

2)rule.indexOf("=>") 分割路由内容

3)分别调用parseRule(rule) 解析路由为whenRule和thenRules

ConditionRouter执行route方法

1)如果url不满足when条件即过来条件, 不过滤返回所有invokers

2)遍历所有invokers判断是否满足then条件, 将满足条件的加入集合result

3)Result不为空,有满足条件的invokers返回

4)Result为空, 没有满足条件的invokers, 判断参数FORCE_KEY是否强制过来,如果强制过滤返回空, 不是返回所有即不过滤

ScriptRouter: 脚本路由,

通过url的RULE_KEY参数获取脚本内容,然后通过java的脚本引擎执行脚本代码, dubbo的测试用例都是通过javascript作为脚本但是理论上也支持groovy, jruby脚本,大家可以参考下测试用例ScriptRouterTest。

ScriptRouter创建,构造器初始化

1)从url获取脚本类型javascript, groovy等等

2)从url根据RULE_KEY获取路由规则内容

3)根据脚本类型获取java支持的脚本执行引擎

ScriptRouter执行route方法

1)执行引擎创建参数绑定

2)绑定执行的参数

3)执行引擎编译路由规则得到执行函数CompiledScript

4)CompiledScript.eval(binds) 根据参数执行路由规则

Dubbo提供了ConditionRouterFactory, ScriptRouterFactory来创建对应的路由,路由的规则从url的RULE_KEY参数来获取,路由规则可以通过监控中心或者治理中心写入注册中心

RegistryFactory registryFactory =ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();

Registry registry =registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181");

registry.register(URL.valueOf("condition://0.0.0.0/com.foo.BarService?category=routers&dynamic=false&rule="+ URL.encode("http://10.20.160.198/wiki/display/dubbo/host = 10.20.153.10=> host = 10.20.153.11") + "));

Dubbo也支持通过FileRouterFactory从文件读取路由规则,将读取的规则设置到url的RULE_KEY参数上, 文件的后缀代表了路由的类型,选择具体的路由工厂 ConditionRouterFactory,ScriptRouterFactory来创建路由规则

时间: 2025-01-31 06:51:31

16. Dubbo原理解析-集群&容错之router路由服务的相关文章

14. Dubbo原理解析-集群&amp;容错之Cluster

Dubbo作为一个分布式的服务治理框架,提供了集群部署,路由,软负载均衡及容错机制 下图描述了dubbo调用过程中的对于集群,负载等的调用关系. Cluster 将Directory中的多个Invoker伪装成一个Invoker, 对上层透明,包含集群的容错机制 Cluster接口定义 @SPI(FailoverCluster.NAME) public interface Cluster { @Adaptive <T> Invoker<T>join(Directory<T&g

15. Dubbo原理解析-集群&amp;容错之目录服务Directory

集群目录服务Directory, 代表多个Invoker, 可以看成List<Invoker>,它的值可能是动态变化的比如注册中心推送变更.集群选择调用服务时通过目录服务找到所有服务 Directory的接口定义 public interfaceDirectory<T> extends Node {     //服务类型 Class<T>getInterface(); //列出所有服务的可执行对象 List<Invoker<T>>list(Inv

17. Dubbo原理解析-集群&amp;容错之负载均衡

LoadBalance负载均衡, 负责从多个 Invokers中选出具体的一个Invoker用于本次调用,调用过程中包含了负载均衡的算法,调用失败后需要重新选择 LoadBalance接口定义 @SPI(RandomLoadBalance.NAME) public interface LoadBalance{ @Adaptive("loadbalance") <T> Invoker<T> select(List<Invoker<T>> i

Dubbo 源码分析 - 集群容错之 Router

1. 简介 上一篇文章分析了集群容错的第一部分 – 服务目录 Directory.服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由.上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析.首先,先来介绍一下服务目录是什么.服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者.Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter.脚本路由 ScriptRo

Dubbo之旅--集群容错和负载均衡

当我们的系统中用到Dubbo的集群环境,因为各种原因在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试. Dubbo的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题,因为依赖的第三方项目出现异常,导致dubbo调用超时,此时使用的是默认的集群容错方式,而配置的reties='3',这样前段系统连续掉用了三次服务,结果可想而知. 先说一下各节点关系: 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地

Dubbo点滴之集群容错

首先看来自官方文档 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息. Directory代表多个Invoker,可以把它看成List<Invoker>,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更. Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个. Router负责从多个Invoker中按路

Dubbo 源码分析 - 集群容错之 LoadBalance

1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载.在为高负载的服务器分流的同时,还可以避免资源浪费,一举两得.负载均衡可分为软件负载均衡和硬件负载均衡.在我们日常开发中,一般很难接触到硬件负载均衡.但软件负载均衡还是能够接触到一些的,比如 Nginx.在 Dubbo 中,也有负载均衡的概念和相应的实现

Dubbo服务集群容错

Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务,比如,在实时性要求很高的应用场景下,可能希望来自消费方(Consumer)的调用响应时间最短,只需要选择Dubbo的Forking Cluster模式配置,就可以对一个调用请求并行发送到多台对等的提供方

Dubbo 系列(07-3)集群容错 - 负载均衡

目录 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 负载均衡算法 1.2 继承体系 2. 源码分析 2.1 AbstractLoadBalance 2.2 RandomLoadBalance 2.3 LeastActiveLoadBalance 2.4 ConsistentHashLoadBalance Dubbo 系列(07-3)集群容错 - 负载均衡 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 相关