商城架構(gòu)演變

性能

一開始的重點(diǎn)是提高服務(wù)的性能、反應(yīng)速度攀例,并且盡可能的保證系統(tǒng)的安全振坚。

第一階段

第一階段

商城第一階段的框架采用的是傳統(tǒng)的動(dòng)靜分離+負(fù)載均衡的配置购撼。

  • 最外層是采用F5做的負(fù)載均衡和反向代理
  • 兩臺(tái)Ngnix服務(wù)器負(fù)責(zé)處理靜態(tài)資源的請(qǐng)求媒佣,并將動(dòng)態(tài)請(qǐng)求分發(fā)給Tomcat服務(wù)器集群
  • 商城的應(yīng)用(網(wǎng)站匕累、觸屏版等)都建立在Tomcat服務(wù)器上,主要采用SpringMVC + Freemarker
  • 應(yīng)用通過API服務(wù)器暴露出的接口對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的操作

第二階段

第二階段框架的出現(xiàn)是為了解決第一階段暴露出的幾個(gè)問題:

  • Tomcat服務(wù)器過于忙碌:

    • Tomcat服務(wù)器的一般工作流為:接收到Ngnix服務(wù)器轉(zhuǎn)發(fā)的動(dòng)態(tài)請(qǐng)求 => 將動(dòng)態(tài)請(qǐng)求按照業(yè)務(wù)邏輯調(diào)用API服務(wù)器的接口 => 將API服務(wù)器返回的數(shù)據(jù)和Freemarker結(jié)合丈攒,生成HTML文件
    • 對(duì)于經(jīng)常被訪問到的頁面(首頁、商品詳情頁等)授霸,Tomcat服務(wù)器需要不斷重復(fù)他的一般工作流巡验,即使最后生成的HTML文件都是一模一樣的。
  • Tomcat服務(wù)器API服務(wù)器交互過于頻繁:即使API服務(wù)器有如memcached類的緩存碘耳,依然會(huì)有很多不必要的網(wǎng)絡(luò)消耗

因此显设,我們覺得最好能將HTML文件緩存下來

第二階段

我們?cè)?code>Tomcat服務(wù)器上加上了EhCache過濾器。一些經(jīng)常會(huì)被訪問到的頁面(譬如首頁辛辨、商品詳情頁等)在第一次被訪問過并成功生成HTML頁面后捕捂,會(huì)被記錄在內(nèi)存中,下一次訪問的時(shí)候就不會(huì)再向API服務(wù)器請(qǐng)求斗搞,也不會(huì)再解析Freemarker模板指攒,內(nèi)存中的頁面會(huì)直接返回。

第三階段

第二階段的框架一上線就暴露出了問題:頁面不能及時(shí)更新僻焚,需要等EhCache自帶的緩存更新機(jī)制(通常是緩存池滿了)激活允悦,緩存才會(huì)更新;而我們需要緩存更新是及時(shí)的虑啤、是可控的隙弛。

所以架馋,我們自制了一個(gè)叫Backbone的微服務(wù)

第三階段

其實(shí)Backbone目前就被當(dāng)成了一個(gè)定時(shí)任務(wù)系統(tǒng),只不過起名的時(shí)候全闷,我們對(duì)這個(gè)系統(tǒng)寄以重托叉寂,所以給了一個(gè)很大的名號(hào)。

工作流是這樣的:

  • 當(dāng)有緩存的內(nèi)容進(jìn)入EhCache的時(shí)候总珠,Backbone會(huì)接收到請(qǐng)求的參數(shù)
  • Backbone根據(jù)接收到的請(qǐng)求參數(shù)屏鳍,按照業(yè)務(wù)邏輯,請(qǐng)求API服務(wù)器姚淆;之后將API服務(wù)器返回的結(jié)果拼接孕蝉,生成一個(gè)簽名,最后將<請(qǐng)求參數(shù)腌逢,簽名>存入Redis
  • Backbone定期從Redis中取出請(qǐng)求參數(shù)降淮,并按照頁面邏輯,請(qǐng)求API服務(wù)器搏讶,如果API服務(wù)器返回的結(jié)果拼接后的簽名和Redis中存的簽名一致佳鳖,則無變化;如果不一致媒惕,Backbone會(huì)刪除Redis中的記錄系吩,并調(diào)用Tomcat服務(wù)器暴露的接口刪除EhCache中該請(qǐng)求的緩存。

第四階段

第三階段的框架還是有瑕疵妒蔚,有這么三個(gè)最為明顯:

  • 既然第二次訪問同鏈接訪問的是緩存的內(nèi)容穿挨,為什么還要到Tomcat服務(wù)器才處理
  • 緩存的HTML文件能不能看到
  • EhCache中存的很多數(shù)據(jù)都是冗余的

于是,我們采用了Ngnix+Lua的方式來解決上面三個(gè)問題肴盏。

第四階段

Ngnix服務(wù)器Tomcat服務(wù)器生成的HTML文件保存到Redis中科盛,這樣Redis就被做成了Ngnix服務(wù)器集群統(tǒng)一存儲(chǔ)HTML文件的地方。

優(yōu)化

日志系統(tǒng)

經(jīng)過四個(gè)階段的性能優(yōu)化菜皂,整個(gè)商城的服務(wù)應(yīng)該算OK贞绵,接下來我們想讓開發(fā)調(diào)試更輕松一些愁茁。

