mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-04-22 02:53:39 +00:00
小更新,可忽略
This commit is contained in:
@@ -13,12 +13,16 @@ abbrlink: '48141866'
|
||||
date: 2021-10-06 14:11:58
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 第五节: Dubbo服务注册(导出)源码解析
|
||||
|
||||
|
||||
|
||||
### 笔记更新地址:
|
||||
|
||||
[https://www.yuque.com/books/share/f2394ae6-381b-4f44-819e-c231b39c1497](https://www.yuque.com/books/share/f2394ae6-381b-4f44-819e-c231b39c1497?#)(密码:kyys) 《Dubbo笔记》
|
||||
|
||||
|
||||
|
||||
### 服务导出原理概述
|
||||
|
||||
1. 服务导出的入口为ServiceBean中的export()方法,当Spring启动完之后,通过接收Spring的ContextRefreshedEvent事件来触发export()方法的执行。
|
||||
@@ -32,17 +36,17 @@ date: 2021-10-06 14:11:58
|
||||
|
||||
> 服务导出就是服务注册的意思
|
||||
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/服务导出流程图.png"/>
|
||||
|
||||
|
||||
|
||||
|
||||
### 服务概念的演化
|
||||
|
||||
1. DemoService接口表示一个服务,此时的服务表示服务定义
|
||||
2. DemoServiceImpl表示DemoService服务的具体实现,此时的服务表示服务的具体实现
|
||||
3. DemoService+group+version表示一个服务,此时的服务增加了分组和版本概念
|
||||
4. [http://192.168.31.211:80/cn.imlql.DemoService](http://192.168.31.211:80/com.luban.DemoService)表示一个服务,此时的服务增加了机器IP和Port,表示远程机器可以访问这个URL来使用cn.imlql.DemoService这个服务
|
||||
5. [http://192.168.31.211:80/cn.imlql.DemoService](http://192.168.31.211:80/com.luban.DemoService)?timeout=3000&version=1.0.1&application=dubbo-demo-provider-application表示一个服务,此时的服务是拥有参数的,比如超时时间、版本号、所属应用
|
||||
4. [http://192.168.1.112:80/com.tuling.DemoService](http://192.168.1.112:80/com.luban.DemoService)表示一个服务,此时的服务增加了机器IP和Port,表示远程机器可以访问这个URL来使用com.tuling.DemoService这个服务
|
||||
5. [http://192.168.1.112:80/com.tuling.DemoService](http://192.168.1.112:80/com.luban.DemoService)?timeout=3000&version=1.0.1&application=dubbo-demo-provider-application表示一个服务,此时的服务是拥有参数的,比如超时时间、版本号、所属应用
|
||||
|
||||
|
||||
|
||||
@@ -235,7 +239,7 @@ date: 2021-10-06 14:11:58
|
||||
|
||||
|
||||
/**
|
||||
* 1.上节文章我们在启动类上写了这个配置
|
||||
* 1.上节课我们在启动类上写了这个配置
|
||||
* @PropertySource("classpath:/spring/dubbo-provider.properties")
|
||||
* 2.那么Spring启动的时候就会加载里面的配置到一些xxxConfig里面【Spring整合Dubbo的时候讲过】
|
||||
* 3.@Service注解里配置的参数被首先读取到了ServiceBean里
|
||||
@@ -997,6 +1001,11 @@ date: 2021-10-06 14:11:58
|
||||
14. 在NettyServer中,会实现doOpen方法,会调用**new** NettyServerHandler(getUrl(), **this**)构造一个NettyServerHandler,并bind地址
|
||||
15. 至此,DubboProtocol协议的启动Server流程就结束。
|
||||
|
||||
|
||||
|
||||
总结一下DubboProtocol协议的RequestHandler链路:
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/DubboProtocol协议的RequestHandler链路.png"/>
|
||||
|
||||
|
||||
|
||||
@@ -1105,6 +1114,7 @@ date: 2021-10-06 14:11:58
|
||||
1. 应用:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService/dubbo.properties节点的内容
|
||||
2. 全局:/dubbo/config/dubbo/dubbo.properties节点的内容
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/image-20210912020530773.png"/>
|
||||
|
||||
> 所以在一个服务进行导出时,需要在服务提供者端给当前服务生成一个对应的监听器实例,这个监听器实例为OverrideListener,它负责监听对应服务的动态配置变化,并且根据动态配置中心的参数重写服务URL。
|
||||
|
||||
@@ -1630,7 +1640,7 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
||||
2. 服务的IP和PORT,如果指定了就取指定的,没有指定IP就获取服务器上网卡的IP,
|
||||
3. 以及服务的PATH,如果没有指定PATH参数,则取接口名
|
||||
4. 以及服务的参数,参数包括服务的参数,服务中某个方法的参数
|
||||
5. 最终得到的URL类似: dubbo://192.168.1.110:20880/cn.imlql.DemoService?timeout=3000&&sayHello.loadbalance=random
|
||||
5. 最终得到的URL类似: dubbo://192.168.1.110:20880/com.tuling.DemoService?timeout=3000&&sayHello.loadbalance=random
|
||||
|
||||
9. 得到服务的URL之后,会把服务URL作为一个参数添加到registryURL中去,然后把registryURL、服务的接口、当前服务实现类ref生成一个Invoker代理对象,再把这个代理对象和当前ServiceConfig对象包装成一个DelegateProviderMetaDataInvoker对象,DelegateProviderMetaDataInvoker就表示了完整的一个服务
|
||||
10. 接下来就会使用Protocol去export导出服务了,导出之后将得到一个Exporter对象(该Exporter对象,可以理解为主要可以用来卸载(unexport)服务,什么时候会卸载服务?在优雅关闭Dubbo应用的时候)
|
||||
@@ -1653,6 +1663,9 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
||||
|
||||
### Exporter架构
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/Exporter架构.png"/>
|
||||
|
||||
|
||||
|
||||
一个服务导出成功后,会生成对应的Exporter:
|
||||
|
||||
@@ -1665,6 +1678,8 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
||||
|
||||
### 服务端Invoker架构
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/服务端Invoker架构.png"/>
|
||||
|
||||
|
||||
|
||||
1. ProtocolFilterWrapper$CallbackRegistrationInvoker:会去调用下层Invoker,下层Invoker执行完了之后,会遍历过滤器,查看是否有过滤器实现了ListenableFilter接口,如果有,则回调对应的onResponse方法,比如TimeoutFilter,当调用完下层Invoker之后,就会计算服务的执行时间
|
||||
@@ -1674,3 +1689,9 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
||||
5. AbstractProxyInvoker:服务接口的代理类,绑定了对应的实现类,执行时会利用反射调用服务实现类实例的具体方法,并得到结果
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 服务端请求执行流程(后续细讲)
|
||||
|
||||
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/Server端Handler链路.png"/>
|
||||
Reference in New Issue
Block a user