Dubbo源码(六) - 服务路由
前言
本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo
今天,来聊点短的,服务路由Router,本文讲的是路由的调用路径,不讲路由的规则解析。想了解规则解析的可以去官方文档:服务路由
Dubbo的路由,就是根据规则,规定了哪些服务消费者可调用哪些服务提供者。
怎么用
我们可以在服务治理控制台Dubbo-Admin写入路由规则。
安装Dubbo-Admin
我是使用docker方式安装的,命令如下:
docker run -d \
-p 9001:8080 \
-e admin.root.user.name=admin \
-e admin.root.user.password=admin \
-e admin.registry.address='zookeeper://127.0.0.1:2181' \
-e admin.config-center='zookeeper://127.0.0.1:2181' \
-e admin.metadata-report.address='zookeeper://127.0.0.1:2181' \
--name dubbo-admin \
apache/dubbo-admin
-e部分的参数说明,看官方介绍Dubbo Admin配置说明
配置规则
浏览器localhost:9001访问Dubbo-Admin控制台,菜单选择 服务治理→条件路由

点击创建按钮,填写相关参数即可

详细参数请参考官方文档:路由规则用法示例
源码
先来看看类图

Router就是路由接口,其有3个实现类。
Router接口有3个方法:
URL getUrl();
List<Invoker> route(List<Invoker> invokers, URL url, Invocation invocation);
路由的选择方法,筛选出符合条件的invoker
int getPriority();
获取优先级,用于排序
订阅
当在Dubbo-Admin中配置了路由规则,会在注册中心的routes节点创建子节点,这里就包含了路由配置的数据

在上一篇文章讲服务目录的时候,说过RegistryDirectory会订阅providers、consumers、configurators、routers等节点的,这里面就包含了routers
具体的转换逻辑在RegistryDirectory#toRouters方法中
private List<Router> toRouters(List<URL> urls) {
List<Router> routers = new ArrayList<Router>();
if (urls == null || urls.isEmpty()) {
return routers;
}
if (urls != null && !urls.isEmpty()) {
for (URL url : urls) {
if (Constants.EMPTY_PROTOCOL.equals(url.getProtocol())) {
continue;
}
String routerType = url.getParameter(Constants.ROUTER_KEY);
if (routerType != null && routerType.length() > 0) {
url = url.setProtocol(routerType);
}
try {
// 工厂生成route
Router router = routerFactory.getRouter(url);
if (!routers.contains(router))
routers.add(router);
} catch (Throwable t) {
logger.error("convert router url to router error, url: " + url, t);
}
}
}
return routers;
}
routerFactory是自适应拓展类,此处我们设置的是条件路由,所以routerFactory实际上是ConditionRouterFactory
public class ConditionRouterFactory implements RouterFactory {
public static final String NAME = "condition";
@Override
public Router getRouter(URL url) {
return new ConditionRouter(url);
}
}
这个route工厂也很简单,就是创建了一个ConditionRouter,具体的解析逻辑都在其构造方法中。
规则过滤
路由的核心,就是Router接口的route方法,那么route方法在哪里被引用呢
服务目录刷新invoker列表时
当服务目录订阅注册中心信息时,会刷新invoker列表,此时会调用路由

消费者获取invoker时
消费者要向生产者发起调用时,依赖的是invoker,此时invoker的获取,需要经过路由筛选

