了解更多: Java經典面試題整理及答案詳解(一) Java經典面試題整理及答案詳解(二) Java經典面試題整理及答案詳解(三) Java經典面試題整理及答案詳解(四) Java經典面試題整理及答案詳解(五) Java經典面試題整理及答案詳解(六) Java經典面試題整理及答案詳解(七) Java經典面試題整理及答案詳解(八) 本節小編整理了系統架構及項目設計相關的面試題,此類面試題往往考查的是求職者的知識面,是以大家平時要多注意積累,今天小編整理的這15個面試題大家可得掌握呦~
1.MVC模式中,各個層級的職能劃分,哪些功能寫在哪塊?
所謂的MVC設計模式實際上是一種思想,雖然從整體上來說分為了三層,但實際上裡面會劃分了許多層。
比如有一個業務的完成,要分很多步,我們是把這些步驟放在業務層還是Servlet中?
服務層是可以單獨抽取出來的,你的一個項目要充分的考慮到可擴充性,那麼絕對需要将業務層單獨抽取出來實作RPC調用。
一定要清楚的是控制層不負責任何資料庫的操作,控制層隻有一個功能就是調用業務層,業務的方法隻有一個,如果業務操作要傳回多個内容,那麼就使用Map集合傳回。
控制層一定要處理所有的錯誤操作,如果不處理,你可以直接選擇一個抛出,而後在整個的web.xml檔案裡面配置一個錯誤頁,這個錯誤頁隻要是産生了5xx異常,就自動跳轉到一個錯誤頁上顯示。

