首先,幫忙點擊一下個人網站http://www.wenzhihuai.com/。謝謝啊,若是能夠,GitHub上麻煩給個star,之後面試能講講這個項目,GitHub地址https://github.com/Zephery/newblog
大學的時候萌生的一個想法,就是創建一個我的網站,前先後後所有推翻重改了四、5遍,如今終於能看了,下面是首頁。
css
由本來的ssh變成ssm,再變成ssm+shiro+lucene,到如今的先後臺分離。前臺使用ssm+lucene,後臺使用spring boot+shiro。其中,使用pagehelper做爲分頁,lucene用來搜索和自動補全,使用百度統計的API作了個日誌系統,統計pv和uv什麼的,同時,還有使用了JMX來觀察JVM的使用和cpu的使用率,機器學習方面,使用了adaboost和樸素貝葉斯對微博進行分類,有興趣的能夠點點
有點意思這個頁面。
本文從下面這幾個方面來說講網站的創建:
1.建站故事與網站架構
2.lucene搜索的使用
3.使用quartz來定時備份數據庫
4.使用百度統計api作日誌系統
5.使用jmx觀察jvm和cpu
6.使用druid來監測數據庫
7.使用機器學習對微博進行分析
8.網站性能優化
9.SEO優化
1.建站故事與網站架構
1.1建站過程
起初,是由於學習的時候總是找不到什麼好玩而又有挑戰性的項目,看着struts、spring、hibernate的書,全都是一些小項目,作了感受也沒啥意義,有時候在博客園看到別人還有本身的網站,特羨慕,最終就選擇了本身作一個我的網站。期初剛學的ssh,因而開始了本身的ssh搭建我的網站的行程,可是對於一個後端的人來講,前端是個大問題啊。。。。因此第一版的時候差很少全是純生的html、css、js,至少發博客這個功能實現了,可是確實無法看。前先後後折騰了一個多月,決定推翻重作,到百度看看別人怎麼作的。首先看到的是楊青的網站,已經好幾年沒更新了,前端的代碼看起來比較簡單,也是本身可以掌握的,可是不夠美觀,繼續找,在模板之家發現了一個高大上的模板。
html
第二版的界面確實是這樣的,只是把圖片的切換變成了wowslider,也是簡單的用bootstrap和pagehelper作了下分頁,如今的最終版保留了它的header,而後評論框使用了多說(超級懷念多說)。後端也由原來的ssh變成了ssm,以後加上了lucene來對文章進行索引。以後,隨着多說要關閉了,忽然之間有不少div都不適應了(我寫死了的。。。),再一次,無法看,不想看,一怒之下再次推翻重作,變成了如今這個版本。
最終版本在考慮時,也找了不少模板,影響深入的是
tale和
欲思這兩個主題,期中,tale使用的是java語言寫的,剛知道的那一刻我就沒好感了,java後端我是要本身所有寫的,tale這個頁面簡潔可是不夠炫,並且內容量過低,可能就只是個純博客,以後發現了欲思,拓展性強,只惋惜沒有靜態的版本,後臺是純生的PHP(嗯,PHP是世界上最好的語言),看了看,沒事,保存網頁,前端本身改,後端本身所有重寫,最終變成了如今這個版本,雖然拼接的時候各類css、js混入。。。。還好在作網站性能優化的時候差很少所有去掉了。最終版加入redis、quartz、shiro等,還有python機器學習、flask的restful api,可謂是大雜燴了。
頁面看着還算湊合,至少不是那種看都看不過去的那種了,可是仔細看看,仍是有很多問題的,好比瀑布流,還有排版什麼的。只能等本身何時想認真學學前端的東西了。
已經部署在騰訊雲服務器上,存儲使用了七牛雲的cdn。
1.2 網站總體技術架構
最終版的技術架構也算是用上了本身大部分所學的內容吧,雖然有些確實還不是很是理解(TT),只能在之後的專研中慢慢加深,技術架構圖以下:
前端
網站核心主要採用Spring SpringMVC和Mybatis,下圖是當訪問一篇博客的時候的運行流程,參考了
張開濤的博客。
運行流程分析
1.瀏覽器發送http請求。/blogdetail.html?blogid=1。
2.tomcat容器初始化,順序爲context-param>listener>filter>servlet,此時,spring中的bean尚未被注入的,不建議在此處加載bean,網站聲明瞭兩個類(IPFilter和CacheControlFilter),IPFilter用來攔截IP,CacheControlFilter用來緩存。
3.初始化Spring。
4.DispatcherServlet->HandlerMapping進行請求處處理的映射,HandlerMapping將「/blogdetail」路徑直接映射到名字爲「/blogdetail」的Bean進行處理,即BlogController。
5.自定義攔截器,其中BaseIntercepter實現了HandleInterceptor的接口,用來記錄每次訪問的連接以及後臺響應的時間。
6.DispatcherServlet-> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器適配爲BlogController。
7.BlogController執行查詢,取得結果集返回數據。
8.blogdetail(ModelAndView的邏輯視圖名)->InternalResourceViewResolver, InternalResourceViewResolver使用JstlView,具體視圖頁面在/blogdetail.jsp。
9.JstlView(/blogdetail.jsp)->渲染,將在處理器傳入的模型數據(blog=Blog!)在視圖中展現出來;
10.返回響應。
1.3 日誌系統
日誌系統架構以下:
java
日誌系統曾經嘗試採用過ELK,實時監控實在是讓人不能不稱讚,本地也跑起來了,可是一到服務器,卡卡卡,畢竟(1Ghz CPU、1G內存),只能放棄ELK,採用百度統計。百度統計提供了Tongji API供開發者使用,只是有次數限制,2000/日,實時的話實在有點低,只能統計前幾天的PV、UV等開放出來。其實這個存放在mysql也行,不過這些零碎的數據仍是放在redis中,方便管理。
出了日誌系統,本身對服務器的一些使用率也是挺關心的,畢竟服務器配置過低,因而利用了使用了tomcat的JMX來對CPU和jvm使用狀況進行監控,這兩個都是實時的。出了這兩個,對內存的分配作了監控,Eden、Survivor、Tenured的使用狀況。
1.4 【有點意思】天然語言處理
本人大學裏的畢業設計就是基於AdaBoost算法的情感分類,學到的東西仍是要常常拿出來看看,要否則真的浪費了我這麼久努力作的畢業設計啊。構建了一個基本的情感分類小系統,天天抓取微博進行分類存儲在MySql上,並使用flask提供Restful API給java調用,能夠點擊這裏嘗試(請忽略Google的圖片)。目前分類效果不是很明顯,準確率大概只有百分之70%,由於訓練樣本只有500條(找不到訓練樣本),機器學習真的太依賴樣本的標註。這個,只能請教各位路人大神指導指導了。
python
總結
斷斷續續,也總算作了一個能拿得出手仍要遮遮掩掩才能給別人看的網站,哈哈哈哈哈,也勞煩各位幫忙找找bug。前先後後從初學Java EE就一直設想的事也還算有了個告終,期間碰到的坑實在實在太多,甚至中途也中止了三個月的製做(實習太忙)。不過回頭一看,貌似本身的技術並無提高多少啊哈哈哈哈,好神奇,一年前知識廣度甚至還多點,如今只是代碼的規範化。好好提高本身哈哈哈。談起寫博客這件事,有時候一動筆內心就有別人博客的陰影,別人已經寫好了,本身爲何還要寫,換個角度?百度一搜,這個角度也有人寫了,無奈,深度也比本身廣,其實無論怎樣之後要多多看書,專研專研,寫點更加精品文章。PS:GitHub上求給個Star,之後面試能講講這個網站哈哈哈哈,感謝各位。mysql