我們主要是web應(yīng)用,web規(guī)模也不能確定,有可能一天幾千萬(wàn)甚至上億的PV,也有可能根本沒人用。最初設(shè)計(jì)guzz的目的就是讓大型網(wǎng)站和小型網(wǎng)站一樣設(shè)計(jì)編寫,因?yàn)檎l(shuí)也不知道這個(gè)應(yīng)用上去以后有多少人用,同時(shí)解決系統(tǒng)被要求頁(yè)面天天改來(lái)該去的問(wèn)題。
使用guzz以來(lái)的效果:
1. 框架性能上沒有看得出的快慢區(qū)別。我覺得不會(huì)比hibernate和biatis慢,我看過(guò)他們的一些代碼,流程挺復(fù)雜的。guzz很簡(jiǎn)單,整個(gè)持久化過(guò)程需要轉(zhuǎn)手的類至少要比這兩個(gè)少很多。
2. 以前我們用hibernate較多,一般數(shù)據(jù)庫(kù)設(shè)計(jì)就是一個(gè)庫(kù),讀寫全部做。現(xiàn)在在設(shè)計(jì)時(shí)大家腦子里面直接就是分出3個(gè)數(shù)據(jù)庫(kù)(可能部署在1臺(tái)mysql上)--業(yè)務(wù)主庫(kù),臨時(shí)信息庫(kù),日志庫(kù),然后把表分到不同的庫(kù)中。然后數(shù)據(jù)庫(kù)安裝時(shí)直接主從安裝,主從使用。雖然看起來(lái)庫(kù)復(fù)雜了,但程序上沒有任何成本代價(jià),基本上已經(jīng)形成一種設(shè)計(jì)流程。這種模式感覺可以作為最佳實(shí)踐。
3. 編程上,一開始開發(fā)人員還是建個(gè)spring action類 + 在dao和manager中增加需要的方法 + 修改dispatcher-servlet.xml配置映射 + jsp實(shí)現(xiàn)view。但現(xiàn)在很多功能都是直接jsp,用taglib直接讀庫(kù),基本上后臺(tái)的讀數(shù)據(jù)庫(kù)操作頁(yè)面已經(jīng)看不到action的影子了。java代碼比先前的工程,同樣的功能少了大概60%-70%。
4. 我們的系統(tǒng)一般后臺(tái)功能比較復(fù)雜,以往編輯要改點(diǎn)東西大家都很郁悶。不過(guò)現(xiàn)在抵制少了很多,基本上就是改改jsp或者在復(fù)制1個(gè)新的jsp改改,然后傳到服務(wù)器上,一大堆集群機(jī)器的重啟工作都免了,無(wú)論是開發(fā)還是部署都很省事。和php差不多。
guzz1.2.7分表和自定義表的應(yīng)用實(shí)例:
我們有1套調(diào)查系統(tǒng),使用了這項(xiàng)技術(shù),也是第一個(gè)線上測(cè)試。每個(gè)調(diào)查都不太一樣,需要網(wǎng)友填一些東西,需要填什么,填的個(gè)數(shù)類型都不定。一個(gè)調(diào)查進(jìn)行過(guò)程中,或者結(jié)束后要求對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)報(bào)表。統(tǒng)計(jì)的內(nèi)容可能也包括那些自定義的填空題。
在1.2.7之前,我們解決方案是:將所有自定義的調(diào)查項(xiàng),按照key-value生成一個(gè)xml字符串,存儲(chǔ)到數(shù)據(jù)庫(kù)大字段中(Mysql text字段)。需要統(tǒng)計(jì)時(shí),根據(jù)mysql5.1對(duì)xml支持的新特性使用ExtraValue函數(shù)解析這個(gè)xml生成一個(gè)新表(create table xxxx select ExtraValue(xx) as a, .....from 主調(diào)查記錄表),然后在根據(jù)新的xxxx表統(tǒng)計(jì)。每次都要手工來(lái)弄,非常繁瑣。
1.2.7,使用切表和自定義屬性后,現(xiàn)在的解決方案:每次創(chuàng)建投票并建立好自定義調(diào)查項(xiàng)(自定義調(diào)查項(xiàng)存儲(chǔ)在數(shù)據(jù)庫(kù)中),根據(jù)這些自動(dòng)生成一個(gè)mysql create table的語(yǔ)句,創(chuàng)建好需要的表。在配置CustomTableView動(dòng)態(tài)的映射用戶提交的數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)的表中。完全自動(dòng),后續(xù)處理簡(jiǎn)化了很多。
而且由于整個(gè)過(guò)程是實(shí)時(shí)的,以前的過(guò)程是手工的,所以很多線上的報(bào)表功能也可以開發(fā)了。開發(fā)也非常簡(jiǎn)單,我們用guzz jsp tablib直接讀庫(kù),像操作普通java屬性一樣操作自定義屬性,一個(gè)類型的表報(bào)1個(gè)jsp。特殊調(diào)查的特殊報(bào)表也就是往服務(wù)器上放1個(gè)特殊處理的jsp,應(yīng)用都不用重啟,非常方便。
guzz1.2.7分表和自定義表的下一個(gè)應(yīng)用計(jì)劃:
這是一個(gè)計(jì)劃,還沒有做,不過(guò)我們準(zhǔn)備很快就開始做。
我們的所有系統(tǒng)對(duì)日志都有要求,日志必須記錄!但日志的開發(fā)很煩人,全是沒有技術(shù)含量的重復(fù)工作。我們準(zhǔn)備開發(fā)一個(gè)日志服務(wù),所有系統(tǒng)以后就不用開發(fā)日志了,直接使用這個(gè)服務(wù)。日志服務(wù)分為服務(wù)器端和客戶端。
服務(wù)器端:
一個(gè)標(biāo)準(zhǔn)的java web系統(tǒng),有日志數(shù)據(jù)庫(kù),用來(lái)存儲(chǔ)所有系統(tǒng)的日志信息,并提供查詢和統(tǒng)計(jì)等界面。如果有人需要查日志,就到這個(gè)系統(tǒng)來(lái)查。
服務(wù)器端有1個(gè)應(yīng)用數(shù)據(jù)庫(kù),用來(lái)創(chuàng)建和管理授權(quán)的應(yīng)用系統(tǒng)。1個(gè)新的應(yīng)用上線的時(shí)候,在這里創(chuàng)建一個(gè)應(yīng)用和他的授權(quán)碼,然后錄入他的個(gè)性日志字段和數(shù)據(jù)類型(類似上面提到調(diào)查的個(gè)性選項(xiàng)),服務(wù)器自動(dòng)在數(shù)據(jù)庫(kù)中給他創(chuàng)建1個(gè)日志表,用來(lái)存儲(chǔ)這個(gè)應(yīng)用的日志數(shù)據(jù)。我們準(zhǔn)備按季度分表,讓每個(gè)日志表1個(gè)季度分成1張子表。
客戶端:
實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)的guzz service,提供日志插入接口
- public void log(UserLog log) ;
每個(gè)系統(tǒng)開發(fā)時(shí),將日志服務(wù)的jar包放到工程中,并在guzz.xml中聲明此服務(wù),代碼直接調(diào)用就OK了。
這樣以后就不用為每個(gè)系統(tǒng)開發(fā)日志管理模塊了。并且還能獲取到統(tǒng)計(jì)某一個(gè)用戶在所有系統(tǒng)中活動(dòng)記錄的額外增強(qiáng)(例如我們可以在服務(wù)器端將日志記錄兩份,一份按應(yīng)用系統(tǒng),一份按操做者記錄)~~
|