1. 程式人生 > >如何清晰的、高質量的給面試官介紹自己的電商專案【借鑑】

如何清晰的、高質量的給面試官介紹自己的電商專案【借鑑】

面試有兩點:1、技術過硬。2、能說會道。

  如果自己的技術還過的去,但是表述的不盡人意,其實是吃了很大虧的,下面我來介紹一個大神的面試過程:

  面試官:請介紹一下你的電商專案。

  大神:該商城是一個綜合性的B2C電商平臺,類似於京東商城,主要針對廣大消費者。

  在整個專案中,我們採用的是nginx+tomcat來部署的(面試官可能會問nginx是誰來部署的?如何部署的?nginx的執行流程、優點),nginx一方面做載入靜態資源的伺服器,另一方面來做反向代理負載均衡。因為該專案需要在多個環境中執行,我們利用了nginx的反向代理解決了不同環境同系統訪問地址不統一帶來的問題。

  因為整個專案實現的功能較多,所以採用分散式的架構設計,整個專案包括後臺管理系統商城首頁系統搜尋系統商品詳情頁系統登入系統購物車系統訂單系統等,這樣做的好處是使每個功能模組獨立出來降低了各系統之間的耦合度,增刪一個功能不會影響其他功能模組。

如何解決了瀏覽器訪問當前頁面去載入後臺系統資料出現的跨域問題
  答:因為專案是採用分散式架構設計的,各模組之間是相互獨立的,而各模組的訪問路徑又是不同的,所以當跨域請求資料的時候會遇到跨域受限的問題。比如當用戶首次訪問該網站首頁時,首頁頁面會非同步請求後臺管理系統載入商品的類目,這是就會出現跨域受限的問題,以前開發時,如果在本模組內,我們是通過ajax非同步請求資料

的,但ajax不支援跨域,所以用ajax無法解決跨域請求資料的問題。
  最後我們使用的是jsonp來解決這個問題的。jsonp通過script標籤的src可以跨域請求的特性,載入資源,將載入的資源(通過一個方法名將資料進行包裹)當做是js指令碼解析,定義一個回撥函式(是怎麼實現的?),獲取傳入的資料。我們使用jsonp是因為jsonp的相容性比較好,並且在請求完畢後可以通過callback的方式回傳結果。但jsonp有一個缺點是只支援get請求而不支援post等其他型別的http請求。

其他系統該如何呼叫後臺系統的資料?
  答:我們可以傳送http請求來訪問後臺資料,我們想到的是使用HttpClient(Dubbo)

來解決此問題,因為HttpClient可以使用java程式碼模擬瀏覽器傳送Http請求
向外丟擲一個介面,執行過程是:
  1、建立HttpClient物件;
  2、構建請求物件post、get請求;
  3、如果有引數,就去構造請求引數,get使用URIBuilder去構造請求引數,post構建表單實體,把表單實體放入到post請求物件中。
  4、執行請求,並且接受響應;
  5、處理響應結果;
  6、釋放連線。無論執行方法是否成功,都必須釋放連線。

為什麼HttpClient實現認為是執行緒安全的?
  每次連線發起Http請求的時候都會重新建立連線(經歷3次握手),用完就會關閉連線(4次揮手),這樣會消耗很多時間,所有我們採用了連線池。如果不採用連線池,每次連線都會開啟一個埠,在大併發的情況下系統的埠資源很快就會被用完,導致無法建立新的連線。

get方法如何傳遞引數?
  答:定義URIBuilder物件,在URIBuilder裡設定引數,以key和value,都是string型別的,然後將URIBuilder放到URI中,然後將URI傳給Httpget請求。

Post方法如果傳輸資料?
  答:模擬表單提交,將資料封裝到list集合中,然後將集合資料放入構造的表單實體中,在將表單實體請求放到httppost物件中。

問題背景:
  像專案中首頁的大廣告和商品類目這些不需要經常修改的資料,如果使用者每次重新整理頁面的時候都要去資料庫中查詢,這樣會浪費資源和增加資料庫的壓力
