brpc原始碼 server類

2021-10-02 07:24:36 字數 1837 閱讀 6106

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 成員變數,這些變數需要...