brpc-master\src\brpc\server.cpp
server類的啟動涉及有以下幾個方法的呼叫:
addservice、start、rununtilaskedtoquit
**的幾個addservice 基本都是再呼叫addserviceinternal 方法
這個方法主要實現了:
關於protobuf的rpc的一些方法如getdescriptor、full_name等,可以參考:descriptor.h
start 基本是在呼叫startinternal 方法,主要實現了:
這裡的關鍵在於,將監聽的ip+port加入到eventloop,在brpc中是請求分發器eventdispatcher來完成,整個流程是:
建立acceptor
呼叫acceptor::startaccept
呼叫socket::create
呼叫socket::resetfiledescriptor
呼叫getglobaleventdispatcher 獲得監聽的socket對應的 eventdispatcher;這裡會呼叫initializeglobaldispatchers方法,建立dispatcher,並呼叫dispatcher的start方法,就是建立bthread來執行eventdispatcher::run方法,這裡面就是epoll_wait了,就是常說的eventloop~
呼叫eventdispatcher::addconsumer,也就是epoll_ctl 方法了,新增client發起連線的事件
這裡就是eventdispatcher::run 方法的邏輯,epoll_wait返回事件,然後遍歷事件列表,輸入事件用startinputevent 處理,輸出事件用handleepollout處理
對新建的socket呼叫socket::processevent,也就是s->_on_edge_triggered_events;
對於監聽socket,這個觸發處理函式在acceptor::startaccept裡設定成了onnewconnections,同樣是將新建立的客戶端socket新增到乙個dispatcher,並指定_on_edge_triggered_events為inputmessenger::onnewmessages,讀取客戶端寫的內容。
這裡讀取客戶端發來的請求,然後呼叫queuemessage 方法,啟動bthread呼叫processinputmessage 方法,裡面呼叫的_process方法處理請求,而這個_process 的位址也是在inputmessenger::onnewmessages 中賦值的,值等於每個handler的process(在globalinitializeordie中涉及)。
舉例來說,對普通rpc,process 實際指向 processrpcrequest方法
呼叫socket::handleepolloutrequest,呼叫請求req的on_epollout_event方法,這個方法在server往客戶端回寫時用到
此方法負責處理請求,功能包括:
void server::rununtilaskedtoquit()
stop(0/*not used now*/);
join();
}
不斷查詢s_signal_quit ,如果收到ctrl+c中斷訊號,會設定標誌位並退出while,
呼叫acceptor的stopaccept,釋放每個socket
以上就是server的部分流程,省略了很多細節,不過基本的流程大同小異:
可參考:
brpc原始碼解析(二)—— brpc收到請求的處理過程
基於protobuf實現乙個極簡版的rpc 可以通過這個了解rpc的過程
Tomcat原始碼閱讀(四)Server
lifecycle 通用介面元件生命週期方法 lifecyclebase lifecycle介面的基本實現,實現start和stop的狀態轉換規則。lifecyclembeanbase 主要實現jmxenabled的方法 standardserver server介面的標準實現,當catalina是...
Spring cloud 原始碼類
eurekaserverinitializerconfiguration 註解加入configuration spring 便可以載入改類,該類 有乙個執行緒啟動方法 override public void start catch exception ex start 就會將spring clou...
CCTextureCache類原始碼分析 2
cctexturecache類原始碼分析 2 在cctexturecache類原始碼分析 1 中,我們分析了cctexturecache如何實現 紋理快取的,但是在分析的過程中,我們忽略了很多東西,比如ccimage類 原始碼分析 1 ccimage繼承自ccobject 2 成員變數,這些變數需要...