Dubbo 2.7.8 服务暴露、引用、调用
2022-07-04 10:17:18 17 举报
Dubbo 2.7.8 服务暴露、引用、调用
作者其他创作
大纲/内容
removeFailedSubscribed
ReferenceConfig
失败会重试
getProxy
doList
zookeeper
registryFactory.getRegistry上面已经创建了注册中心,直接从缓存中拿
getCallbackExecutor获取回调线程池
ConsumerContextClusterInterceptor
openServer(url)
bootstrap.init()
一直往下跟能看到Netty服务开启
返回Invoker
doJoin
notify
getUrlToRegistry
服务暴露
是否注册中心
获取到请求结果
MonitorFilter#invoke
记录当前invoker,触发容错时不再调用
1.指定名称扩展点ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(\"name\
ZookeeperRegistryFactory
toInvokers
RegistryFactory$Adaptive
doExport
initLoadBalance获取负载均衡策略
subscribe
injvm
否
获取URLproxy参数默认为javassist
getRegistryUrl
SPI获取ProxyFactory
ListenerRegistryWrapper
bootstrap==null
new InvokerDelegate<>(protocol.refer)重新生成 Invoker
Protocol$Adaptive
DubboProtocol
new DestroyableExporter<>(exporter)返回销毁Export 销毁时调用unexport
ListenerInvokerWrapper
最后得到的是ListenerRegistryWrapper
响应结果会强转成AppResponse
listener.notify该方法在AbstractRegistry中
buildInvokerChain构建Filter链
new font color=\"#f44336\
DubboInvoker
protocols协议集合
listener.onSubscribe
异常后
ZookeeperRegistry
Protocol
scope
new ExporterChangeableWrapper(protocol.export())
refer
export
PROXY_FACTORY
getInvoker
dubbo
JavassistProxyFactory
optimizeSerialization
RpcContext中的值就是在这里放入到invoker的attachments中
export
invoke
doLocalExport远程暴露
before
referenceBean.get()
SPI获取Protocol
currentClient.request发起RPC请求
ConsumerContextFilter#invoke
registry.subscribe方法已废弃
ListenerInvokerWrapper#invoke
AbstractProtocol
SPI获取ProtocolFactoryURL协议头已经被替换成了registry
MockClusterWrapper
ProtocolListenerWrapper
PROXY_FACTORY.getInvoker暴露的服务转换成Invoker
ExchangeClient currentClient获取交换机客户端
init
InvokerInvocationHandler
new RegistryDirectory
DubboBootstrap
StubProxyFactoryWrapper
注册中心不为空
subscribe订阅服务变更
referServices
new ListenerRegistryWrapper
exported
协议头替换成zookeeper
是
new AbstractProxyInvoker用来调用wrapper的invokerMethod方法
ProxyFactory$Adaptive
服务调用过程
new FailoverClusterInvoker<>(directory)
SPI获取ClusterInterceptor
/dubbo/com.niezhiliang.dubbo.common.service.HelloService/providers/dubbo/com.niezhiliang.dubbo.common.service.HelloService/configurators/dubbo/com.niezhiliang.dubbo.common.service.HelloService/routers
getRegistry
在Invoker前面加上集群拦截器
start
new DelegateProviderMetaDataInvoker包装Invoker和服务元数据
select负载均衡选出一个Invoker
InjvmProtocol
register
cluster.join(directory) 获取invoker对象
FailoverClusterInvoker
PROXY_FACTORY.getProxy
一系列的给元数据赋值方法
ProtocolFilterWrapper
只会开启一次
listeners.add(listener)
new MockClusterInvoker包装Invoker再返回
RegistryDirectory
intercept
延时
ConsumerContextClusterInterceptor#after删除rpcContext中的值(ThreadLocal)
onContextRefreshedEvent
生成的Wrapper1类持有了当前保留服务的引用,会生成一个invokeMethod方法,具体代码就是对方法的调用
dispatch 发布ServiceConfigExportedEvent事件
addNotifyListener(this)
MockClusterInvoker
一系列构建URL代码
SPI中Wrapper机制,装饰者模式的具体表现
initLoadBalance初始化负载均衡算法
Wrapper1#invokeMethod
new AsyncToSyncInvoker()
本地暴露URL
ClusterInterceptor
currentClient.requestRPC请求通过CompletableFuture接收
AbstractClusterInvoker#doSelect
AbstractCluster
本地暴露
协议
new ZookeeperRegistry
invoke(rpcInvocation)
createRegistry
buildReferenceBeanIfAbsent构建RefenenceBean
实例化过程会触发ExporterListener的监听
buildRouterChain
initialize
提供者端方法
refreshInvoker
RegistryFactoryWrapper
notifyExport
new DubboInvoker
ServiceConfig
destroyUnusedInvokers
new RpcInvocation
select 选择一个invoker
get
容器刷新完成发送ContextRefreshedEvent事件
依次给每个协议暴露到所有的注册中心,多协议多注册中心体现
register
list(invocation)获取所有的invoker
removeFailedUnregistered
Wrapper
new ListenerExporterWrapper添加服务暴露监听器
getCallbackExecutor获取调用线程池
构建得到的URL
refreshOverrideAndInvoker 刷新Invoker
registryFactory.getRegistry
AsyncToSyncInvoker#invoke
服务引用
new ListenerInvokerWrapper添加Invoker监听器
DubboBootstrap.getInstance
AsyncToSyncInvoker
listener.onRegister
delay?
invoker.invoke
protocolBindingRefer
doRefer 将订阅者注册到consumer节点
invokers.add(invoker)
buildInvokerChain$invoke调用Filter链
RegistryFactory
FailbackRegistry
FailoverCluster
DubboInvoker#doInvoke
overrideDirectoryUrl
Cluster.getCluster
RegistryProtocol
join
invocation.addObjectAttachments
获取URLprotocol参数
doExportUrlsFor1Protocol
subscribe
REF_PROTOCOL.refer
循环暴露
toRouters
QosProtocolWrapper
DubboBootstrapApplicationListener#onApplicationContextEvent
registered.add(url)
一系列Filter
doRegister
list(获取所有的invoker)
createProxy(map)创建代理类
url完善
生成的Invoker,还会去构建Filter链
exportServices
dispatch暴露完成后发布事件
AbstractRegistryFactory
new InterceptorInvokerNode()
removeFailedRegistered
doInvoke
startQosServer
zkClient.create
ConsumerContextFilterFutureFilterMonitorFilter
默认为FailoverCluster,但是被MockClusterWrapper包装了一下
zkClient.createZK创建节点
服务暴露全部完成
loadRegistries加载注册中心配置
SPI获取注册中心工厂
ReferenceAnnotationBeanPostProcessor#doGetInjectedBean
helloService.limit()
doExportUrls
createServer
AbstractClusterInvoker
Spring容器
getWrapper
默认三个FilterConsumerContextFilterFutureFilterMonitorFilter
AbstractRegistry
PROTOCOL.export
PROTOCOL
after
getRegistry获取注册中心
doMockInvoke
FutureFilter#invoke
远程暴露
是否需要注册
makeWrapper包装业务实现类
XX$Adaptive类都是dubbo SPI自适应扩展点通过@Adaptive修饰方法后通过生成字节码而生成的类,类的作用:解析url中的参数,获取SPI接口具体的实现(可以通过Araths反编译看到具体代码)
异常后走指定mock类代码
buildClusterInterceptors
Bean创建过程中在populateBean方法中给属性赋值过程中,有@Reference注解时会走到这里
routerChain.setInvokers(newInvokers)this.invokers = newInvokers
configManager.getServices获取到所有需要暴露的服务
exportLocal
通知RegistryProtocol监听器
clusterInvoker.invoke
register注册中心注册节点信息
registerReferenceBean想容器注册ReferenceBean
new InvokerInvocationHandler(invoker)
是否本地引用
Proxy.getProxy(interfaces).newInstance()最后生成的代理对象
收藏
收藏
0 条评论
下一页