解決思路:
  所以我們想當把這些資料新增到一個快取中,使用者去訪問的時候,先去快取中命中,如果命中失敗,再去資料庫中查詢,然後把查詢到的資料新增到快取中。
具體方案:
  目前比較主流的快取技術有RedisMemcached,單純從快取命中的角度來說,Memcached要高一些,可Redis和Memcache的差距其實並不大,但Redis提供的功能更加強大一些,讀寫速度也很快。所以我們選用了Redis來快取資料。
  redis把資料以key—value的形式快取到記憶體中,並提供了多種資料儲存型別(String、Hash、list、Set、SortedSet),還自身提供了持久化功能(2種:RDB、AOF),還可以把資料備份到磁碟中(redis的SAVE命令用於建立當前 redis資料庫的備份),防止redis宕機時的資料丟失。(會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步)。我們使用的是spring與redis的java的客戶端jedis進行整合,可以利用jedis做分片式叢集,解決了redis記憶體受限的問題。

單點登入系統
  之前實現的登入和註冊是在同一個tomcat內部完成,而現在系統架構是每一個系統都是由一個團隊進行維護,每個系統都是單獨部署執行一個單獨的tomcat,所以,不能將使用者的登入資訊儲存到session中(多個tomcat的session是不能共享的,即session共享問題),所以我們需要一個單獨的系統來維護使用者的登入資訊。我們是這樣做的,使用者去登入頁面登入,傳送含有使用者資訊的請求且會攜帶cookie去服務端資料庫查詢是否有該使用者,如果沒有提示使用者,如果有就把使用者資訊儲存到redis中,並生成一個token儲存到cookie中。

後臺管理系統
  在後臺管理系統中採用了Maven的多模組化的管理,其中採用了水平切分的方式(垂直與水平劃分的區別:垂直:功能模組明確,層次不夠清晰,程式碼重用性差。水平:層次清晰,程式碼重用性高,易於獨立維護。),將各層分層開發,這樣做的好處是程式碼重用性高層次清晰易於獨立維護。系統內部介面呼叫採用Httpclient(Dubbo),介面提供端採用RESTful風格的介面定義(一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件);系統之間的通知機制採用MQ的方式,使用ActiveMQ的實現,使用了ActiveMQ的訊息訂閱模式的訊息機;部署方面,採用了nginx+tomcat的模式,其中nginx的作用一方面是做反向代理、負載均衡、另一方面是做圖片等靜態資源的伺服器。

我負責的模組
  在此專案中我主要負責後臺管理模組,主要實現商品管理和商品規格引數管理,對商品和商品規格進行CRUD操作。在實現前臺呼叫後臺資料時,為了實現系統間的呼叫,便使用了HttpClient技術來實現此功能,在後臺提供了需要呼叫的介面。(HttpClient介紹、工作原理、優缺點)。如果在後臺對商品進行操作,為了使前臺資料與後臺資料實現同步,我們使用了ActiveMQ訊息佇列機制實現商品同步功能(ActiveMQ介紹、工作原理、優缺點)。
  在此專案中,我還參與了購物車模組的開發。在開發這個模組時候,我們考慮了會員在未登入和登入兩種情況下把商品加入購物車,後臺如何該儲存商品資訊。
  在使用者商品詳情頁點選加入購物車的時候,我們用了登入攔截器來判斷使用者是否登入。如果沒有登入,將商品資訊儲存到cookie中,當用戶登入後,再把商品持久到資料庫中;但是考慮到cookie儲存大小(4k)的問題,還有當cookie儲存的資料越多就會影響響應速度,我們決定使用redis來快取使用者在未登入狀態下的商品資訊(redis介紹、原理、優缺點),在redis中設定快取生存時間(如何做到的?),如果使用者在規定時間內沒有登入,資料便會自動刪除。如果使用者在規定時間內登入了,便會通過ActiveMQ訊息佇列機制將資料同步到資料庫中。

不管你的簡歷和工作經驗是真是假,至少要做到能自圓其說就行。


  參考連結:https://blog.csdn.net/qq_38584262/article/details/80707593