Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5bb8f3c

Browse filesBrowse files
committed
[U] 更新服务暴露文章
1 parent 6a8d4a0 commit 5bb8f3c
Copy full SHA for 5bb8f3c

File tree

Expand file treeCollapse file tree

1 file changed

+30
-3
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

1 file changed

+30
-3
lines changed
Open diff view settings
Collapse file

‎note/Dubbo/Dubbo底层源码学习——服务暴露.md‎

Copy file name to clipboardExpand all lines: note/Dubbo/Dubbo底层源码学习——服务暴露.md
+30-3Lines changed: 30 additions & 3 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,41 @@ public class Transporter$Adaptive implements org.apache.dubbo.remoting.Transport
9292
}
9393
```
9494

95-
对于Invoker对象是JavassistProxyFactory的匿名内部类,如下图所示
95+
对于JavassistProxyFactory对象中Invoker类型的匿名内部类,类结构如下图所示
9696
![export01](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/Dubbo/export01.png)
9797

98+
JavassistProxyFactory代码如下:
99+
```
100+
public class JavassistProxyFactory extends AbstractProxyFactory {
101+
102+
@Override
103+
@SuppressWarnings("unchecked")
104+
public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
105+
return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));
106+
}
107+
108+
@Override
109+
public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
110+
// TODO Wrapper cannot handle this scenario correctly: the classname contains '$'
111+
final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
112+
return new AbstractProxyInvoker<T>(proxy, type, url) {
113+
@Override
114+
protected Object doInvoke(T proxy, String methodName,
115+
Class<?>[] parameterTypes,
116+
Object[] arguments) throws Throwable {
117+
return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
118+
}
119+
};
120+
}
121+
122+
}
123+
```
124+
98125

99126
- testDubboProtocol()调用流程
100127

101-
1. 首先protocol和proxy变量分别在DubboProtocolTest.java类加载过程时就已经分别加载好了,这里的Protocol和ProxyFactory对象都生成的是代理对象,分别为Protocol$Adaptive和ProxyFactory$Adaptive对象,对象类代码在上面
102-
2. 首先调用proxy#getInvoker(),调用的实际是ProxyFactory$Adaptive对象的getInvoker()方法,在上图可以看到具体逻辑,其方法逻辑中需要去ProxyFactory对象的扩展点实现类,经过调试ProxyFactory对象的扩展点实现类为StubProxyFactoryWrapper,最终会调用到JavassistProxyFactory的getInvoker()方法,它会最终生成一个AbstractProxyInvoker()匿名类对象,所以调试的时候可以发现invoker的引用是JavassistProxyFactory$1;
128+
1. 首先protocol和proxy变量分别在DubboProtocolTest.java类加载过程时就已经分别加载好了,这里的Protocol和ProxyFactory对象都生成的是代理对象,分别为Protocol$Adaptive和ProxyFactory$Adaptive对象,动态代理处的代码在上面展示了
129+
2. 首先调用proxy#getInvoker(),调用的实际是ProxyFactory$Adaptive代理对象的getInvoker()方法,在上图可以看到具体逻辑,其方法逻辑中需要去获取ProxyFactory对象的扩展点实现类,经过调试ProxyFactory对象的扩展点实现类为StubProxyFactoryWrapper,最终会调用到JavassistProxyFactory的getInvoker()方法,它会最终生成一个AbstractProxyInvoker()匿名类对象,所以调试的时候可以发现invoker的引用是JavassistProxyFactory$1;
103130
3. 获取到invoker之后,就传入到Protocol的扩展点实现类中去调用export()方法,由上图的Protocol$Adaptive可以知道,在export()方法中会去生成Protocol的扩展点实现类,这里的实现类是ProtocolFilterWrapper(这里为什么是这个实现类呢?去调研一下)。经过代理类的传递包装,最终来到了ProtocolFilterWrapper#export()方法;
104131
4. 接着就是调用ProtocolFilterWrapper#buildInvocation()方法,构建调用链。就是先去获取Filter的扩展点实现类集合对象,然后倒叙遍历该集合对象然后将invoker对象和最后一个Filter对象封装为另一个Invoker,然后再继续传递到和上一个Filter对象继续封装成Invoker,以此往复封装。最终的结果就是将传入的invoker对象封装到了最后一个Filter之后,请求进来之后需要调用所有的Filter过后才会调用invoker对象,形成了一个Invoker链;
105132

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.