因?yàn)樽罱玫絉PC,考察了一下thrift(facebook用的一套rpc框架)和google protocol buffer。
thrift支持的語(yǔ)言非常多,不光支持c++,java,python,ruby等非常流行的語(yǔ)言外還支持ocaml,Squeak等很少見(jiàn)的語(yǔ)言,比google protocol buffer好多了,而且已經(jīng)內(nèi)置RPC,不像google protocol buffer的RPC還藏著掖著。比較google protocol buffer和thrift的文章比較多,其中g(shù)oogle到的比較靠前的
一篇blog指出thift的c++版本對(duì)windows支持不好,我一開(kāi)始也是覺(jué)得如此,主要是thrift只提供了autoconf,automake作為構(gòu)建工具,在windows上只能用cygwin或者msys才能比較方便的編譯,而google protocol buffer提供了vc的工程文件。另外在代碼的規(guī)范性方面,的確是google protocol buffer更好。
此次移植的目的是在windows上運(yùn)行的client和compiler,因?yàn)閟erver肯定是用linux的,移植沒(méi)太大必要。根據(jù)我從前移植代碼的經(jīng)驗(yàn),發(fā)現(xiàn)妨礙移植的關(guān)鍵在于系統(tǒng)api的差異,或者是某些依賴庫(kù)的差異,如果差異太大,則移植比較麻煩。另外,在移植時(shí)我比較傾向于先移植一個(gè)最小的功能集合,并逐步完善。
在泛讀了thrift的代碼和文檔后發(fā)現(xiàn)thrift中并沒(méi)有用到非常難于移植的api,我先用thrift compiler開(kāi)始,thrift compiler很簡(jiǎn)單,基本不用修改就可以在vc2008上編譯,主要依賴的是flex和bison,在windows下也都不難找到,也可以在linux生成后,再把生成的thriftl.cc,thrifty.cc和thrifty.h直接copy過(guò)來(lái)使用。編譯完成后發(fā)現(xiàn)在處理include和externs的時(shí)候有問(wèn)題,主要是linux和windows的路徑分隔符("/"和"\\")的差異,修改main.cc里面的program_name和directory_name就可以解決了,這個(gè)問(wèn)題在msys下面也存在。
接下來(lái)就是client和server了,我打算主要使用Framed Transport+Binary protocol+nonblocking server,因?yàn)槭褂玫氖莑ibevent(在windows上已經(jīng)有移植,直接拿過(guò)來(lái)用就可以了,在linux上面用的是epoll,性能也不錯(cuò)),也沒(méi)有其他的依賴庫(kù),移植起來(lái)還是比較方便的。
先從client開(kāi)始,在TSocket中因?yàn)槭褂昧藀oll來(lái)進(jìn)行超時(shí)處理,先改成阻塞方式,將所有的非阻塞和poll相關(guān)代碼注釋掉,基本可以編譯成功,然后還有就是ctime_t的地方可以用vc的ctime_s代替,但是dbgtime的長(zhǎng)度要改成26。運(yùn)行tutorial沒(méi)什么問(wèn)題。然后就是加入超時(shí)處理了,雖然ms在windows server 2008里面引入了WSAPoll,我用的是xp,只有用select來(lái)模擬一個(gè)poll了,反正功能差不多,只是接口不太一樣。完成后就可以生成基本的client runtime庫(kù)了。
至于server,大致看了一下,里面主要的問(wèn)題是使用了socketpair和poll,主要是用來(lái)做libevent的通知。不過(guò)socketpair就自己建兩個(gè)socket然后連接起來(lái)就可以了,poll用之前client的select模擬實(shí)現(xiàn),移植起來(lái)問(wèn)題應(yīng)該不大。
client的代碼因?yàn)橐浦矔r(shí)間比較緊,只有半天時(shí)間,還沒(méi)清理,就不放上來(lái)丟人了。
只發(fā)一個(gè)tutorial的client的exe(需要vc9的runtime才能運(yùn)行),修改后的Framed Transport+Binary protocol+nonblocking server的linux server代碼和compiler的vc9工程代碼。
下載