diff --git a/docs/dubbo-sourcecode-v1/01&02.Dubbo源码系列V1-Dubbo第一二节-基本应用与高级应用.md b/docs/dubbo-sourcecode-v1/01&02.Dubbo源码系列V1-Dubbo第一二节-基本应用与高级应用.md index 1e0bcb7..0f11cf5 100644 --- a/docs/dubbo-sourcecode-v1/01&02.Dubbo源码系列V1-Dubbo第一二节-基本应用与高级应用.md +++ b/docs/dubbo-sourcecode-v1/01&02.Dubbo源码系列V1-Dubbo第一二节-基本应用与高级应用.md @@ -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框架介绍 +### 手写代码地址 + +手写模拟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) + + ### 什么是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 + + ### 异步调用 @@ -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,登录进去之后就这样的 + 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 diff --git a/docs/dubbo-sourcecode-v1/03.Dubbo源码系列V1-Dubbo第三节-可扩展机制SPI源码解析.md b/docs/dubbo-sourcecode-v1/03.Dubbo源码系列V1-Dubbo第三节-可扩展机制SPI源码解析.md index 8a91313..b43b596 100644 --- a/docs/dubbo-sourcecode-v1/03.Dubbo源码系列V1-Dubbo第三节-可扩展机制SPI源码解析.md +++ b/docs/dubbo-sourcecode-v1/03.Dubbo源码系列V1-Dubbo第三节-可扩展机制SPI源码解析.md @@ -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 架构图 + + + ### ExtensionLoader源码 @@ -400,6 +406,8 @@ System.out.println(http); 后续,在A接口的代理对象被真正用到时,才会结合URL信息找到真正的A接口对应的扩展点实例进行调用。 + + #### 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了 + ```java public class DubboIOCTest { @@ -1044,7 +1052,7 @@ dubbo中也实现了一套非常简单的AOP,就是利用Wrapper,如果一 ``` - + ### 自适应扩展点补充 @@ -1067,7 +1075,7 @@ Protocol protocol = extensionLoader.getAdaptiveExtension(); -再看个例子,Protocol接口的Adaptive类的代理: +再看个例子,Protocol接口的Adaptive类代理: ```java package org.apache.dubbo.rpc; @@ -1130,9 +1138,9 @@ 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);得到一个扩展点实例,然后调用该实例对应的方法。 + ### Activate扩展点 diff --git a/docs/dubbo-sourcecode-v1/04.Dubbo源码系列V1-Dubbo第四节-Spring与Dubbo整合原理与源码分析.md b/docs/dubbo-sourcecode-v1/04.Dubbo源码系列V1-Dubbo第四节-Spring与Dubbo整合原理与源码分析.md index c34d278..8a88f59 100644 --- a/docs/dubbo-sourcecode-v1/04.Dubbo源码系列V1-Dubbo第四节-Spring与Dubbo整合原理与源码分析.md +++ b/docs/dubbo-sourcecode-v1/04.Dubbo源码系列V1-Dubbo第四节-Spring与Dubbo整合原理与源码分析.md @@ -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笔记》 + + + +### 整体架构和流程 + + #### 处理@Service @@ -170,10 +177,11 @@ public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRe #### 流程 + - + Spring启动时,会调用DubboConfigConfigurationRegistrar的registerBeanDefinitions方法,该方法是利用Spring中的AnnotatedBeanDefinitionReader来读取: @@ -856,10 +864,11 @@ DubboConfigConfigurationRegistrar的作用是向Spring容器中注册两个Bean: > 主要就是处理@Service注解 + - + ServiceAnnotationBeanPostProcessor是一个BeanDefinitionRegistryPostProcessor,是用来注册BeanDefinition的。这个类的名字起的不太好。 @@ -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注解 + ##### 总结 diff --git a/docs/dubbo-sourcecode-v1/05.Dubbo源码系列V1-Dubbo第五节-服务导出源码解析.md b/docs/dubbo-sourcecode-v1/05.Dubbo源码系列V1-Dubbo第五节-服务导出源码解析.md index ad652f9..3041444 100644 --- a/docs/dubbo-sourcecode-v1/05.Dubbo源码系列V1-Dubbo第五节-服务导出源码解析.md +++ b/docs/dubbo-sourcecode-v1/05.Dubbo源码系列V1-Dubbo第五节-服务导出源码解析.md @@ -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 > 服务导出就是服务注册的意思 - + - + ### 服务概念的演化 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链路: + + @@ -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节点的内容 + > 所以在一个服务进行导出时,需要在服务提供者端给当前服务生成一个对应的监听器实例,这个监听器实例为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架构 + + + 一个服务导出成功后,会生成对应的Exporter: @@ -1665,6 +1678,8 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲 ### 服务端Invoker架构 + + 1. ProtocolFilterWrapper$CallbackRegistrationInvoker:会去调用下层Invoker,下层Invoker执行完了之后,会遍历过滤器,查看是否有过滤器实现了ListenableFilter接口,如果有,则回调对应的onResponse方法,比如TimeoutFilter,当调用完下层Invoker之后,就会计算服务的执行时间 @@ -1674,3 +1689,9 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲 5. AbstractProxyInvoker:服务接口的代理类,绑定了对应的实现类,执行时会利用反射调用服务实现类实例的具体方法,并得到结果 + + + + ### 服务端请求执行流程(后续细讲) + + \ No newline at end of file diff --git a/docs/dubbo-sourcecode-v1/06.Dubbo源码系列V1-Dubbo第六节-服务引入源码解析.md b/docs/dubbo-sourcecode-v1/06.Dubbo源码系列V1-Dubbo第六节-服务引入源码解析.md index 02e2073..b40b8ab 100644 --- a/docs/dubbo-sourcecode-v1/06.Dubbo源码系列V1-Dubbo第六节-服务引入源码解析.md +++ b/docs/dubbo-sourcecode-v1/06.Dubbo源码系列V1-Dubbo第六节-服务引入源码解析.md @@ -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; diff --git a/docs/dubbo-sourcecode-v1/07.Dubbo源码系列V1-Dubbo第七节-服务调用源码解析.md b/docs/dubbo-sourcecode-v1/07.Dubbo源码系列V1-Dubbo第七节-服务调用源码解析.md index f5215f1..4f229b1 100644 --- a/docs/dubbo-sourcecode-v1/07.Dubbo源码系列V1-Dubbo第七节-服务调用源码解析.md +++ b/docs/dubbo-sourcecode-v1/07.Dubbo源码系列V1-Dubbo第七节-服务调用源码解析.md @@ -10,15 +10,43 @@ keywords: Dubbo,rpc 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笔记》 + + + + + + + + + + + + + + + + + +processon链接:[https://www.processon.com/view/link/60110b847d9c08426cf10e49](https://www.processon.com/view/link/60110b847d9c08426cf10e49) + + + + + + + ### 服务导出的Netty启动源码 > 最主要的就是构造一个Handler处理链路