这里写dubbo线程模型,主要是讲服务消费者和服务提供者这两大核心的线程模型。
一 dubbo服务提供者线程模型。
这里我们想得到dubbo线程模型,先启动dubbo提供者,然后jstack pid >> stack.log获取线程信息。也可以根据debug来观察信息,如下图所示。
11111.PNG主要有以下线程:
- 5 New I/O worker
- 1 New I/O server boss
- 1 dubbo-remoting-server-heartbeat-thread-1
- 1 DubboRegistryFailedRetryTimer-thread-1
- 1 ZkClient-EventThread-23-127.0.0.1:2181
- 1 main-SendThread
- 1 main-EventThread
- 6 DubboSaveRegistryCache-thread-1
- 1 DubboServerHandler-ip-thread-1
- 1 DubboResponseTimeoutScanTimer
根据jstack打印的堆栈以及相关调用链路上debug会得出一些信息。
- New I/O worker和New I/O server boss 对应netty的worker和boss线程。
- heartbeat,心跳检测,dubbo服务端启动会,会对和客户端的长连接做周期性检查。
- DubboRegistryFailedRetryTimer
dubbo服务提供者流程。
- (New I/O worker线程)当有请求进来的时候,因为是长连接,这里的请求进来指的是Channel接受到消息,首先是进入NettyHandler的messageReceived方法。
- 然后经过HeartbeatHandler判断是不是心跳请求或者响应,发现不是,则继续往下执行received。
- 再往下走,把这里的Channel,ChannelHandler,message扔给ChannelEventRunnable类,放在DubboServerHandler-xxx-thread-8线程执行。
- 该线程执行代码是在ChannelEventRunnable:run中。发现是RECEIVED,则调用DecodeHandler的received。然后执行到HeaderExchangeHandler的received。在received中,会有这个代码Response response = handleRequest(exchangeChannel, request);。然后返回结果。
网友评论