Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d74045c

Browse filesBrowse files
committed
[A] 添加《Dubbo的URL》
1 parent 8526a89 commit d74045c
Copy full SHA for d74045c

File tree

Expand file treeCollapse file tree

2 files changed

+91
-2
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

2 files changed

+91
-2
lines changed
Open diff view settings
Collapse file

‎note/Dubbo/Dubbo底层源码学习(一)—— Dubbo的URL.md‎

Copy file name to clipboardExpand all lines: note/Dubbo/Dubbo底层源码学习(一)—— Dubbo的URL.md
+91-2Lines changed: 91 additions & 2 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Dubbo 中任意的一个实现都可以抽象为一个 URL,Dubbo 使用 URL
3030
dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=32508&release=&side=provider&timestamp=1593253404714dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=32508&release=&side=provider&timestamp=1593253404714
3131
```
3232

33-
### 2. Dubbo的URL源码
33+
### 2. Dubbo中的URL
3434

3535
先看下Dubbo中org.apache.dubbo.common包下的URL类源码:
3636

@@ -64,6 +64,95 @@ class URL implements Serializable {
6464

6565
可以看到URL中定义了协议、用户名、密码、host、端口等信息,和上述讲解的一致。
6666

67+
看下在Dubbo中典型的URL。
68+
69+
```
70+
dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000
71+
描述一个 dubbo 协议的服务
72+
73+
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&timestamp=1545721981946
74+
描述一个 zookeeper 注册中心
75+
76+
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&timestamp=1545721827784
77+
描述一个消费者
78+
79+
```
80+
81+
可以说,任意的一个领域中的一个实现都可以认为是一类 URL,dubbo 使用 URL 来统一描述了元数据,配置信息,贯穿在整个框架之中。
82+
83+
### 3. Dubbo中URL是如何生成的呢?
84+
85+
一个URL对象是如何在Dubbo中生成的呢?它的协议、参数等都是如何生成的?这可以概括为URL的生命周期是怎样的。
86+
87+
这里可以概括为三点:
88+
89+
1. 解析服务
90+
2. 暴露服务
91+
3. 引用服务
92+
93+
> 解析服务
94+
95+
![DubboNamespaceHandler](https://github.com/coderbruis/JavaSourceCodeLearning/tree/master/note/images/Dubbo/dubbo01.png)
96+
97+
在Dubbo的jar包中的META-INF/spring.handlers配置,配置了DubboNamespaceHandler处理类,在遇到dubbo命名空间时,会进行解析。
98+
99+
可以看到DubboNamespaceHandler处理类中,init方法注册了很多DubboBeanDefinitionParser对象,该对象的parse方法就是对所有的Dubbo标签都进行解析,
100+
将新建的bean注册到spring中,并解析xml中的属性,并添加到该bean中。
101+
102+
(DubboNamespaceHandler的parse主要步骤分为:1)初始化RootBeanDefinition;2)获取BeanId;3)将获取到的Bean注册到Spring中;4)将xml中配置的信息放到beandefinition的ProvertyValues中;)
103+
104+
接着,在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。
105+
106+
然后将 URL 传给协议扩展点,基于扩展点自适应机制,根据 URL 的协议头,进行不同协议的服务暴露或引用。
107+
108+
109+
> 暴露服务
110+
111+
1. 只暴露服务端口:
112+
113+
在没有注册中心,直接暴露提供者的情况下,ServiceConfig 解析出的 URL 的格式为:dubbo://service-host/com.foo.FooService?version=1.0.0。
114+
115+
基于扩展点自适应机制,通过 URL 的 dubbo:// 协议头识别,直接调用 DubboProtocol的 export() 方法,打开服务端口。
116+
117+
2. 向注册中心暴露服务:
118+
119+
在有注册中心,需要注册提供者地址的情况下,ServiceConfig 解析出的 URL 的格式为: registry://registry-host/org.apache.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0"),
120+
121+
基于扩展点自适应机制,通过 URL 的 registry:// 协议头识别,就会调用 RegistryProtocol 的 export() 方法,将 export 参数中的提供者 URL,先注册到注册中心。
122+
123+
再重新传给 Protocol 扩展点进行暴露: dubbo://service-host/com.foo.FooService?version=1.0.0,然后基于扩展点自适应机制,通过提供者 URL 的 dubbo:// 协议头识别,就会调用 DubboProtocol 的 export() 方法,打开服务端口。
124+
125+
3. ServiceConfig的doExportUrlsFor1Protocol方法
126+
127+
在该方法中,创建出URL,然后将URL传递给协议扩展点,基于扩展点自适应机制进行服务暴露。通俗点说就是创建出URL后,通过DubboProtocol来暴露服务。
128+
129+
ServiceConfig这个类非常复杂,后面专门拿一篇来讲解。
130+
131+
> 引用服务
132+
133+
1. 直连引用服务:
134+
135+
在没有注册中心,直连提供者的情况下,ReferenceConfig 解析出的 URL 的格式为:dubbo://service-host/com.foo.FooService?version=1.0.0。
136+
137+
基于扩展点自适应机制,通过 URL 的 dubbo:// 协议头识别,直接调用 DubboProtocol 的 refer() 方法,返回提供者引用。
138+
139+
2. 从注册中心发现引用服务:
140+
141+
在有注册中心,通过注册中心发现提供者地址的情况下,ReferenceConfig 解析出的 URL 的格式为:registry://registry-host/org.apache.dubbo.registry.RegistryService?refer=URL.encode("consumer://consumer-host/com.foo.FooService?version=1.0.0")。
142+
143+
基于扩展点自适应机制,通过 URL 的 registry:// 协议头识别,就会调用 RegistryProtocol 的 refer() 方法,基于 refer 参数中的条件,查询提供者 URL,如: dubbo://service-host/com.foo.FooService?version=1.0.0。
144+
145+
基于扩展点自适应机制,通过提供者 URL 的 dubbo:// 协议头识别,就会调用 DubboProtocol 的 refer() 方法,得到提供者引用。
146+
147+
然后 RegistryProtocol 将多个提供者引用,通过 Cluster 扩展点,伪装成单个提供者引用返回。
148+
149+
### 4. Dubbo中使用的URL
150+
151+
1. Dubbo在SPI中的应用
152+
153+
2. Dubbo中的服务暴露
154+
155+
3. Dubbo中的服务引用
156+
67157
## 参考
68158

69-
- [拉钩教育——Dubbo源码解析](https://kaiwu.lagou.com/course/courseInfo.htm?courseId=393#/detail/pc?id=4258)
Collapse file

‎note/images/Dubbo/dubbo01.png‎

Copy file name to clipboard
49 KB
  • Display the source diff
  • Display the rich diff
Loading

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.