dubbo流程解析
2020-08-28 16:35:19 23 举报
登录查看完整内容
dubbo工作流程(原理分析)
作者其他创作
大纲/内容
AllChannelHandler
ReferenceConfig.init()
dubbo服务引用invoker调用
NettyClient(这里其实是执行的父类AbstractPeer的方法)
编码
ReferenceConfig.get()
HeartbeatHandler
invoke
InternalDecoder
返回调用结果
NettyChannel
这里使用netty的channel直接写出去了
设置到channel中一个读的时间戳 ,这个handler主要是接收心跳消息,然后处理心跳消息并给响应的,如果是心跳请求,就封装个respose响应回去,如果是心跳response就打印个消息就ok了
InternalEncoder
这个message是MultiMessage类型的时候,然后循环让handler处理
NettyServer(这里实际调用的父类AbstractPeer的)
writeAndFlush(message);
AbstractProxyInvoker实现类
FailoverClusterInvoker
AbstractClient
HeaderExchangeChannel
HeartbeatHandler
这个主要是将invocation封装成Request对象,然后将channel,requset,timeout 绑到一个Future里面,将Future对象返回
HeaderExchangeClient
write
DubboProtocol.initClient(url)
使用的都是invocation对象
RegistryDirectory.refreshInvoker
调用了父类的write(),然后就到下一个handler了,这里也就是encoder
Transporter
某个接口proxy
handler的recevied动作
这里这个调用就是个普通的调用,没有通过反射这种,就是判断的方法跟参数
dubbo服务invoker调用返回
DecodeHandler
封装Request 对象,send()
invoke(invocation)
调用链,在生成invoker的时候包了一堆
Exchanger层
netty的Channel
DecodeHandler(也是走父类的AbstractChannelHandlerDelegate)
.addLast(\"decoder\
Request对象
xxxfilter
这个主要是使用线程池分发接收到的消息,如果消息是个请求消息,而且是因为线程池满了而拒绝的话,就快速响应个server端线程池错误
ExchangeCodec
RegistryProtocol.refer()
DubboInvoker
这个是进行一个decode操作
NettyServerHandler
解码
根据invocation信息,生成serviceKey,然后再根据serviceKey从exporterMap这个缓存中获取当时服务暴露缓存进去的exporter对象,然后获得到exporter里面封装的invoker,执行invoker.invoke(invocation)
解码操作
RegistryDirectory.notify
requestHandler(这里也是父父类处理的ChannelHandlerAdapter)
Wrapper代理
ChannelBuffer
AbstractPeer
MultiMessageHandler(这个也没有这个方法,走的父类AbstractChannelHandlerDelegate)
Transporter门面
HeaderExchangeHandler
addLast(\"decoder\
decode
ExchangeCodec
Exchanger门面
netty这个pipe,in的时候顺序执行handlerout(也就是往外写数据的时候)逆序执行handler,这里是往外写,所以先是执行nettyClientHandler,然后执行这个encoder
Cluster层
这里就是对channel写入一个KEY_WRITE_TIMESTAMP属性,写入的一个时间戳
dubbo服务引用过程
某个暴露接口的实现类(xxxxImpl 当初服务暴露出去的)
requestHandler
DelegateProviderMetaDataInvoker
config层
send
encode
send(Response)
Transporter
DubboCountCodec
第一步解码decode()
没啥操作
到这里其实就是Codec层了
DubboProtocol.getSharedClient(url)
这里的DubboInvoker 拿着当时调用时的future,如果不是异步调用的话,直接就是拿着future调用get方法,在HeaderExchangeHandler的received方法将结果设置到了对应的future中,并唤醒了对应的线程,这时候DubboInvoker其实就能拿到结果,除非超时。
这里的返回结果其实就是调用方法返回的
NettyServerHandler
InvokerDelegete
MultiMessageHandler
channel.writeAndFlush(message)
设置读的时间戳,判断是不是心跳请求与心跳响应,如果是心跳请求的话,需要封装响应,然后send()出去
多消息处理handler,判断message类型是MultiMessage的话就遍历给下游的handler
这里其实就是Request或者是Respose封装的内容进行解码操作
HeaderExchangeHandler
NettyChannel
invoke()
第一步
一堆过滤器
Transporters.connect
Registry
DubboProtocol.refer()
Directory
AllChannelHandler(这个也是走的父类方法WrappedChannelHandler)
ReferenceCountExchangeClient
这里就是对channel添加了个KEY_WRITE_TIMESTAMP的一个属性,然后对这个future对象设置一个sent属性,就是一个写出的时间戳
RegistryDirectory.toInvokers
NettyClientHandler
当服务提供者返回的时候,服务调用者接收的顺序是正序的,在这里也就是先decoder,然后在handler
decode()
这里接收到消息后,先设置读的时间,然后判断message的类型,如果是request请求的话,判断是不是时间请求,如果是普通双向请求,就会封装Respose,将Request的invocation获得出来,然后调用requesthandler的reply方法获得调用结果值,调用异常的话,将异常封装到Response中,然后将Response写到这个Channel里面
这里是站在提供者的角度,然后当调用请求来的时候,netty的handler是按顺序执行,这里需要执行decode,然后再执行nettyServerHandler
接下来就是netty pipe链处理
AllChannelHandler
这里是获取线程池,然后交给线程池处理,如果是线程池满了,拒绝了就快速响应给调用端
NettyClient(这里其实是执行的父类的方法)
提供者端提供服务流程
NettyClientHandler
new HeaderExchangeClient()
new NettyClient().doOpen()
Cluster.join()
buffer.writeBytes
RegistryProtocol.doRefer()
MultiMessageHandler
若干Filter
FailoverCluster.join()
Protocol
DubboProtocol.getClients(url)
ReferenceConfig.createProxy()
这里是netty的channel
RegistryDirectory
0 条评论
回复 删除
下一页