Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议
一、URL简介
URL也就是Uniform Resource Locator,中文叫统一资源定位符。Dubbo中无论是服务消费方,或者服务提供方,或者注册中心。都是通过URL进行定位资源的。所以今天来聊聊Dubbo中的统一URL资源模型是怎么样的。
二、Dubbo中的URL
标准的URL格式如下:
protocol://username:password@host:port/path?key=value&key=value
在Dubbo中URL也是主要由上面的参数组成。
public URL(String protocol, String username, String password, String host, int port, String path, Map<String, String> parameters) {
if ((username == null || username.length() == 0)
&& password != null && password.length() > 0) {
throw new IllegalArgumentException("Invalid url, password without username!");
}
this.protocol = protocol;
this.username = username;
this.password = password;
this.host = host;
this.port = (port < 0 ? 0 : port);
this.path = path;
// trim the beginning "/"
while(path != null && path.startsWith("/")) {
path = path.substring(1);
}
if (parameters == null) {
parameters = new HashMap<String, String>();
} else {
parameters = new HashMap<String, String>(parameters);
}
this.parameters = Collections.unmodifiableMap(parameters);
}
可以从上面源码看出:
- protocol:一般是 dubbo 中的各种协议 如:dubbo、thrift、http、zk
- username/password:用户名/密码
- host/port:主机IP地址/端口号
- path:接口名称
- parameter:参数键值对
大致样子如下:
dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000
描述一个 dubbo 协议的服务 zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=1214&qos.port=33333×tamp=1545721981946
描述一个 zookeeper 注册中心 consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=33333&side=consumer×tamp=1545721827784
描述一个消费者
三、Dubbo中有关URL的服务
1、解析服务
- Spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler。这个类也是Dubbo基于spring扩展点编写的解析xml文件的类。
- 解析的xml标签使用DubboBeanDefinitionParser将其转化为bean对象。
- 服务提供方在ServiceConfig.export()初始化时将bean对象转化为URL格式,所有Bean属性转换成URL参数。这时候的URL就会传给协议扩展点。根据URL中protocol的值通过扩展点自适应机制进行不同协议的服务暴露或引用。
- 而服务消费方则是ReferenceConfig.export()方法。
2、直接暴露服务端口
- 在没有注册中心时,ServiceConfig解析出的URL格式为:dubbo://service-host/com.foo.FooService?version=1.0.0
- 基于扩展点自适应机制。通过URL的dubbo://协议头识别,这时候就调用DubboProtocol中的export方法进行暴露服务端口
3、向注册中心暴露服务端口
- 有注册中心时。ServiceConfig解析出的URL格式就类似:registry://registry-host/org.apache.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")
- 基于扩展点自适应机制,识别到URL以registry://开头,就会调用RegistryProtocol中的export方法先将该URL注册到注册中心里
- 再传给Protocol扩展点进行暴露,这时候就只剩下dubbo://service-host/com.foo.FooService?version=1.0.0。同样的基于dubbo://协议头识别,通过DubboProtocol的export方法打开服务端口
4、直接引用服务
- 在没有注册中心,ReferenceConfig解析出的URL格式就为dubbo://service-host/com.foo.FooService?version=1.0.0
- 基于扩展点自适应机制,通过 URL 的dubbo://协议头识别,直接调用DubboProtocol的refer方法,返回提供者引用
5、从注册中心引用服务
- 有注册中心时,ReferenceCofig解析出来的URL格式为:registry://registry-host/org.apache.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")
- 同样先识别URL的协议头,调用RegistryProtocol中的refer方法
- 通过refer参数中的条件查询到提供者的URL。如dubbo://service-host/com.foo.FooService?version=1.0.0。此时就会调用DubboProtocol中的refer方法得到提供者引用
- 最后若是存在集群Cluster扩展点,需要伪装成单个提供者引用返回
四、Dubbo协议
1、协议简介
聊完了Dubbo中的URL模型就来聊聊Dubbo中的协议。协议是双方确定的交流语义,协议在双方传输数据中起到的了交换作用,没有协议就无法完成数据交换。在dubbo中就是Codec2
@SPI
public interface Codec2 { @Adaptive({Constants.CODEC_KEY})
void encode(Channel channel, ChannelBuffer buffer, Object message) throws IOException; @Adaptive({Constants.CODEC_KEY})
Object decode(Channel channel, ChannelBuffer buffer) throws IOException; enum DecodeResult {
NEED_MORE_INPUT, SKIP_SOME_INPUT
} }
encode是将通信对象编码到ByteBufferWrapper,decode是将从网络上读取的ChannelBuffer解码为Object。
2、协议图解

