1
:
/**
2: * 基于单个协议,暴露服务
3: *
4: *
@param
protocolConfig 协议配置对象
5: *
@param
registryURLs 注册中心链接对象数组
6: */
7
:
private
void
doExportUrlsFor1Protocol
(ProtocolConfig protocolConfig, List
8
:
// ... 【省略】 创建服务 URL 对象
10
: String scope = url.getParameter(Constants.SCOPE_KEY);
12
:
if
(!Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) {
15
:
if
(!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
16
: exportLocal(url);
17
: }
19
:
if
(!Constants.SCOPE_LOCAL.toString().equalsIgnoreCase(scope)) {
20
:
// ... 【省略】远程暴露
21
: }
22
: }
23
:
this
.urls.add(url);
24
: }
|
ServiceConfig.java
-> 如果协议不等于Injvm,进行本地暴露。因为Injvm的情况下,在InjvmProtocol远程暴露时会暴露本地
-> URL local = URL.valueOf(url.toFullString()).setProtocol(Constants.LOCAL_PROTOCOL).setHost(LOCALHOST).setPort(0); //创建一个本地暴露的URL
-> ServiceClassHolder.getInstance().pushServiceClass(getServiceClass(ref)); //// 添加服务的真实类名,例如 DemoServiceImpl ,仅用于 RestProtocol 中。
-> Exporter exporter = protocol.export(proxyFactory.getInvoker(ref, (Class) interfaceClass, local)); //本地暴露
-> proxyFactory.getInvoker(ref, (Class) interfaceClass, local)
-> extension = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.ProxyFactory.class).getExtension("javassist"); // SPI获取Adaptive
-> extension.getInvoker(arg0, arg1, arg2)
JavassistProxyFactory.java
-> final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type); //创建一个Wapper,这个Wapper列举了所有对象的方法,减少了调用时反射的性能消耗
-> return new AbstractProxyInvoker
-> extension = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension("injvm"); //获取Injvm协议
-> extension.export(arg0)
-> ProtocolFilterWrapper.export(arg0) // Protocol有包装类 对应SPI的AOP
-> 如果是注册中心,不处理
<----> 不是则return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
-> buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER) //对Invoker进行包装一层filter
ProtocolListenerWrapper.java
-> ProtocolListenerWrapper.export
-> 如果是注册中心,不处理
-> Exporter
InjvmProtocol.java
-> return new InjvmExporter
-> List
<--------> return new ListenerExporterWrapper
-> exporters.add(exporter); //添加exporter
|