小更新,可忽略

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,18 +13,24 @@ abbrlink: d3c530c4
date: 2021-09-11 15:21:58
---
# Dubbo源码
## 第一节: Dubbo框架介绍与手写模拟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笔记》
### 手写代码地址
手写模拟Dubbo代码地址[https://gitee.com/archguide/rpc](https://gitee.com/archguide/rpc)
git clone地址[https://gitee.com/archguide/rpc.git](https://gitee.com/archguide/rpc.git)
## 第一节: Dubbo框架介绍
### 什么是RPC
@@ -119,10 +125,16 @@ Dubbo网关参考[https://github.com/apache/dubbo-proxy](https://github.com/a
## 第二节: 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笔记》
官网:[http://dubbo.apache.org/zh/docs/v2.7/user/](http://dubbo.apache.org/zh/docs/v2.7/user/)
demo项目地址[https://gitee.com/archguide/dubbo-tuling-demo](https://gitee.com/archguide/dubbo-tuling-demo)
管理台github地址[https://github.com/apache/dubbo-admin](https://github.com/apache/dubbo-admin)
@@ -134,7 +146,7 @@ Dubbo提供了很多功能这里我们只介绍几种比较重要的其他
### 项目目录
```java
dubbo-youthlql-demo
dubbo-tuling-demo
consumer/
| consumer.iml
| pom.xml
@@ -142,7 +154,7 @@ dubbo-youthlql-demo
| main/
| | java/
| | | com/
| | | youthlql/
| | | tuling/
| | | consumer/
| | | | AsyncDubboConsumerDemo.java
| | | | CallbackDubboConsumerDemo.java
@@ -161,7 +173,7 @@ dubbo-youthlql-demo
| | application.yml
| test/
| java/
dubbo-youthlql-demo.iml
dubbo-tuling-demo.iml
interface/
| interface.iml
| pom.xml
@@ -169,7 +181,7 @@ dubbo-youthlql-demo
| main/
| | java/
| | | com/
| | | youthlql/
| | | tuling/
| | | DemoService.java
| | | DemoServiceListener.java
| | | DemoServiceMock.java
@@ -185,7 +197,7 @@ dubbo-youthlql-demo
main/
| java/
| | com/
| | youthlql/
| | tuling/
| | DubboProviderDemo.java
| | provider/
| | | service/
@@ -342,13 +354,13 @@ private DemoService demoService;
> consumer项目
```java
package com.youthlql.consumer;
package com.tuling.consumer;
@EnableAutoConfiguration
public class StubDubboConsumerDemo {
// @Reference(version = "timeout", timeout = 1000, stub = "com.youthlql.DemoServiceStub")
// @Reference(version = "timeout", timeout = 1000, stub = "com.tuling.DemoServiceStub")
@Reference(version = "timeout", timeout = 1000, stub = "true")
private DemoService demoService;
@@ -364,14 +376,14 @@ public class StubDubboConsumerDemo {
```
1. stub=true的是个默认配置
2. 默认用接口的全限定类名+Stub去调用也就是`com.youthlql.DemoServiceStub`
2. 默认用接口的全限定类名+Stub去调用也就是`com.tuling.DemoServiceStub`
3. 比如这个例子,当消费者去调用`demoService.sayHello("周瑜")`时,会首先调用`interface项目`下的`DemoServiceStub`的`sayHello`方法。如果调用失败就返回`"容错数据"`
4. 如果找不到`com.youthlql.DemoServiceStub`就抛异常
5. 注意`DemoServiceStub`这个类不一定需要写在interface项目里的写在哪里都行只要能通过pom.xml的maven依赖找到`com.youthlql.DemoServiceStub`你这个路径就行
4. 如果找不到`com.tuling.DemoServiceStub`就抛异常
5. 注意`DemoServiceStub`这个类不一定需要写在interface项目里的写在哪里都行只要能通过pom.xml的maven依赖找到`com.tuling.DemoServiceStub`你这个路径就行
6. 也可以stub直接指定全类名这样就可以每一个消费者都提供一个本地存根
```java
@Reference(version = "timeout", timeout = 1000, stub = "com.youthlql.DemoServiceStub")
@Reference(version = "timeout", timeout = 1000, stub = "com.tuling.DemoServiceStub")
private DemoService demoService;
```
@@ -380,7 +392,7 @@ private DemoService demoService;
> interface项目
```java
package com.youthlql;
package com.tuling;
public class DemoServiceStub implements DemoService {
@@ -438,7 +450,7 @@ public class DemoServiceStub implements DemoService {
> interface项目
```java
package com.youthlql;
package com.tuling;
import java.util.concurrent.CompletableFuture;
@@ -461,7 +473,7 @@ public interface DemoService {
> consumer项目
```java
package com.youthlql.consumer;
package com.tuling.consumer;
@EnableAutoConfiguration
public class CallbackDubboConsumerDemo {
@@ -487,7 +499,7 @@ public class CallbackDubboConsumerDemo {
```java
package com.youthlql.consumer;
package com.tuling.consumer;
public class DemoServiceListenerImpl implements DemoServiceListener {
@@ -502,7 +514,7 @@ public class DemoServiceListenerImpl implements DemoServiceListener {
```java
package com.youthlql;
package com.tuling;
public interface DemoServiceListener {
void changed(String msg);
@@ -512,7 +524,7 @@ public interface DemoServiceListener {
> provider项目
```java
package com.youthlql.provider.service;
package com.tuling.provider.service;
/**
@@ -604,6 +616,8 @@ System.out.println(demoService.sayHello("周瑜", "d3", new DemoServiceListenerI
<img src="https://npm.elemecdn.com/youthlql@1.0.2/rpc/dubbo/v1/0002.png"/>
### 异步调用
@@ -620,7 +634,7 @@ System.out.println(demoService.sayHello("周瑜", "d3", new DemoServiceListenerI
```java
package com.youthlql;
package com.tuling;
import java.util.concurrent.CompletableFuture;
@@ -643,7 +657,7 @@ public interface DemoService {
```java
package com.youthlql.provider.service;
package com.tuling.provider.service;
@Service(version = "async")
@@ -670,7 +684,7 @@ public class AsyncDemoService implements DemoService {
```java
package com.youthlql.consumer;
package com.tuling.consumer;
@EnableAutoConfiguration
public class AsyncDubboConsumerDemo {
@@ -715,14 +729,14 @@ public class AsyncDubboConsumerDemo {
2. GenericService是dubbo提供的
```java
package com.youthlql.consumer;
package com.tuling.consumer;
@EnableAutoConfiguration
public class GenericDubboConsumerDemo {
@Reference(id = "demoService", version = "default", interfaceName = "com.youthlql.DemoService", generic = true)
@Reference(id = "demoService", version = "default", interfaceName = "com.tuling.DemoService", generic = true)
private GenericService genericService;
public static void main(String[] args) throws IOException {
@@ -751,14 +765,14 @@ public class GenericDubboConsumerDemo {
实现了GenericService接口的就是泛化服务
```java
package com.youthlql.provider.service;
package com.tuling.provider.service;
import com.youthlql.DemoService;
import com.tuling.DemoService;
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.rpc.service.GenericException;
import org.apache.dubbo.rpc.service.GenericService;
@Service(interfaceName = "com.youthlql.DemoService", version = "generic")
@Service(interfaceName = "com.tuling.DemoService", version = "generic")
public class GenericDemoService implements GenericService {
/**
@@ -779,7 +793,7 @@ public class GenericDemoService implements GenericService {
```
意思就是实际暴露出去的服务依然是`com.youthlql.DemoService`并且版本是generic。只是消费者调用的时候最终执行的逻辑是这个`$invoke`方法。就是服务消费者你该怎么用还是怎么用只是服务提供者后面真正执行逻辑不再是实现demoservice接口实现sayhello方法了。而是GenericService的$invoke方法
意思就是实际暴露出去的服务依然是`com.tuling.DemoService`并且版本是generic。只是消费者调用的时候最终执行的逻辑是这个`$invoke`方法。就是服务消费者你该怎么用还是怎么用只是服务提供者后面真正执行逻辑不再是实现demoservice接口实现sayhello方法了。而是GenericService的$invoke方法
### Dubbo中的REST
@@ -807,7 +821,7 @@ spring.application.name=dubbo-provider-demo
server.port=8081
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.youthlql.provider.service
dubbo.scan.base-packages=com.tuling.provider.service
dubbo.application.name=${spring.application.name}
@@ -843,7 +857,7 @@ dubbo.protocols.p2.host=0.0.0.0
```java
package com.youthlql.provider.service;
package com.tuling.provider.service;
@Service(version = "rest", protocol = "p2")
@@ -867,9 +881,9 @@ public class RestDemoService implements DemoService {
```java
package com.youthlql.provider.service;
package com.tuling.provider.service;
import com.youthlql.DemoService;
import com.tuling.DemoService;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.rpc.RpcContext;
@@ -901,9 +915,9 @@ public class AsyncDemoService implements DemoService {
github地址[https://github.com/apache/dubbo-admin](https://github.com/apache/dubbo-admin)
用户名和密码默认都是root
用户名和密码默认都是root,登录进去之后就这样的
<img src="https://npm.elemecdn.com/youthlql@1.0.2/rpc/dubbo/v1/0001.png"/>
1. Dubbo分为注册中心和配置中心如果spring文件里没有明确写配置中心配置中心默认就用注册中心。
@@ -979,7 +993,7 @@ conditions:
```java
package com.youthlql.controller;
package com.tuling.controller;
import org.apache.dubbo.rpc.Constants;
import org.apache.dubbo.rpc.RpcContext;
@@ -1028,6 +1042,8 @@ public class ConsumerInterceptor implements HandlerInterceptor {
Zookeeper可视化客户端ZooInspector
## Dubbo与其他微服务组件整合
sentinel https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-dubbo

View File

@@ -13,16 +13,18 @@ abbrlink: dbcfef47
date: 2021-09-12 15:21:58
---
## 第三节: Dubbo的可扩展机制SPI源码解析
dubbo源码项目地址[https://gitee.com/archguide/dubbovip](https://gitee.com/archguide/dubbovip)
### 笔记更新地址:
[https://www.yuque.com/books/share/f2394ae6-381b-4f44-819e-c231b39c1497](https://www.yuque.com/books/share/f2394ae6-381b-4f44-819e-c231b39c1497?#)密码kyys 《Dubbo笔记》
### SPI的概念
https://www.cnblogs.com/happyframework/archive/2013/09/17/3325560.html
@@ -44,24 +46,24 @@ spi-demo
| | main/
| | | java/
| | | | com/
| | | | youthlql/
| | | | atguigu/
| | | | mysql/
| | | | MySQLSaveService.java
| | | resources/
| | | META-INF/
| | | services/
| | | com.youthlql.data.DataSaveService
| | | com.atguigu.data.DataSaveService
| | test/
| | java/
| target/
| classes/
| | com/
| | | youthlql/
| | | atguigu/
| | | mysql/
| | | MySQLSaveService.class
| | META-INF/
| | services/
| | com.youthlql.data.DataSaveService
| | com.atguigu.data.DataSaveService
| generated-sources/
| annotations/
api-db-impl-redis/
@@ -71,24 +73,24 @@ spi-demo
| | main/
| | | java/
| | | | com/
| | | | youthlql/
| | | | atguigu/
| | | | redis/
| | | | RedisSaveService.java
| | | resources/
| | | META-INF/
| | | services/
| | | com.youthlql.data.DataSaveService
| | | com.atguigu.data.DataSaveService
| | test/
| | java/
| target/
| classes/
| | com/
| | | youthlql/
| | | atguigu/
| | | redis/
| | | RedisSaveService.class
| | META-INF/
| | services/
| | com.youthlql.data.DataSaveService
| | com.atguigu.data.DataSaveService
| generated-sources/
| annotations/
api-db-interface/
@@ -98,7 +100,7 @@ spi-demo
| | main/
| | | java/
| | | | com/
| | | | youthlql/
| | | | atguigu/
| | | | data/
| | | | DataSaveService.java
| | | resources/
@@ -107,7 +109,7 @@ spi-demo
| target/
| classes/
| | com/
| | youthlql/
| | atguigu/
| | data/
| | DataSaveService.class
| generated-sources/
@@ -119,7 +121,7 @@ spi-demo
| | main/
| | | java/
| | | | com/
| | | | youthlql/
| | | | atguigu/
| | | | redis/
| | | | MainTest.java
| | | resources/
@@ -128,7 +130,7 @@ spi-demo
| target/
| classes/
| | com/
| | youthlql/
| | atguigu/
| | redis/
| | MainTest.class
| generated-sources/
@@ -143,7 +145,7 @@ spi-demo
#### MainTest
```java
import com.youthlql.data.DataSaveService;
import com.atguigu.data.DataSaveService;
import java.util.ServiceLoader;
@@ -222,18 +224,18 @@ public class RedisSaveService implements DataSaveService {
#### SPI文件示例
api-db-impl-redis\src\main\resources\META-INF\services\com.youthlql.data.DataSaveService
api-db-impl-redis\src\main\resources\META-INF\services\com.atguigu.data.DataSaveService
```txt
com.youthlql.redis.RedisSaveService
com.atguigu.redis.RedisSaveService
```
api-db-impl-mysql\src\main\resources\META-INF\services\com.youthlql.data.DataSaveService
api-db-impl-mysql\src\main\resources\META-INF\services\com.atguigu.data.DataSaveService
```txt
com.youthlql.mysql.MySQLSaveService
com.atguigu.mysql.MySQLSaveService
```
你没看错就是这么简单
@@ -253,9 +255,9 @@ com.youthlql.mysql.MySQLSaveService
SPI文件里写了什么,java的`ServiceLoader`都会给你一次性加载完
```java
com.youthlql.RedCar
com.youthlql.BlackCar
com.youthlql,WhiteCar
com.tuling.RedCar
com.tuling.BlackCar
com.tuling,WhiteCar
....
```
@@ -275,8 +277,8 @@ com.youthlql,WhiteCar
spi文件我们可以这样写
```java
red=com.youthlql.RedCar
black=com.youthlql.BlackCar
red=com.tuling.RedCar
black=com.tuling.BlackCar
```
`SpiTest.java`
@@ -354,6 +356,10 @@ System.out.println(http);
### Dubbo SPI 架构图
<img src="https://npm.elemecdn.com/youthlql@1.0.3/rpc/dubbo/v1/03_di_san_jie/Dubbo-SPI架构图.png"/>
### ExtensionLoader源码
@@ -400,6 +406,8 @@ System.out.println(http);
后续在A接口的代理对象被真正用到时才会结合URL信息找到真正的A接口对应的扩展点实例进行调用。
<img src="https://npm.elemecdn.com/youthlql@1.0.3/rpc/dubbo/v1/03_di_san_jie/ExtensionLoader.png"/>
#### getExtension()
@@ -659,9 +667,9 @@ loadResource方法就是完成对文件内容的解析按行进行解析
clazz.getConstructor();
/*
1. 本来应该这样写的 red=com.youthlql.RedCar
2.如果你前面的red这个name没写像这样只写了个全类名com.youthlql.RedCar
3.默认会去com.youthlql.RedCar这个类上找有没有@Extension注解起名了【官方已经标记成废弃了】
1. 本来应该这样写的 red=com.tuling.RedCar
2.如果你前面的red这个name没写像这样只写了个全类名com.tuling.RedCar
3.默认会去com.tuling.RedCar这个类上找有没有@Extension注解起名了【官方已经标记成废弃了】
*/
if (StringUtils.isEmpty(name)) {
name = findAnnotationName(clazz);
@@ -966,9 +974,9 @@ public class SpiExtensionFactory implements ExtensionFactory {
dubbo生成的代理对象代码可以看下面的`自适应扩展点补充`这里应该就知道为什么要用URL了
dubbo生成的代理对象截图这里应该就知道为什么要用URL了
<img src="https://npm.elemecdn.com/youthlql@1.0.3/rpc/dubbo/v1/03_di_san_jie/image-20210904210634167.png"/>
```java
public class DubboIOCTest {
@@ -1044,7 +1052,7 @@ dubbo中也实现了一套非常简单的AOP就是利用Wrapper如果一
```
<img src="https://npm.elemecdn.com/youthlql@1.0.3/rpc/dubbo/v1/03_di_san_jie/createExtension.png"/>
### 自适应扩展点补充
@@ -1067,7 +1075,7 @@ Protocol protocol = extensionLoader.getAdaptiveExtension();
再看个例子Protocol接口的Adaptive类代理:
再看个例子Protocol接口的Adaptive类代理
```java
package org.apache.dubbo.rpc;
@@ -1130,7 +1138,7 @@ public class Protocol$Adaptive implements org.apache.dubbo.rpc.Protocol {
所以可以发现某个接口的Adaptive对象在调用某个方法时是通过该方法中的URL参数或者getURL方法通过调用ExtensionLoader.getExtensionLoader(com.luban.Car.class).getExtension(extName);得到一个扩展点实例,然后调用该实例对应的方法。
所以可以发现某个接口的Adaptive对象在调用某个方法时是通过该方法中的URL参数或者getUrl方法通过调用ExtensionLoader.getExtensionLoader(com.luban.Car.class).getExtension(extName);得到一个扩展点实例,然后调用该实例对应的方法。

View File

@@ -13,12 +13,19 @@ abbrlink: 796f395d
date: 2021-10-06 13:21:58
---
## 第四节: Spring与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笔记》
### 整体架构和流程
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/Spring整合Dubbo架构图.png"/>
#### 处理@Service
@@ -170,6 +177,7 @@ public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRe
#### 流程
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/Spring整合Dubbo只properties文件解析流程.png"/>
@@ -856,6 +864,7 @@ DubboConfigConfigurationRegistrar的作用是向Spring容器中注册两个Bean:
> 主要就是处理@Service注解
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/@Service注解处理流程.png"/>
@@ -909,6 +918,8 @@ ServiceBean表示一个Dubbo服务它有一些参数比如
> 关于RuntimeBeanReference参考[https://www.yuque.com/renyong-jmovm/ufz328/gbwvk7](https://www.yuque.com/renyong-jmovm/ufz328/gbwvk7)。
##### 代码注释
@@ -1220,6 +1231,7 @@ public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistr
> 处理@Reference注解
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/@Reference注解处理流程.png"/>
##### 总结

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,7 +36,7 @@ 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"/>
@@ -41,8 +45,8 @@ date: 2021-10-06 14:11:58
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里
@@ -999,6 +1003,11 @@ date: 2021-10-06 14:11:58
总结一下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"/>

View File

@@ -13,10 +13,16 @@ abbrlink: bda15919
date: 2021-11-08 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笔记》
### 过程
@@ -1360,6 +1366,8 @@ DubboProtocol中并没有refer方法是在它的父类AbstractProtocol中才
### 最复杂情况下的Invoker链
> 这点看不懂可以跳过
```java
@Reference(url = "dubbo://192.168.40.17:20881/org.apache.dubbo.demo.DemoService;registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?registry=zookeeper")
private DemoService demoService;

View File

@@ -10,15 +10,43 @@ keywords: Dubborpc
description: 服务调用源码解析
cover: 'https://npm.elemecdn.com/lql_static@latest/logo/dubbo.png'
abbrlink: 84653c9d
date: 2021-11-09 14:11:58
date: 2021-11-11 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笔记》
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/07_di_qi_jie/服务调用流程图.png"/>
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/07_di_qi_jie/消费端发送请求线程模型.png"/>
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/07_di_qi_jie/服务端_客户端数据接收与处理线程模型.png"/>
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/07_di_qi_jie/Dubbo服务调用整套逻辑.png"/>
processon链接[https://www.processon.com/view/link/60110b847d9c08426cf10e49](https://www.processon.com/view/link/60110b847d9c08426cf10e49)
### 服务导出的Netty启动源码
> 最主要的就是构造一个Handler处理链路