具体的解释如下:
- Magic High&Magic Low(16bits):标识协议的版本号,Dubbo协议:0xdabb
- Req/Res(1bit):1代表请求,0代表响应
- 2Way(1bit)仅在Req/Res为1时才有用(也就是请求),标识是否期望从服务器返回值。如果需要则为1.
- Event(1bit)标识是否是事件消息。比如:如果是心跳时间则设置为1
- Serialization ID(5bits):标识序列化类型。
- 20:OK,响应正确
- 30:CLIENT_TIMEOUT,客户端连接超时
- 31:SERVER_TIMEOUT,服务端连接超时
- 40:BAD_REQUEST,错误请求
- 50:BAD_RESPONSE,错误响应
- 60:SERVICE_NOT_FOUND,服务未找到
- 70:SERVICE_ERROR,服务出错
- 80:SERVER_ERROR,服务端出错
- 90:CLIENT_ERROR,客户端出错
- 100:SERVER_THREADPOOL_EXHAUSTED_ERROR,服务端线程池已满,无法创建新线程
- Request ID(64bits):标识唯一请求,long类型
- Data Length(32bits):序列化后的内容长度(可变的),int类型。这也是为什么实体类需要实现序列化接口。因为Dubbo协议底层是传输序列化后的内容
- Variable Part:被特定的序列化类型序列化后,每个部分都是一个byte[]或byte
- 如果是请求包,则每个部分依次为:Dubbo Version、Service name、Service version、Method name、Method Parameter types、Method arguments、Attachments
- 如果是响应包,则每个部分依次为:返回值类型(0表示异常,1是正常响应,2是返回空值)、返回值。
Status(8bits):仅在Req/Res为0时才有用(即响应)。主要用于标识响应状态
五、总结
到这里就稍微解释了一下Dubbo内部的URL以及Dubbo的协议字段。可以说这两个对我们了解Dubbo起到了很大的作用。
Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议的更多相关文章
- URL统一资源定位符的组成
URL:Uniform Resource Locator统一资源定位符 用于定位网络上我们需要访问的资源 组成:协议名称+域名+路径+资源的名称.如:https://img13.360img.com/ ...
- URL统一资源定位符
URI 是统一资源标识符 URL 是统一资源定位符 ===================================================== 参考链接: 前端学HTTP之URL:ht ...
- java中的URL InetAddress类
/* * InetAddress类: * 用于标识网络上的硬件资源,表示互联网协议(ip)地址,是java对ip地址的封装. * 其实例对象包含以数字形式保存的IP地址,主机名. * InetAddr ...
- HTML(六)框架,颜色,脚本,字符实体,统一资源定位器
HTML 框架 HTML框架 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面 Iframe移除边框 使用iframe来显示目标链接页面 RUNOOB.COM HTML 颜色 rgb(255, ...
- 第二章、URL与资源
1 URL统一资源定位符 URL 是浏览器寻找信息时所需的资源位置.通过 URL,人类和应用程序才能找到.使用并共享因特网上大量的数据资源.URL是作为URI的一个子集,URI是一类更通用的资源标识符 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 统一资源定位器(Uniform Resource Locators)
URL 是一个网页地址. URL可以由字母组成,如"runoob.com",或互联网协议(IP)地址: 192.68.20.50.大多数人进入网站使用网站域名来访问,因为 名字比数 ...
- HTML 统一资源定位器(Uniform Resource Locators)
HTML 统一资源定位器(Uniform Resource Locators) URL 是一个网页地址.高佣联盟 www.cgewang.com URL可以由字母组成,如"runoob.co ...
- .NET设计篇08-线程统一取消模型和跨线程访问UI
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...
- Dubbo在开发中的一些常用配置
介绍Dubbo在开发中的一些常用配置,文中内容主要参考dubbo文档配置和示例两节,详细可移步访问 传送站 1. 属性配置方法及加载顺序 属性常用配置方法主要有三种: 第一种是通过启动时在虚拟机参数 ...
随机推荐
- 【一起学源码-微服务】Ribbon 源码四:进一步探究Ribbon的IRule和IPing
前言 前情回顾 上一讲深入的讲解了Ribbon的初始化过程及Ribbon与Eureka的整合代码,与Eureka整合的类就是DiscoveryEnableNIWSServerList,同时在Dynam ...
- Python for Data Analysis 学习心得(三) - 文件读写和数据预处理
一.Pandas文件读写 pandas很核心的一个功能就是数据读取.导入,pandas支援大部分主流的数据储存格式,并在导入的时候可以做筛选.预处理.在读取数据时的选项有超过50个参数,可见panda ...
- nginx介绍及相关实验
一.nginx介绍 1.nginx简介 Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP 服务.Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 R ...
- ASP.Net Core 3.0 中使用JWT认证
JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包 ...
- OpenJ_Bailian 4103 踩方格(搜索 动态规划 )
题目传送门OpenJ_Bailian 4103 描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立 ...
- springmvc接收json数据的常见方式
经常使用Ajax异步请求来进行数据传输,传的数据是json数据,json数据又有对象,数组.所有总结下springmvc获取前端传来的json数据方式:1.以RequestParam接收前端传来的是j ...
- 使用WebUploader上传HTML文件并读取文件
需求: 前端需要上传HTML文件并识别里面有多少个特殊标签并录入到数据库. 思路: 使用WebUploader上传文件,然后使用FileReader接口和DOMParser识别HTML中的特殊标签 资 ...
- echart两组柱状图对比时,不同类型根据各类型的最大值为基准进行展示
项目中遇到的问题:因为数据太小,箭头的地方展示不出来,这时的两组对比数据是根据一个最大值为基准进行渲染的.但我们想实现不同类型的对比根据不同的基准值渲染. 理想效果如下图: 实现代码: option ...
- Java 成员变量与局部变量
成员变量与局部变量的区别 什么是局部变量.什么是成员变量: 局部变量:在方法内部的变量 形参:在方法签名中定义的变量. 方法局部变量:在方法内部定义的变量. 代码块局部变量:在代码块内定义的变量. 成 ...
- 【转】程序员"青春饭"问题之我见
1. 问题描述问题1: 什么是程序员?在本文中程序员的定义为: 拥有编程技能,在IT.互联网公司打工的IT从业人员.程序员与很多行业最大的不同是该行业的形成时间短:1954年第一台计算机才诞生,而中医 ...