From 9940569171810e0f453a191e1a8dcf6f80a9cd28 Mon Sep 17 00:00:00 2001
From: youthlql <1826692270@qq.com>
Date: Fri, 6 Jan 2023 00:10:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E6=9B=B4=E6=96=B0=EF=BC=8C=E5=8F=AF?=
=?UTF-8?q?=E5=BF=BD=E7=95=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...系列V1-Dubbo第一二节-基本应用与高级应用.md | 98 +++++++++++--------
...系列V1-Dubbo第三节-可扩展机制SPI源码解析.md | 82 +++++++++-------
...Dubbo第四节-Spring与Dubbo整合原理与源码分析.md | 20 +++-
...源码系列V1-Dubbo第五节-服务导出源码解析.md | 37 +++++--
...源码系列V1-Dubbo第六节-服务引入源码解析.md | 12 ++-
...源码系列V1-Dubbo第七节-服务调用源码解析.md | 34 ++++++-
6 files changed, 188 insertions(+), 95 deletions(-)
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处理链路