mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-03-13 21:33:42 +08:00
小更新,可忽略
This commit is contained in:
@@ -13,18 +13,24 @@ abbrlink: d3c530c4
|
|||||||
date: 2021-09-11 15:21:58
|
date: 2021-09-11 15:21:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Dubbo源码
|
# 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
|
### 什么是RPC
|
||||||
|
|
||||||
@@ -119,10 +125,16 @@ Dubbo网关参考:[https://github.com/apache/dubbo-proxy](https://github.com/a
|
|||||||
|
|
||||||
## 第二节: 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笔记》
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
官网:[http://dubbo.apache.org/zh/docs/v2.7/user/](http://dubbo.apache.org/zh/docs/v2.7/user/)
|
官网:[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)
|
管理台github地址:[https://github.com/apache/dubbo-admin](https://github.com/apache/dubbo-admin)
|
||||||
|
|
||||||
|
|
||||||
@@ -134,7 +146,7 @@ Dubbo提供了很多功能,这里我们只介绍几种比较重要的,其他
|
|||||||
### 项目目录
|
### 项目目录
|
||||||
|
|
||||||
```java
|
```java
|
||||||
dubbo-youthlql-demo
|
dubbo-tuling-demo
|
||||||
├── consumer/
|
├── consumer/
|
||||||
| ├── consumer.iml
|
| ├── consumer.iml
|
||||||
| ├── pom.xml
|
| ├── pom.xml
|
||||||
@@ -142,7 +154,7 @@ dubbo-youthlql-demo
|
|||||||
| ├── main/
|
| ├── main/
|
||||||
| | ├── java/
|
| | ├── java/
|
||||||
| | | └── com/
|
| | | └── com/
|
||||||
| | | └── youthlql/
|
| | | └── tuling/
|
||||||
| | | ├── consumer/
|
| | | ├── consumer/
|
||||||
| | | | ├── AsyncDubboConsumerDemo.java
|
| | | | ├── AsyncDubboConsumerDemo.java
|
||||||
| | | | ├── CallbackDubboConsumerDemo.java
|
| | | | ├── CallbackDubboConsumerDemo.java
|
||||||
@@ -161,7 +173,7 @@ dubbo-youthlql-demo
|
|||||||
| | └── application.yml
|
| | └── application.yml
|
||||||
| └── test/
|
| └── test/
|
||||||
| └── java/
|
| └── java/
|
||||||
├── dubbo-youthlql-demo.iml
|
├── dubbo-tuling-demo.iml
|
||||||
├── interface/
|
├── interface/
|
||||||
| ├── interface.iml
|
| ├── interface.iml
|
||||||
| ├── pom.xml
|
| ├── pom.xml
|
||||||
@@ -169,7 +181,7 @@ dubbo-youthlql-demo
|
|||||||
| ├── main/
|
| ├── main/
|
||||||
| | ├── java/
|
| | ├── java/
|
||||||
| | | └── com/
|
| | | └── com/
|
||||||
| | | └── youthlql/
|
| | | └── tuling/
|
||||||
| | | ├── DemoService.java
|
| | | ├── DemoService.java
|
||||||
| | | ├── DemoServiceListener.java
|
| | | ├── DemoServiceListener.java
|
||||||
| | | ├── DemoServiceMock.java
|
| | | ├── DemoServiceMock.java
|
||||||
@@ -185,7 +197,7 @@ dubbo-youthlql-demo
|
|||||||
├── main/
|
├── main/
|
||||||
| ├── java/
|
| ├── java/
|
||||||
| | └── com/
|
| | └── com/
|
||||||
| | └── youthlql/
|
| | └── tuling/
|
||||||
| | ├── DubboProviderDemo.java
|
| | ├── DubboProviderDemo.java
|
||||||
| | ├── provider/
|
| | ├── provider/
|
||||||
| | | └── service/
|
| | | └── service/
|
||||||
@@ -342,13 +354,13 @@ private DemoService demoService;
|
|||||||
> consumer项目
|
> consumer项目
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.consumer;
|
package com.tuling.consumer;
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
public class StubDubboConsumerDemo {
|
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")
|
@Reference(version = "timeout", timeout = 1000, stub = "true")
|
||||||
private DemoService demoService;
|
private DemoService demoService;
|
||||||
|
|
||||||
@@ -364,14 +376,14 @@ public class StubDubboConsumerDemo {
|
|||||||
```
|
```
|
||||||
|
|
||||||
1. stub=true的是个默认配置
|
1. stub=true的是个默认配置
|
||||||
2. 默认用接口的全限定类名+Stub去调用,也就是`com.youthlql.DemoServiceStub`
|
2. 默认用接口的全限定类名+Stub去调用,也就是`com.tuling.DemoServiceStub`
|
||||||
3. 比如这个例子,当消费者去调用`demoService.sayHello("周瑜")`时,会首先调用`interface项目`下的`DemoServiceStub`的`sayHello`方法。如果调用失败就返回`"容错数据"`
|
3. 比如这个例子,当消费者去调用`demoService.sayHello("周瑜")`时,会首先调用`interface项目`下的`DemoServiceStub`的`sayHello`方法。如果调用失败就返回`"容错数据"`
|
||||||
4. 如果找不到`com.youthlql.DemoServiceStub`就抛异常
|
4. 如果找不到`com.tuling.DemoServiceStub`就抛异常
|
||||||
5. 注意`DemoServiceStub`这个类不一定需要写在interface项目里的,写在哪里都行,只要能通过pom.xml的maven依赖找到`com.youthlql.DemoServiceStub`你这个路径就行
|
5. 注意`DemoServiceStub`这个类不一定需要写在interface项目里的,写在哪里都行,只要能通过pom.xml的maven依赖找到`com.tuling.DemoServiceStub`你这个路径就行
|
||||||
6. 也可以stub直接指定全类名,这样就可以每一个消费者都提供一个本地存根
|
6. 也可以stub直接指定全类名,这样就可以每一个消费者都提供一个本地存根
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@Reference(version = "timeout", timeout = 1000, stub = "com.youthlql.DemoServiceStub")
|
@Reference(version = "timeout", timeout = 1000, stub = "com.tuling.DemoServiceStub")
|
||||||
private DemoService demoService;
|
private DemoService demoService;
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -380,7 +392,7 @@ private DemoService demoService;
|
|||||||
> interface项目
|
> interface项目
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql;
|
package com.tuling;
|
||||||
|
|
||||||
public class DemoServiceStub implements DemoService {
|
public class DemoServiceStub implements DemoService {
|
||||||
|
|
||||||
@@ -438,7 +450,7 @@ public class DemoServiceStub implements DemoService {
|
|||||||
> interface项目
|
> interface项目
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql;
|
package com.tuling;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@@ -461,7 +473,7 @@ public interface DemoService {
|
|||||||
> consumer项目
|
> consumer项目
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.consumer;
|
package com.tuling.consumer;
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
public class CallbackDubboConsumerDemo {
|
public class CallbackDubboConsumerDemo {
|
||||||
@@ -487,7 +499,7 @@ public class CallbackDubboConsumerDemo {
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.consumer;
|
package com.tuling.consumer;
|
||||||
|
|
||||||
public class DemoServiceListenerImpl implements DemoServiceListener {
|
public class DemoServiceListenerImpl implements DemoServiceListener {
|
||||||
|
|
||||||
@@ -502,7 +514,7 @@ public class DemoServiceListenerImpl implements DemoServiceListener {
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql;
|
package com.tuling;
|
||||||
|
|
||||||
public interface DemoServiceListener {
|
public interface DemoServiceListener {
|
||||||
void changed(String msg);
|
void changed(String msg);
|
||||||
@@ -512,7 +524,7 @@ public interface DemoServiceListener {
|
|||||||
> provider项目
|
> provider项目
|
||||||
|
|
||||||
```java
|
```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
|
```java
|
||||||
package com.youthlql;
|
package com.tuling;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@@ -643,7 +657,7 @@ public interface DemoService {
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.provider.service;
|
package com.tuling.provider.service;
|
||||||
|
|
||||||
|
|
||||||
@Service(version = "async")
|
@Service(version = "async")
|
||||||
@@ -670,7 +684,7 @@ public class AsyncDemoService implements DemoService {
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.consumer;
|
package com.tuling.consumer;
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
public class AsyncDubboConsumerDemo {
|
public class AsyncDubboConsumerDemo {
|
||||||
@@ -715,14 +729,14 @@ public class AsyncDubboConsumerDemo {
|
|||||||
2. GenericService是dubbo提供的
|
2. GenericService是dubbo提供的
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.consumer;
|
package com.tuling.consumer;
|
||||||
|
|
||||||
|
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
public class GenericDubboConsumerDemo {
|
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;
|
private GenericService genericService;
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
@@ -751,14 +765,14 @@ public class GenericDubboConsumerDemo {
|
|||||||
实现了GenericService接口的就是泛化服务
|
实现了GenericService接口的就是泛化服务
|
||||||
|
|
||||||
```java
|
```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.config.annotation.Service;
|
||||||
import org.apache.dubbo.rpc.service.GenericException;
|
import org.apache.dubbo.rpc.service.GenericException;
|
||||||
import org.apache.dubbo.rpc.service.GenericService;
|
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 {
|
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
|
### Dubbo中的REST
|
||||||
|
|
||||||
@@ -807,7 +821,7 @@ spring.application.name=dubbo-provider-demo
|
|||||||
server.port=8081
|
server.port=8081
|
||||||
|
|
||||||
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
|
# 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}
|
dubbo.application.name=${spring.application.name}
|
||||||
|
|
||||||
|
|
||||||
@@ -843,7 +857,7 @@ dubbo.protocols.p2.host=0.0.0.0
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.provider.service;
|
package com.tuling.provider.service;
|
||||||
|
|
||||||
|
|
||||||
@Service(version = "rest", protocol = "p2")
|
@Service(version = "rest", protocol = "p2")
|
||||||
@@ -867,9 +881,9 @@ public class RestDemoService implements DemoService {
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```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.common.URL;
|
||||||
import org.apache.dubbo.config.annotation.Service;
|
import org.apache.dubbo.config.annotation.Service;
|
||||||
import org.apache.dubbo.rpc.RpcContext;
|
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)
|
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文件里没有明确写配置中心,配置中心默认就用注册中心。
|
1. Dubbo分为注册中心和配置中心,如果spring文件里没有明确写配置中心,配置中心默认就用注册中心。
|
||||||
|
|
||||||
@@ -979,7 +993,7 @@ conditions:
|
|||||||
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
package com.youthlql.controller;
|
package com.tuling.controller;
|
||||||
|
|
||||||
import org.apache.dubbo.rpc.Constants;
|
import org.apache.dubbo.rpc.Constants;
|
||||||
import org.apache.dubbo.rpc.RpcContext;
|
import org.apache.dubbo.rpc.RpcContext;
|
||||||
@@ -1028,6 +1042,8 @@ public class ConsumerInterceptor implements HandlerInterceptor {
|
|||||||
|
|
||||||
Zookeeper可视化客户端:ZooInspector
|
Zookeeper可视化客户端:ZooInspector
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Dubbo与其他微服务组件整合
|
## Dubbo与其他微服务组件整合
|
||||||
|
|
||||||
sentinel: https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-dubbo
|
sentinel: https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-dubbo
|
||||||
|
|||||||
@@ -13,16 +13,18 @@ abbrlink: dbcfef47
|
|||||||
date: 2021-09-12 15:21:58
|
date: 2021-09-12 15:21:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 第三节: Dubbo的可扩展机制SPI源码解析
|
## 第三节: 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的概念
|
### SPI的概念
|
||||||
|
|
||||||
https://www.cnblogs.com/happyframework/archive/2013/09/17/3325560.html
|
https://www.cnblogs.com/happyframework/archive/2013/09/17/3325560.html
|
||||||
@@ -44,24 +46,24 @@ spi-demo
|
|||||||
| | ├── main/
|
| | ├── main/
|
||||||
| | | ├── java/
|
| | | ├── java/
|
||||||
| | | | └── com/
|
| | | | └── com/
|
||||||
| | | | └── youthlql/
|
| | | | └── atguigu/
|
||||||
| | | | └── mysql/
|
| | | | └── mysql/
|
||||||
| | | | └── MySQLSaveService.java
|
| | | | └── MySQLSaveService.java
|
||||||
| | | └── resources/
|
| | | └── resources/
|
||||||
| | | └── META-INF/
|
| | | └── META-INF/
|
||||||
| | | └── services/
|
| | | └── services/
|
||||||
| | | └── com.youthlql.data.DataSaveService
|
| | | └── com.atguigu.data.DataSaveService
|
||||||
| | └── test/
|
| | └── test/
|
||||||
| | └── java/
|
| | └── java/
|
||||||
| └── target/
|
| └── target/
|
||||||
| ├── classes/
|
| ├── classes/
|
||||||
| | ├── com/
|
| | ├── com/
|
||||||
| | | └── youthlql/
|
| | | └── atguigu/
|
||||||
| | | └── mysql/
|
| | | └── mysql/
|
||||||
| | | └── MySQLSaveService.class
|
| | | └── MySQLSaveService.class
|
||||||
| | └── META-INF/
|
| | └── META-INF/
|
||||||
| | └── services/
|
| | └── services/
|
||||||
| | └── com.youthlql.data.DataSaveService
|
| | └── com.atguigu.data.DataSaveService
|
||||||
| └── generated-sources/
|
| └── generated-sources/
|
||||||
| └── annotations/
|
| └── annotations/
|
||||||
├── api-db-impl-redis/
|
├── api-db-impl-redis/
|
||||||
@@ -71,24 +73,24 @@ spi-demo
|
|||||||
| | ├── main/
|
| | ├── main/
|
||||||
| | | ├── java/
|
| | | ├── java/
|
||||||
| | | | └── com/
|
| | | | └── com/
|
||||||
| | | | └── youthlql/
|
| | | | └── atguigu/
|
||||||
| | | | └── redis/
|
| | | | └── redis/
|
||||||
| | | | └── RedisSaveService.java
|
| | | | └── RedisSaveService.java
|
||||||
| | | └── resources/
|
| | | └── resources/
|
||||||
| | | └── META-INF/
|
| | | └── META-INF/
|
||||||
| | | └── services/
|
| | | └── services/
|
||||||
| | | └── com.youthlql.data.DataSaveService
|
| | | └── com.atguigu.data.DataSaveService
|
||||||
| | └── test/
|
| | └── test/
|
||||||
| | └── java/
|
| | └── java/
|
||||||
| └── target/
|
| └── target/
|
||||||
| ├── classes/
|
| ├── classes/
|
||||||
| | ├── com/
|
| | ├── com/
|
||||||
| | | └── youthlql/
|
| | | └── atguigu/
|
||||||
| | | └── redis/
|
| | | └── redis/
|
||||||
| | | └── RedisSaveService.class
|
| | | └── RedisSaveService.class
|
||||||
| | └── META-INF/
|
| | └── META-INF/
|
||||||
| | └── services/
|
| | └── services/
|
||||||
| | └── com.youthlql.data.DataSaveService
|
| | └── com.atguigu.data.DataSaveService
|
||||||
| └── generated-sources/
|
| └── generated-sources/
|
||||||
| └── annotations/
|
| └── annotations/
|
||||||
├── api-db-interface/
|
├── api-db-interface/
|
||||||
@@ -98,7 +100,7 @@ spi-demo
|
|||||||
| | ├── main/
|
| | ├── main/
|
||||||
| | | ├── java/
|
| | | ├── java/
|
||||||
| | | | └── com/
|
| | | | └── com/
|
||||||
| | | | └── youthlql/
|
| | | | └── atguigu/
|
||||||
| | | | └── data/
|
| | | | └── data/
|
||||||
| | | | └── DataSaveService.java
|
| | | | └── DataSaveService.java
|
||||||
| | | └── resources/
|
| | | └── resources/
|
||||||
@@ -107,7 +109,7 @@ spi-demo
|
|||||||
| └── target/
|
| └── target/
|
||||||
| ├── classes/
|
| ├── classes/
|
||||||
| | └── com/
|
| | └── com/
|
||||||
| | └── youthlql/
|
| | └── atguigu/
|
||||||
| | └── data/
|
| | └── data/
|
||||||
| | └── DataSaveService.class
|
| | └── DataSaveService.class
|
||||||
| └── generated-sources/
|
| └── generated-sources/
|
||||||
@@ -119,7 +121,7 @@ spi-demo
|
|||||||
| | ├── main/
|
| | ├── main/
|
||||||
| | | ├── java/
|
| | | ├── java/
|
||||||
| | | | └── com/
|
| | | | └── com/
|
||||||
| | | | └── youthlql/
|
| | | | └── atguigu/
|
||||||
| | | | └── redis/
|
| | | | └── redis/
|
||||||
| | | | └── MainTest.java
|
| | | | └── MainTest.java
|
||||||
| | | └── resources/
|
| | | └── resources/
|
||||||
@@ -128,7 +130,7 @@ spi-demo
|
|||||||
| └── target/
|
| └── target/
|
||||||
| ├── classes/
|
| ├── classes/
|
||||||
| | └── com/
|
| | └── com/
|
||||||
| | └── youthlql/
|
| | └── atguigu/
|
||||||
| | └── redis/
|
| | └── redis/
|
||||||
| | └── MainTest.class
|
| | └── MainTest.class
|
||||||
| └── generated-sources/
|
| └── generated-sources/
|
||||||
@@ -143,7 +145,7 @@ spi-demo
|
|||||||
#### MainTest
|
#### MainTest
|
||||||
|
|
||||||
```java
|
```java
|
||||||
import com.youthlql.data.DataSaveService;
|
import com.atguigu.data.DataSaveService;
|
||||||
|
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
|
|
||||||
@@ -222,18 +224,18 @@ public class RedisSaveService implements DataSaveService {
|
|||||||
|
|
||||||
#### SPI文件示例
|
#### 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
|
```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
|
```txt
|
||||||
com.youthlql.mysql.MySQLSaveService
|
com.atguigu.mysql.MySQLSaveService
|
||||||
```
|
```
|
||||||
|
|
||||||
你没看错就是这么简单
|
你没看错就是这么简单
|
||||||
@@ -253,9 +255,9 @@ com.youthlql.mysql.MySQLSaveService
|
|||||||
SPI文件里写了什么,java的`ServiceLoader`都会给你一次性加载完
|
SPI文件里写了什么,java的`ServiceLoader`都会给你一次性加载完
|
||||||
|
|
||||||
```java
|
```java
|
||||||
com.youthlql.RedCar
|
com.tuling.RedCar
|
||||||
com.youthlql.BlackCar
|
com.tuling.BlackCar
|
||||||
com.youthlql,WhiteCar
|
com.tuling,WhiteCar
|
||||||
....
|
....
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -275,8 +277,8 @@ com.youthlql,WhiteCar
|
|||||||
spi文件我们可以这样写:
|
spi文件我们可以这样写:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
red=com.youthlql.RedCar
|
red=com.tuling.RedCar
|
||||||
black=com.youthlql.BlackCar
|
black=com.tuling.BlackCar
|
||||||
```
|
```
|
||||||
|
|
||||||
`SpiTest.java`
|
`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源码
|
### ExtensionLoader源码
|
||||||
@@ -400,6 +406,8 @@ System.out.println(http);
|
|||||||
|
|
||||||
后续,在A接口的代理对象被真正用到时,才会结合URL信息找到真正的A接口对应的扩展点实例进行调用。
|
后续,在A接口的代理对象被真正用到时,才会结合URL信息找到真正的A接口对应的扩展点实例进行调用。
|
||||||
|
|
||||||
|
<img src="https://npm.elemecdn.com/youthlql@1.0.3/rpc/dubbo/v1/03_di_san_jie/ExtensionLoader.png"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### getExtension()
|
#### getExtension()
|
||||||
@@ -659,9 +667,9 @@ loadResource方法就是完成对文件内容的解析,按行进行解析,
|
|||||||
clazz.getConstructor();
|
clazz.getConstructor();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
1. 本来应该这样写的 red=com.youthlql.RedCar
|
1. 本来应该这样写的 red=com.tuling.RedCar
|
||||||
2.如果你前面的red这个name没写,像这样只写了个全类名com.youthlql.RedCar
|
2.如果你前面的red这个name没写,像这样只写了个全类名com.tuling.RedCar
|
||||||
3.默认会去com.youthlql.RedCar这个类上找有没有@Extension注解起名了【官方已经标记成废弃了】
|
3.默认会去com.tuling.RedCar这个类上找有没有@Extension注解起名了【官方已经标记成废弃了】
|
||||||
*/
|
*/
|
||||||
if (StringUtils.isEmpty(name)) {
|
if (StringUtils.isEmpty(name)) {
|
||||||
name = findAnnotationName(clazz);
|
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
|
```java
|
||||||
public class DubboIOCTest {
|
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
|
```java
|
||||||
package org.apache.dubbo.rpc;
|
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扩展点
|
### Activate扩展点
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,19 @@ abbrlink: 796f395d
|
|||||||
date: 2021-10-06 13:21:58
|
date: 2021-10-06 13:21:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 第四节: Spring与Dubbo整合原理与源码分析
|
## 第四节: 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
|
#### 处理@Service
|
||||||
|
|
||||||
@@ -170,10 +177,11 @@ 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"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Spring启动时,会调用DubboConfigConfigurationRegistrar的registerBeanDefinitions方法,该方法是利用Spring中的AnnotatedBeanDefinitionReader来读取:
|
Spring启动时,会调用DubboConfigConfigurationRegistrar的registerBeanDefinitions方法,该方法是利用Spring中的AnnotatedBeanDefinitionReader来读取:
|
||||||
|
|
||||||
@@ -856,10 +864,11 @@ DubboConfigConfigurationRegistrar的作用是向Spring容器中注册两个Bean:
|
|||||||
|
|
||||||
> 主要就是处理@Service注解
|
> 主要就是处理@Service注解
|
||||||
|
|
||||||
|
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/@Service注解处理流程.png"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ServiceAnnotationBeanPostProcessor是一个BeanDefinitionRegistryPostProcessor,是用来注册BeanDefinition的。这个类的名字起的不太好。
|
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注解
|
> 处理@Reference注解
|
||||||
|
|
||||||
|
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/04_di_si_jie/@Reference注解处理流程.png"/>
|
||||||
|
|
||||||
##### 总结
|
##### 总结
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,16 @@ abbrlink: '48141866'
|
|||||||
date: 2021-10-06 14:11:58
|
date: 2021-10-06 14:11:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 第五节: 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笔记》
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 服务导出原理概述
|
### 服务导出原理概述
|
||||||
|
|
||||||
1. 服务导出的入口为ServiceBean中的export()方法,当Spring启动完之后,通过接收Spring的ContextRefreshedEvent事件来触发export()方法的执行。
|
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接口表示一个服务,此时的服务表示服务定义
|
1. DemoService接口表示一个服务,此时的服务表示服务定义
|
||||||
2. DemoServiceImpl表示DemoService服务的具体实现,此时的服务表示服务的具体实现
|
2. DemoServiceImpl表示DemoService服务的具体实现,此时的服务表示服务的具体实现
|
||||||
3. DemoService+group+version表示一个服务,此时的服务增加了分组和版本概念
|
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这个服务
|
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.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表示一个服务,此时的服务是拥有参数的,比如超时时间、版本号、所属应用
|
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")
|
* @PropertySource("classpath:/spring/dubbo-provider.properties")
|
||||||
* 2.那么Spring启动的时候就会加载里面的配置到一些xxxConfig里面【Spring整合Dubbo的时候讲过】
|
* 2.那么Spring启动的时候就会加载里面的配置到一些xxxConfig里面【Spring整合Dubbo的时候讲过】
|
||||||
* 3.@Service注解里配置的参数被首先读取到了ServiceBean里
|
* 3.@Service注解里配置的参数被首先读取到了ServiceBean里
|
||||||
@@ -997,6 +1001,11 @@ date: 2021-10-06 14:11:58
|
|||||||
14. 在NettyServer中,会实现doOpen方法,会调用**new** NettyServerHandler(getUrl(), **this**)构造一个NettyServerHandler,并bind地址
|
14. 在NettyServer中,会实现doOpen方法,会调用**new** NettyServerHandler(getUrl(), **this**)构造一个NettyServerHandler,并bind地址
|
||||||
15. 至此,DubboProtocol协议的启动Server流程就结束。
|
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节点的内容
|
1. 应用:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService/dubbo.properties节点的内容
|
||||||
2. 全局:/dubbo/config/dubbo/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。
|
> 所以在一个服务进行导出时,需要在服务提供者端给当前服务生成一个对应的监听器实例,这个监听器实例为OverrideListener,它负责监听对应服务的动态配置变化,并且根据动态配置中心的参数重写服务URL。
|
||||||
|
|
||||||
@@ -1630,7 +1640,7 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
|||||||
2. 服务的IP和PORT,如果指定了就取指定的,没有指定IP就获取服务器上网卡的IP,
|
2. 服务的IP和PORT,如果指定了就取指定的,没有指定IP就获取服务器上网卡的IP,
|
||||||
3. 以及服务的PATH,如果没有指定PATH参数,则取接口名
|
3. 以及服务的PATH,如果没有指定PATH参数,则取接口名
|
||||||
4. 以及服务的参数,参数包括服务的参数,服务中某个方法的参数
|
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就表示了完整的一个服务
|
9. 得到服务的URL之后,会把服务URL作为一个参数添加到registryURL中去,然后把registryURL、服务的接口、当前服务实现类ref生成一个Invoker代理对象,再把这个代理对象和当前ServiceConfig对象包装成一个DelegateProviderMetaDataInvoker对象,DelegateProviderMetaDataInvoker就表示了完整的一个服务
|
||||||
10. 接下来就会使用Protocol去export导出服务了,导出之后将得到一个Exporter对象(该Exporter对象,可以理解为主要可以用来卸载(unexport)服务,什么时候会卸载服务?在优雅关闭Dubbo应用的时候)
|
10. 接下来就会使用Protocol去export导出服务了,导出之后将得到一个Exporter对象(该Exporter对象,可以理解为主要可以用来卸载(unexport)服务,什么时候会卸载服务?在优雅关闭Dubbo应用的时候)
|
||||||
@@ -1653,6 +1663,9 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
|||||||
|
|
||||||
### Exporter架构
|
### Exporter架构
|
||||||
|
|
||||||
|
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/Exporter架构.png"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
一个服务导出成功后,会生成对应的Exporter:
|
一个服务导出成功后,会生成对应的Exporter:
|
||||||
|
|
||||||
@@ -1665,6 +1678,8 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
|||||||
|
|
||||||
### 服务端Invoker架构
|
### 服务端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之后,就会计算服务的执行时间
|
1. ProtocolFilterWrapper$CallbackRegistrationInvoker:会去调用下层Invoker,下层Invoker执行完了之后,会遍历过滤器,查看是否有过滤器实现了ListenableFilter接口,如果有,则回调对应的onResponse方法,比如TimeoutFilter,当调用完下层Invoker之后,就会计算服务的执行时间
|
||||||
@@ -1674,3 +1689,9 @@ A:不需要,为什么?前面的DubboProtocol#export 那里的reset逻辑讲
|
|||||||
5. AbstractProxyInvoker:服务接口的代理类,绑定了对应的实现类,执行时会利用反射调用服务实现类实例的具体方法,并得到结果
|
5. AbstractProxyInvoker:服务接口的代理类,绑定了对应的实现类,执行时会利用反射调用服务实现类实例的具体方法,并得到结果
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 服务端请求执行流程(后续细讲)
|
||||||
|
|
||||||
|
<img src="https://npm.elemecdn.com/youthlql@1.0.4/rpc/dubbo/v1/05_di_wu_jie/Server端Handler链路.png"/>
|
||||||
@@ -13,10 +13,16 @@ abbrlink: bda15919
|
|||||||
date: 2021-11-08 14:11:58
|
date: 2021-11-08 14:11:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 第六节: 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笔记》
|
||||||
|
|
||||||
### 过程
|
### 过程
|
||||||
|
|
||||||
|
|
||||||
@@ -1360,6 +1366,8 @@ DubboProtocol中并没有refer方法,是在它的父类AbstractProtocol中才
|
|||||||
|
|
||||||
### 最复杂情况下的Invoker链
|
### 最复杂情况下的Invoker链
|
||||||
|
|
||||||
|
> 这点看不懂可以跳过
|
||||||
|
|
||||||
```java
|
```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")
|
@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;
|
private DemoService demoService;
|
||||||
|
|||||||
@@ -10,15 +10,43 @@ keywords: Dubbo,rpc
|
|||||||
description: 服务调用源码解析
|
description: 服务调用源码解析
|
||||||
cover: 'https://npm.elemecdn.com/lql_static@latest/logo/dubbo.png'
|
cover: 'https://npm.elemecdn.com/lql_static@latest/logo/dubbo.png'
|
||||||
abbrlink: 84653c9d
|
abbrlink: 84653c9d
|
||||||
date: 2021-11-09 14:11:58
|
date: 2021-11-11 14:11:58
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 第七节: 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笔记》
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<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启动源码
|
### 服务导出的Netty启动源码
|
||||||
|
|
||||||
> 最主要的就是构造一个Handler处理链路
|
> 最主要的就是构造一个Handler处理链路
|
||||||
|
|||||||
Reference in New Issue
Block a user