Dubbo
2020-10-10 10:13:30 0 举报
dubbo 核心流程
作者其他创作
大纲/内容
ProtocolFilterWrapper.export
Consumer 发起接口调用
ReferenceConfig#createProxy
ReferenceCountExchangeClient#request
HeaderExchangeChannel#send
1.获得 Reference Bean 的名字
如果本地缓存中有则执行
DubboCodec#decodeBody 构造 Response
NettyCodecAdapter.InternalDecoder#decode接收到网络请求
Provider 接收请求
DubboCountCodec#decode
ExchangeCodec#encodeResponse
NettyCodecAdapter.InternalEncoder#encode
根据注解配置的路径扫描包含dubbo的@Service类并注册bean
将调用的结果统一用CompletableFuture包装,构造AsyncRpcResult 返回
执行ReferenceConfig的 get()
经过所有的 provider filter 链进行调用
AbstractClient#send
HeaderExchangeHandler#handleRequest在这里构造Response
DubboProtocol#protocolBindingRefer得到 DubboInvoker
AbstractClusterInvoker#invoke1、通过RegistryDirectory#doList 拿到所有经过 router 之后的 invokers2、初始化 LoadBalance,默认是random
DubboConfigBindingsRegistrar
ExchangeHandlerAdapter#reply
MultiMessageHandler#received
2.创建 ReferenceBean 对象(ReferenceBean 是个FactoryBean )
@Import
export
注册bean
@EnableDubboConfigBindings
HeaderExchangeChannel#request在这里构造 Request 并立即返回DefaultFuture
通过JavassistProxyFactory.getProxy 将接口类 统一生成代理类Proxy(Proxy里面通过InvocationHandler 调用 invoker.invoke(rpcInvocation).recreate()),最终返回一个 Proxy
@EnableDubbo
RegistryProtocol.refer先创建 MockClusterWrapper,再创建 RegistryDirectory
DecodeHandler#received
doGetInjectedBean()
AsyncToSyncInvoker#invoke异步调用,然后get 阻塞获取结果
NettyChannel#send 通过网络发送数据
NettyServerHandler#channelRead
ServiceConfig
@DubboComponentScan
HeartbeatHandler#received
从 environment中拿到所有@EnableDubboConfigBinding里面的prefix对应的配置,并注册各种AbstractConfig的bean
MockClusterInvoker#invoke
FailoverClusterInvoker#doInvoke通过LoadBalance选择一个invoker 执行AbstractClusterInvoker#select
HeaderExchangeHandler#handleResponse
注册ServiceBean,并把注解中的配置设置到ServiceBean中(ServiceBean继承ServiceConfig)
NettyCodecAdapter.InternalDecoder#decode 接收到返回的数据
ChannelEventRunnable#run
如果不是本地bean则立即执行,否则只缓存
DecodeableRpcResult#decode
经过所有的 consumer filter 链进行调用
执行initReferenceBeanInvocationHandler()
NettyChannel#send
AbstractProxyInvoker#invoke
DubboConfigConfigurationRegistrar
发布 ServiceBeanExportedEvent,而 ReferenceAnnotationBeanPostProcessor会监听这个事件
HeaderExchangeClient#request
DubboComponentScanRegistrar
cluster.join(directory) 得到 MockClusterInvoker (包了一层 FailoverClusterInvoker)
3.通过jdk动态代理创建 Proxy 代理对象ReferenceBeanInvocationHandler
RegistryDirectory#subscribe 添加监听,如果有变化触发 RegistryDirectory#refreshOverrideAndInvoker
ReferenceBeanInvocationHandler的init()
DubboCodec#decodeBody
ProtocolFilterWrapper.refer 构造 consumer filter 链
DubboCountCodec#encode
InvokerInvocationHandler#invoke
ProtocolListenerWrapper.export
JavassistProxyFactory#getInvoker 里面调用provider启动时创建的AbstractProxyInvoker#doInvoke (在wrapper 生成的接口实现类的代理类里面通过方法名判断,调用对应的方法)
ProtocolFilterWrapper.refer
AllChannelHandler#received
ProtocolFilterWrapper.export 构造 provider filter 链
AbstractPeer#send
@EnableDubboConfig
从ioc容器里面获取 DubboConfigBinder,没有的话,默认使用DefaultDubboConfigBinder进行AbstractConfig的数据绑定
ServiceAnnotationBeanPostProcessor
DubboProtocol 中的ExchangeHandlerAdapter#reply
@EnableDubboConfigBinding
通过 AbstractProtocol#refer 得到 AsyncToSyncInvoker
AbstractPeer#received
执行ReferenceConfig的 init()
get
ExchangeCodec#decode
DecodeableRpcInvocation#decode()
在spring发布 ContextRefreshedEvent事件的时候,执行 ServiceConfig的 export()(ServiceBean 实现了ApplicationListener<ContextRefreshedEvent>接口)
DubboCountCodec#decode
HeaderExchangeHandler#received
DubboConfigBindingRegistrar
ProtocolListenerWrapper.refer
得到 AsyncRpcResult 后在HeaderExchangeHandler#handleRequest 中通过channel 发送数据
NettyClientHandler#channelRead
ReferenceAnnotationBeanPostProcessor
ExchangeCodec#encode
DubboCodec#decodeBody构造 Request
DubboInvoker#doInvoke
DecodeHandler#received
注册DubboConfigBindingBeanPostProcessor
ExchangeCodec#decode
RegistryProtocol.export 在 doLocalExport 中 export invoker
ReferenceConfig
DubboConfigConfiguration
通过JavassistProxyFactory.getInvoker 将接口实现类用 Wrapper 统一生成代理类(代理类里面通过对方法名进行if else 判断进行调用),最终返回一个 AbstractProxyInvoker
0 条评论
回复 删除
下一页