小更新,可忽略

This commit is contained in:
youthlql
2023-01-06 00:10:22 +08:00
parent b966a7719a
commit 9940569171
6 changed files with 188 additions and 95 deletions

View File

@@ -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"/>