我們覺得目前開發(fā)調(diào)試的瓶頸是日志:

  • 一方面 因?yàn)檎江h(huán)境需要堡壘機(jī)才能操作橘券,如果需要通過看日志來解決問題,需要到堡壘機(jī)看日志或者讓運(yùn)維拖日志下來竖伯,整個(gè)流程非常的難受章母。日志不是什么生死攸關(guān)的東西母蛛,我們想要看到線上實(shí)時(shí)的日志。
  • 日志中打印了很多很多的內(nèi)容乳怎,使用tail -f之類的命令溯祸,滾屏?xí)浅5目欤@樣看日志太傷神了。我們想要更優(yōu)雅焦辅、更簡單的查看日志的方法博杖。

一種解決方法是將日志保存到專門的一臺(tái)服務(wù)器,然后通過tail -f XX | grep XXX之類的命令來看筷登。這種方法是能基本解決以上兩個(gè)問題剃根,但是不那么優(yōu)雅,不能算作一個(gè)系統(tǒng)的解決方案前方。

于是狈醉,我們采用了ElasticSearch + LogStash + KinabaELK)。一開始我們想自己利用Bootstrap或者Framework7寫一套系統(tǒng)惠险,但是太懶苗傅,同時(shí)也發(fā)現(xiàn)ELK已經(jīng)把我們想做的都做了,有些小功能班巩,我們改改Kinaba就能實(shí)現(xiàn)渣慕,所以直接把ELK拿來用了。

首先我們自制了一個(gè)Admin微服務(wù)來監(jiān)聽處理Tomcat服務(wù)器通過MQ發(fā)送過來的日志

日志系統(tǒng)

日志服務(wù)的工作流是這樣的:

  • Tomcat服務(wù)器的日志會(huì)被發(fā)送到MQExchanger
  • Admin系統(tǒng)會(huì)將監(jiān)聽到的日志進(jìn)行處理(Tomcat服務(wù)器的日志利用拓展log4j.appender抱慌,封裝了一些附加信息)逊桦,打印到admin-log.log文件中
  • LogStash會(huì)分析admin-log.log,并將分析的結(jié)果實(shí)時(shí)的放入ElasticSearch
  • KinabaElasticSearch提供了一個(gè)可視化的界面抑进,在這個(gè)界面中强经,我們能篩選日志,能實(shí)時(shí)打印日志

小助手

最初的想法是利用Slack + Hubot寺渗,但是依然是因?yàn)閼心淝椋D(zhuǎn)用了微信。

微信小助手的主要用處就是檢查服務(wù)的上線狀態(tài)信殊,發(fā)送上線檢查之類的關(guān)鍵字炬称,就會(huì)激活我們寫的檢查程序,主要涉及商城頁面能不能正常打開鸡号,有些流程能不能走通转砖,如果走不通是因?yàn)楦鶤PI服務(wù)器的溝通斷了還是API服務(wù)器壞了還是什么须鼎。其次還加上了一些權(quán)限設(shè)置以及小助手注冊(cè)機(jī)制等等鲸伴。

未完待續(xù)

之前堅(jiān)持要自己做日志系統(tǒng),還有部分原因是會(huì)根據(jù)分析日志得到的結(jié)果加上推薦系統(tǒng)和優(yōu)化搜索晋控。

未完待續(xù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汞窗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赡译,更是在濱河造成了極大的恐慌仲吏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裹唆,居然都是意外死亡誓斥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門许帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳坑,“玉大人,你說我怎么就攤上這事成畦【喾遥” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵循帐,是天一觀的道長框仔。 經(jīng)常有香客問我,道長拄养,這世上最難降的妖魔是什么离斩? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮衷旅,結(jié)果婚禮上捐腿,老公的妹妹穿的比我還像新娘。我一直安慰自己柿顶,他們只是感情好茄袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘁锯,像睡著了一般宪祥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上家乘,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天蝗羊,我揣著相機(jī)與錄音,去河邊找鬼仁锯。 笑死耀找,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的业崖。 我是一名探鬼主播野芒,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼双炕!你這毒婦竟也來了狞悲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤妇斤,失蹤者是張志新(化名)和其女友劉穎摇锋,沒想到半個(gè)月后丹拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荸恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年乖酬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融求。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剑刑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双肤,到底是詐尸還是另有隱情施掏,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布茅糜,位于F島的核電站七芭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蔑赘。R本人自食惡果不足惜狸驳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩赛。 院中可真熱鬧耙箍,春花似錦、人聲如沸酥馍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨袒。三九已至汁针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚尽,已是汗流浹背施无。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留必孤,地道東北人猾骡。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像敷搪,于是被迫代替她去往敵國和親兴想。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理购啄,服務(wù)發(fā)現(xiàn)襟企,斷路器嘱么,智...
    卡卡羅2017閱讀 134,719評(píng)論 18 139
  • Ehcache是現(xiàn)在最流行的純Java開源緩存框架狮含,配置簡單顽悼、結(jié)構(gòu)清晰、功能強(qiáng)大几迄,最初知道它蔚龙,是從Hibernat...
    安易學(xué)車閱讀 2,036評(píng)論 0 11
  • 第一次聽到深二代這個(gè)詞是在滴滴司機(jī)口 中,一次滴滴打車去南山考試映胁,礙于我是個(gè)悶 騷的人木羹,一般不主動(dòng)搭話...
    五月的星星閱讀 1,559評(píng)論 0 0
  • 濃厚的灰色云層,使得天空變得低沉解孙,太陽像是某個(gè)畫家的作品一樣掛在天上坑填,時(shí)而出現(xiàn)發(fā)出慘白的光,時(shí)而隱沒于云層背后弛姜∑旯澹空...
    安七娘閱讀 270評(píng)論 0 0
  • 解法一 使用HashMap 之所以會(huì)想到用HashMap是因?yàn)閷?duì)于每個(gè)字母,若使用HashMap的方式去查找只有O...
    wtmxx閱讀 289評(píng)論 0 0