Weixin4c微信公眾號框架引擎
Weixin4c 是基于C技術(shù)環(huán)境的微信公眾號框架引擎(weixin4c)
1 背景
weixin4c是一個基于C技術(shù)環(huán)境的建立在FastCGI高性能Web應(yīng)用服務(wù)器架構(gòu)上的微信公眾號框架引擎,它封裝了公眾號應(yīng)用服務(wù)器底層框架,你只需要編寫業(yè)務(wù)邏輯代碼,以回調(diào)函數(shù)機制接入框架,就能快速構(gòu)造出微信公眾號服務(wù)。
用C技術(shù)環(huán)境開發(fā)微信公眾號應(yīng)用的確有些奇怪,但是我沒有互聯(lián)網(wǎng)公司高大上的團(tuán)隊配置(俺只熟悉C)、也沒有雄厚的資金支持購買強勁的服務(wù)器(俺只有一臺單核、半G內(nèi)存、1M帶寬的阿里云最低配主機),所以只能利用最熟悉的C、利用最有限的硬件資源來玩玩微信公眾號了,如果選擇JAVA估計連跑起來都成問題。
無論用什么語言,首先都要評估所要做的項目的技術(shù)背景和技術(shù)原理,只要是開放接口都與實現(xiàn)無關(guān),采用C語言,雖然沒有大量現(xiàn)成的庫可以直接調(diào)用,但經(jīng)過評估,自己研發(fā)成本并不大。之前我專門研究了whois爬蟲技術(shù),可以把這個作為第一個功能提供給用戶使用。于是開搞!
元旦花了一天研究了微信公眾平臺開發(fā)者文檔,撰寫測試代碼以評估接口,確定設(shè)計,又花了一天做開發(fā)測試,“鈦搜索”新鮮上線,第一版提供了域名注冊信息實時查詢,而后某個工作日晚上又把框架部分和應(yīng)用部分分離,把框架提煉出來封裝成C庫,方便做其它公眾號,同時也分享給大家研究使用。
2 架構(gòu)與設(shè)計
2.1 體系架構(gòu)
通過學(xué)習(xí)微信公眾平臺開發(fā)者文檔,我的微信公眾號應(yīng)用服務(wù)器接入架構(gòu)應(yīng)該是這樣的。其中微信客戶端可以是手機、PC等,微信服務(wù)端其實只做了驗證我的應(yīng)用服務(wù)器地址,然后大量轉(zhuǎn)發(fā)客戶端請求功能,對于我要做的只是自己找網(wǎng)上主機空間搭建一個Web服務(wù)器,根據(jù)開放接口開發(fā)相應(yīng)服務(wù)對接騰訊微信服務(wù)端即可。
幸運的是,前段時間我剛好買了一個阿里云主機,雖然是低的不能再低的配置(沒錢啊),但跑跑C程序是毫無問題。
2.2 系統(tǒng)架構(gòu)
既然采用C技術(shù)環(huán)境,CGI是板上釘釘,但傳統(tǒng)的CGI存在頻繁創(chuàng)建、銷毀進(jìn)程的系統(tǒng)壓力,那就使用FastCGI吧。
本人曾經(jīng)研發(fā)過基于事件模型(epoll in Linux)的服務(wù)器軟件,感覺要完全寫好事件模型還是比較復(fù)雜,于是對Nginx的穩(wěn)定性感覺不是很有信心,還是采用老而彌堅的Apache。至于你的選擇,只要你的Web服務(wù)器軟件支持FastCGI就能使用weixin4c。
暫時還用不到數(shù)據(jù)庫或緩存服務(wù)器,以后用到了再加。
總結(jié):支持FastCGI的Web服務(wù)器軟件+FastCGI(C)模塊+(你的應(yīng)用).fcgi(weixin4c.a)。(這恐怕是世界上執(zhí)行效率最高的基于高級語言的Web技術(shù)方案了吧,呵呵呵,開發(fā)效率么...我有大量自己寫的、第三方的庫,不比JAVA、PHP開發(fā)慢哦 ^_^)
2.3 應(yīng)用結(jié)構(gòu)
公眾號應(yīng)用服務(wù)器對接微信服務(wù)器的第一步是讓微信服務(wù)器認(rèn)證自己的網(wǎng)址是否有效,具體參見微信公眾平臺開發(fā)文檔。
一旦認(rèn)證成功,你的應(yīng)用服務(wù)就算接入微信了,接下去就可以互相收發(fā)信息。
比較常見的是微信客戶端上發(fā)送文本、圖片、語音、視頻、地理位置信息等,微信服務(wù)器轉(zhuǎn)發(fā)給你的應(yīng)用服務(wù)器,應(yīng)用服務(wù)器處理后產(chǎn)生響應(yīng)信息,回復(fù)給微信客戶端。
還有一些是公眾號應(yīng)用服務(wù)器主動發(fā)送微信服務(wù)器,微信服務(wù)器轉(zhuǎn)發(fā)給微信客戶端,由于安全原因,微信服務(wù)器需要公眾號應(yīng)用服務(wù)器事先通過獲取的接口調(diào)用憑據(jù)來驗證發(fā)送者身份。
這種模式放到后面再說,前一種模式的weixin4c內(nèi)部設(shè)計結(jié)構(gòu)如下:
(在word里顯示有點小,你可以直接看源碼安裝包里的"doc/weixin4c.vsd")
Web服務(wù)器進(jìn)程根據(jù)微信服務(wù)端轉(zhuǎn)發(fā)的請求,調(diào)起應(yīng)用demo.fcgi(你可以改成"(你的公眾號應(yīng)用名).fcgi"),main函數(shù)里設(shè)置一些環(huán)境常量和回調(diào)函數(shù)指針,然后調(diào)用weixin4c.a入口函數(shù)weixin4c,weixin4c前半部分實現(xiàn)了一個FastCGI基本框架,后半部分實現(xiàn)了微信公眾號請求信息接收、篩選、分支調(diào)用的通用層框架,公眾號應(yīng)用處理邏輯由demo.fcgi回調(diào)函數(shù)來掛接實現(xiàn)。
目前實現(xiàn)的回調(diào)函數(shù)接口有:
進(jìn)程初始化函數(shù)(FastCGI長進(jìn)程啟動時執(zhí)行一次,像打開redis連接、打開數(shù)據(jù)庫連接啥啥的都可以塞這里面)
進(jìn)程銷毀前清理函數(shù)(FastCGI長進(jìn)程結(jié)束時執(zhí)行一次,其實應(yīng)用不釋放也會被系統(tǒng)釋放,但有些應(yīng)用層正常關(guān)閉操作最好還是做一下,如斷開數(shù)據(jù)庫連接)
接收事件(訂閱/關(guān)注、取消訂閱/關(guān)注)處理函數(shù)
接收文本處理函數(shù)(當(dāng)微信客戶端發(fā)送消息時觸發(fā),可以用作命令的響應(yīng))
接收圖片處理函數(shù)(以下有些響應(yīng)報文布局可能會有些問題)
接收語音處理函數(shù)
接收視頻處理函數(shù)
接收小視頻處理函數(shù)(以上有些響應(yīng)報文布局可能會有些問題)
接收地理信息處理函數(shù)
接收鏈接處理函數(shù)
備注:為什么采用靜態(tài)庫libweixin4c.a而不采用動態(tài)庫呢?因為如果采用動態(tài)庫,需要設(shè)置一大堆CGI環(huán)境變量,干脆就采用靜態(tài)庫,這樣減少框架層運行時庫依賴,方便使用。
總結(jié):"weixin4c.a"只是實現(xiàn)了一個微信公眾號分揀引擎,由cgi可執(zhí)行程序"(你的應(yīng)用名).fcgi"中的main函數(shù)調(diào)用,main函數(shù)同時還會傳遞一批回調(diào)函數(shù)指針進(jìn)去,供"weixin4c.a"分揀引擎確定請求報文類型后回調(diào),就醬紫,很簡單吧 ^_^
(具體見doc/weixin4c.doc、doc/weixin4c.vsd)