总结
本文讲了服务路由的数据获取以及调用过程。路由的核心就是筛选invoker
参考资料
Dubbo源码(六) - 服务路由的更多相关文章
- Dubbo源码(五) - 服务目录
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊聊Dubbo的服务目录(Directory).下面是官方文档对服务目录的定义: 服务目 ...
- Dubbo 源码分析 - 服务调用过程
注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...
- Dubbo源码(四) - 服务引用(消费者)
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 上一篇文章,讲了Dubbo的服务导出: Dubbo源码(三) - 服务导出(生产者) 本文,咱们 ...
- dubbo源码之四——服务发布二
dubbo版本:2.5.4 2. 服务提供者暴露一个服务的详细过程 上图是服务提供者暴露服务的主过程: 首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl ...
- Dubbo源码学习--服务是如何引用的
ReferenceBean 跟服务引用一样,Dubbo的reference配置会被转成ReferenceBean类,ReferenceBean实现了InitializingBean接口,直接看afte ...
- Dubbo源码学习--服务是如何发布的
相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 ServiceBean ServiceBean 实现ApplicationListener接口监听Conte ...
- Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)
前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程. 以源码中dubbo-demo模块作为切入口一步步走进Dubbo源码. ...
- Dubbo 源码分析 - 服务引用
1. 简介 在上一篇文章中,我详细的分析了服务导出的原理.本篇文章我们趁热打铁,继续分析服务引用的原理.在 Dubbo 中,我们可以通过两种方式引用远程服务.第一种是使用服务直联的方式引用服务,第二种 ...
- Dubbo 源码分析 - 服务导出
1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...
随机推荐
- vmware 安装的虚拟机没有网络
前提:需要先将 vmware 软件里的所有虚拟机关机 查看以下两个服务是否启动 如果以上两个服务未启动,就全部启动起来,如果某一个在启动时报错,就打开 vmware 软件,执行以下操作 编辑 > ...
- Proxmox 7.2 部署 DoraCloud桌面云,支持vGPU
介绍 本文介绍了使用Proxmox + DoraCloud,将一台图形工作站(配置有Tesla P4显卡)改造成一台桌面云主机.可以满足多个桌面用户同时使用3D应用的需求. 该方案适合于小型工作室.电 ...
- MUI+html5+script 不同页面间转跳(九宫格)
在点击图片/标题需要跳转到详情页面的使用场景中,首先定义图片元素的id为"tyzc",是同一类下的第一个图片 <img src="img/img3.png" ...
- Python 生成图片验证码
验证码图片生成 #!/usr/bin/env python # -*- coding: utf-8 -*- # refer to `https://bitbucket.org/akorn/wheezy ...
- 在linux上开启酸酸乳,未完待续
在服务器调试深度学习环境的时候总需要下载conda的包,一直以来都觉得是因为国内访问慢,于是想在服务器上开 ,或者ssr.由于过去用ssr多一些,于是想了解ssr on linux. 1.首先win1 ...
- 使用pip安装库或执行pip命令时报错解决方案
初次安装pip后执行安装升级一般不会有问题,但是国外的镜像源下载升级由于网速过慢会进行报错,提示需要升级 pip 或者下载速度很慢最后直接报了错如下图: 这个时候只需要修改镜像源即可,建议修改为永久镜 ...
- css设置元素背景透明度的2种方式
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月9日. 设置元素的背景的透明度可以使用2种方式:方式1:opacity属性.方式2:使用rgba值.两种方式有一点差异,opaci ...
- VR技术赋能五大领域,不止高级,更高效!
除了VR游戏.VR影视作品,究竟还有哪些产业领域会应用到VR技术并为生活带来改变呢?今天就帮大家好好梳理一下~ VR赋能交通,不只是高级 最近在网上看到了VR考驾照的新闻,网友都赞叹,现在学车都这么高 ...
- UiPath键盘操作的介绍和使用
一.键盘操作的介绍 模拟用户使用键盘操作的一种行为: 例如使用发送热键(Sendhotkey),输入信息 (Typeinto)的操作 二.键盘操作在UiPath中的使用 1.打开设计器,在设计库中新建 ...
- Linux yum搭建私有仓库
搭建yum仓库需要两种资源: rpm包 rpm包的元数据(repodata) 搭建好仓库后需要使用三种网络协议共享出来 http或https ftp 范例: 使用http协议搭建私有仓库 (本示例使用 ...