因爲商城是基於 soa 的架構,表現層和服務層是不一樣的工程。因此要實現商品列表查詢須要兩個系統之間進行通訊。前端
如何實現遠程通訊?java
1. WebService :效率不高,基於 soap 協議。在項目中不推薦使用。web
2. 使用 restful 形式的服務: http+json 。不少項目中應用。可是有個缺點是,若是服務太多,服務之間的調用關係就很是混亂,須要治療服務。redis
3. 使用 dubbo 。使用 rpc 協議進行遠程調用,直接使用 socket 通訊。傳輸效率高,而且能夠統計出系統之間的調用關係、調用次數。可是 dubbo 也有個比較大的缺點,那就是使用它的工程必須都是用 java 開發的才行,若是一個用的java,另外一個用的PHP,就沒法使用dubbo。算法
什麼是dubbo?spring
隨着網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。Dubbo架構發展路線圖以下。json
從上圖能夠看到,發展經歷了四個階段:tomcat
1. 單一應用架構restful
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架 (ORM) 關鍵。其中1~10的意思是,當一個tomcat服務沒法知足要求時,咱們能夠增長部署tomcat的數量並用反向代理來作負載均衡。因爲不一樣的tomcat之間session要共享,方法就是要定時向其它節點進行廣播,其它tomcat發現發現與之不一樣時便會進行同步,當節點數量較多時,廣播將會佔用大部分帶寬,以致於真正的通訊所用的帶寬嚴重不足。所以該架構只能用於節點數小於10的狀況。session
2. 垂直應用架構
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。舉個例子,好比把一個大的項目拆分紅訂單系統、會員系統、前臺系統、後臺系統、搜索系統,每一個系統自成一家,服務層和web層都在一塊兒,哪一個系統壓力大,就給那個系統增長節點以提高性能。此時用於加速前端開發的Web框架(MVC)是關鍵。
3. 分佈式服務架構
當垂直應用愈來愈多,應用之間交互不可避免,這時代碼將很是臃腫(由於同一套代碼邏輯可能會被寫多遍)。這時將核心業務抽離出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用可以更快速的響應市場需求。此時用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。
4. 流動計算架構
當服務愈來愈多,容量的評估、小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。
下面咱們來看下 Dobbo 的架構:
第0步是服務提供者的發佈, provider 的發佈須要用到容器,咱們的 spring 即是專門用來作容器的,所以服務提供者的發佈須要用到 spring 。
第1步是進行註冊,就是說服務提供者在發佈以後,要在dubbo的註冊管理中心進行註冊,扮演Registry(註冊中心的最好是zookeeper,其次能夠選擇redis),這樣註冊中心便知道有哪些服務可供消費者使用了。
第2步是消費者要調用服務,可是它是不知道有哪些服務可供調用的,所以它須要先到註冊中心進行詢問,查詢一下是否有本身想要調用的服務。
第3步註冊中心查找以後發現有匹配的服務可供調用,便會向消費者返回可供調用的服務的IP和端口號。
第4步消費者拿到IP和端口號以後,便再也不須要通過註冊中心,直接就能夠訪問服務了(這就是第4步)
第5步是指dobbo想要監測都是哪些消費者調用了哪些服務,調用了多少次,這樣便於管理。
上圖的節點角色說明:
1. Provider:暴露服務的服務提供方。
2. Consumer:調用遠程服務的服務消費方。
3. Registry:服務註冊與發現的註冊中心。
4. Monitor:統計服務的調用次數和調用時間的監控中心。
5. Container:服務運行容器。
調用關係說明:
0.服務容器負責啓動、加載,運行服務提供者。
1.服務提供者在啓動時,向註冊中心註冊本身提供的服務。
2.服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
3.註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
5.服務消費者和服務提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。