隻有把單機的MVC徹底弄清楚後才有可能牽扯到更多實際開發問題,而叢集的開發也隻是一種擴充。
2.SSO的處理流程
所謂單點登入用在什麼場景上?
CAS有一個自己的流程。
這個流程最麻煩的就是CAS伺服器的配置,因為版本差別很大,是以建議大家使用穩定版本開發。同時還需要對源代碼進行大量的修改與配置才可以得來。
3.關于讀、寫性能
資料庫的讀、寫分離。此種考慮需要根據你的實際業務需求,不能憑空設計。
有這樣一個簡單的架構:
資訊的彙總表,同時為了保證查詢性能,需要增加索引,但這張表平均每1秒要更新1000次,但這樣就和索引産生了沖突,是以定義兩張表,一張表作為更新使用,另外一張表在系統安靜下來之後進行差異的備份,而後進行資料的儲存。
以上是WEB2.0以前的概念,從WEB2.0時代開始,資料量開始暴增,于是你的老闆可能就要求你對系統進行大規模的更新,要求保證更新速度,要求保證明時性,要求保證資料的有效性。
如果這個時候的設計還是圍繞着傳統的關系型資料庫展開,那麼你的設計一定是失敗的。
4.分布式鎖
分布式鎖指的是在高并發通路的情況下使用的一種技術,所謂的高并發通路就是指多個線程對象,為了保證資源的操作完成性而實作的一種技術,這樣的技術可以簡單的了解為鎖。
如果現在多個線程在同一個虛拟機之中,正常編寫一個程式,而後這個程式裡面産生了若幹個線程,并且這些線程要操作同一資源。在這樣的情況下,為了保證資源操作的同步最簡單的處理模式就是采用synchronized關鍵字來完成。
但是這樣的做法隻适合單JVM運作的情況,而如果現在劃分到網絡上。
範例:JVM鎖
如果是多虛拟機的狀态下,這樣的設計就必須做出更改了。
5.項目的負載均衡設計
對于項目的開發需要考慮幾個核心問題:高可用(主備關系)、高并發(可以承受大并發使用者通路)、分布式。真正做到這個層次的架構,你的系統平均每天的通路量不可能低于500W使用者,如果沒有到這個量級,基本上可以肯定用這樣的架構會造成大量額外的硬體成本(雲伺服器等)。
在正規的項目開發過程之中,肯定會有專業的前端開發者,這類人員會使用ES6.0标準進行前端開發,例如:JQuery、Vue.JS、React等,是以對于這部分的設計暫時不做考慮。
在整體的設計過程之中,就必須考慮性能的均衡,當然伺服器的選擇和你要使用的技術選擇,也需要根據實際情況來确定,根據并發通路人數來決定你的技術架構。
6.複雜度
評價一個項目的好與壞,有一個最簡單的标準:時間複雜度和空間複雜度。
時間複雜度指的是你的處理邏輯非常複雜,例如:遞歸、循環結構複雜。複雜度直接的影響就是你的CPU的占用率高。
空間複雜度指的是你的占用記憶體大,例如:在JDBC進行資料查詢的時候實際上會出現一個問題,假設你的資料庫裡有1000W條資料,沒有使用分頁,那麼這些記錄都将加載到記憶體之中,是以記憶體占用率就會很高。假設資料會占用20G記憶體,你的一個伺服器一定需要為上萬人服務,那麼這個時候占用的記憶體就會非常龐大,你的伺服器根本就無法進行處理。
對于空間複雜度的操作處理,是需要通過最簡單的分頁算法實作約定,對于時間複雜度,太複雜的邏輯運算,往往不會在一台伺服器上進行,需要設計多台的開發伺服器。
7.紅綠燈系統設計
當面試公司問到這道問題,實際考慮的是你的邏輯分析能力。因為這種開發的操作從現實來看都是通過硬體模拟的,如果非要通過軟體模拟,就需要準備好可能使用到的技術:
(1)Java編寫:Graphics類進行繪制開發;
(2)WEB編寫:HTML5中提供的Canvas進行編寫。
面對此類的問題一定要有一個假設前提:
(1)是否需要有黃燈的緩沖,緩沖的變更時間;
(2)是否需要智能調整,如果發現車流量較大,則适當延遲通過時間;
(3)對于違規車輛的監控情況;
(4)還可能考慮轉向燈的設計。
實作整個操作的技術環節:
(1)定時器:Timer、TimerTask,這兩個類需要時鐘的支援,而且不準,如果要準确則需要使用QuartZ這個元件完成;
(2)描述所有的燈的變化,一定需要有一個線程的同步處理機制、synchronized、使用單例實作;
(3)既然有兩組燈,就建議設計一個單獨紅綠燈類,這個類可以使用一些參數變化完成,例如:
控制變量=0,表示紅燈;
控制變量=1,表示綠燈;
控制變量=2,表示轉向燈;
控制變量=3,表示黃燈(綠燈變為轉向燈);
控制變量=4,表示黃燈(轉向燈變為紅燈);
如果你現在隻是希望給出一組狀态,實際上就可以設定一下幾位:111,可以描述7個值。
如果要編寫還需要考慮傳感器問題:包括監控傳感器、流量傳感器。
既然已經有了各種傳感器,那麼就可以再設定幾個傳感器:車速傳感器,可以進行大資料的彙總,計算平均的車速,好為城市的交通規劃做出資料的貢獻。
開發流程:
(1)需要先實作定時進行燈的切換處理,如果你需要程式編寫,如果使用無界面編寫,這個輸出的資訊就非常麻煩了;
(2)需要考慮監控的問題,如果隻是在軟體上模拟,可以設定幾個坐标點,而真實的環境需要有傳感器;
(3)考慮資料的分析問題,可以對相應資料進行采集與彙總。
8.項目中的人員安排
任何一個技術型的公司裡面都可能有若幹個開發團隊,每個團隊的開發人數基本上就在3~6人之間,每個團隊都有1個架構師(寫代碼),而且每一個團隊對應的是一個具體的業務。在團隊裡面有3個開發,1個美工,這些是一個正規的開發團隊的組成,所有的團隊都會有項目經理存在。也要一部分公司全部請的都是架構師,這些架構師自己直接實作代碼,這一類的人群技術要求是比較高的。在整個的項目裡面還會有一些輔助人員:系統測試、支撐的人員,這些就屬于項目的維護人員。
如果你想要從事軟體行業,那麼最好的做法是不去做這些輔助的工作,而直接上手開發,這樣對你日後的發展是非常有幫助的。從最初的全棧工程師,到現在強調的是開發+運維,那麼以後是全員架構時代,所有的開發人員一定都是能獨當一面的高手。這類人的工資很高,但對于整個企業運作來講,這樣的成本是最低的。以後的開發之路:懂架構有未來。
9.密碼加密處理
加密往往都會存在一種解密程式。
毒蛇出入七步之内必有解藥。
最簡單的加密:
(1)你的原始密碼:abc;
(2)加密:cba;
如果所有的人都知道有這樣的密碼結構,那麼就可以很輕松的破解了,可是如果你在裡面追加一些内容。
你的原始密碼:abc;
鹽值:-
新密碼:c-b-a-;
如果按照原始規則,那麼現在就無法得到正确的原始密碼。也就是說鹽值是讓整個密碼看起來更加安全。
MD5的結構特征是不可逆,但是慢慢使用的時間長了,有些人就開始找到了一些規律,為了不讓這些人破解密碼,那麼就在生成密碼的時候增加一些額外的内容,這樣的内容就是鹽值,這樣就可以避免這些人來破壞。不同的項目使用不同的鹽值來進行處理。
10.商品秒殺設計方案
如果要進行商品秒殺操作一定要有一個前提:預估資料量。
小米進行搶購的時候都需要針對資料量進行預估:所有的人需要報名參加搶購;
淘寶或京東搶購的時候發現缺少報名,原因是它們是依靠大資料分析系統得來的預估資料量;
如果沒有預估資料量,那麼整個系統的先期準備就會不足。如果要進行秒殺操作,可以設計以下的流程:
(1)使用者進行秒殺的登記;
(2)時間一到開始進行秒殺操作;
(3)在秒殺操作的過程中需要出現一個等待界面,如果此界面重新整理了則搶購失敗。
11.日志輸出
在一般的系統開發裡面,對于一些調試的資料都很少使用System.out進行輸出,幾乎都會配置Log4j開發包,這個開發并不複雜,你隻需要配置上開發包,而後Logger類就可以使用了。
裡面分為幾種級别:info()、error()、wraning(),如果出現了異常一定使用的是error()。
之是以使用log4j輸出,主要是友善進行調整。日志是我們解決問題的關鍵,所有的日志都應該輸出到一個指定的目錄之中,這樣的配置都是固定的,不需要做特别的處理。
需要的就是配置log4j、slf4j這樣的開發包就可以使用日志輸出了。
12.企業項目部署
實際的環境架構設計,必須要充分的考慮到你的業務需求以及所謂的高峰通路的情況。假如說你有一個系統,一年有10個人通路,那麼就不需要去搞架構了。
如果要進行架構設計,必須考慮以下幾點:
(1)該架構能否動态擴容;
(2)該架構能否支撐HA機制;
(3)該架構是否長期有效。
以上的叢集設計是為了考慮性能平衡,但是會有一個問題存在:沒有考慮到HA機制,如果考慮到高可用機制還需要追加更多的協助主機,這些主機将作為備選使用。
13.實際的項目開發
在實際的項目開發過程中,隻有一點是确定的,就是Tomcat裡面是沒有資料庫的。
如果要進行實際的項目開發,往往需要有許多的子系統。現在的開發領域經常出現一個概念:微架構。這種微架構的設計是有兩種開發技術:Duubo、SpringColud。
如果要是将項目進行子系統的規劃設計,所有的子系統裡面包含的就是所有的業務層接口以及資料層的接口。
如果你做的是一些基礎開發,那麼對于整個的開發技術而言,你隻需要一個資料庫實作資料即可。當然還要考慮庫表分離的問題,所有的資料庫不可能無限制的讓資料增長。
14.資料庫優化
資料庫本身是存儲結構資料的,資料庫優化指的是傳統的關系型資料庫操作,資料庫的優化有以下幾個使用原則:
(1)需要有一個非常專業的DBA,可以根據你的伺服器的配置調整你的資料庫的運作環境;
(2)資料庫需要選擇合适的作業系統才可以發揮優勢;
(3)保證你的查詢語句不會寫的特别荒唐,例如你大量的采用了多表查詢,在高并發的情況下依然采用同樣的方式進行;
(4)可以将部分的資料靜态化到緩存之中,例如學校、城市、姓名基本不會發生什麼變化;
如果以上的要求都做到了,資料庫的操作依然很慢,那麼就有可能是資料量太大的原因了,此時無論你再如何進行優化,你的資料庫的操作也不可能得到質的提升,這個時候就必須做先期的項目預估,這個預估的時候就需要考慮進行庫表分離的有效設計:
(1)資料的分片儲存(資料備份問題,一主多從的備份);
(2)資料的讀寫分離;
如果從程式本身的角度來講,每一個使用者的請求一定要及時的關閉好資料庫的連接配接,不要打開過多的無效連接配接,以及在項目之中應該配置資料源。
15.項目闡述
(1)項目實際上沒有大小之分,有的隻是你的業務邏輯是否清楚。
在你進行項目設計的時候應該更清楚這個項目設計的業務是否合理,可以對某一個項目進行一些頭腦風暴擴充;
(2)項目的解釋必須要有一個原則:你的項目的使用環境、預估的通路人數、以及并發量;
(3)項目的開發技術,如果是單節點的開發技術,隻需要傳統的技術名詞;
(4)如果你的項目設計的架構比價複雜,使用的服務節點比較多,這個時候你就需要清楚這些節點的作用、這些服務節點的安全處理你是如何進行的、節點間的資料互相同步處理;
(5)描述這個項目之中具備有多少個子產品,完成的周期;
(6)你做了哪些項目,這些項目裡面具體的業務是什麼。
更多專業知識,面試技巧就在面試一點通,持續更新中……
感謝浏覽~
本内容來源于
阿裡雲大學-Java面試技巧