1. 程式人生 > >應用架構演進《一》

應用架構演進《一》

傳統的專案遺留額外難題:

程式碼重複率高;
需求變更(開發維護)困難;
部署效率低;
學習成本高;
團隊協作效率差,部分功能重複開發;
系統可靠性變差;
維護和定製困難;
新功能上線週期變長;
缺乏統一的RPC框架:由於web框架只提供了HTTP/https協議,例如soap,smpp等協議棧需要業務自行整合第三方的開源庫岸賈,超時重發,網路斷連等底層故障需要在應用上層統一封裝和處理,工作繁瑣而且容易出錯,對業務開發人員的技能要求也非常高。

為了應對複雜的業務,通過業務公共能力抽象成原子服務,對複雜應用進行水平拆分和服務化,實現服務消費者和應用者的解耦。公共能力抽取和複用,可以有效降低公共模組重複開發建設的成本。

傳統的垂直應用架構【LAMP】:

linux+apache+php+mysql(讀寫分離);
spring+struts+ibatis+hibernate+tomcat ;
EJB

在高併發,大流量的應用場景中,需要做叢集,通常的組網方案是前端通過F5等負載均衡做七層負載均衡(或者使用SLB等軟負載),後端做對等叢集部署。

RPC: remote procedure call ,它是一種程序間通訊方式。允許像呼叫本地服務一樣呼叫遠端服務。它的具體實現方式可以不同,例如:spring的http invoker,facebook 的thrift 二進位制私有協議通訊。

RPC 的原理:prc框架的目標就是讓遠端過程(服務)呼叫更加簡單,透明,RPC框架負責遮蔽底層的傳輸方式(TCP/UDP),序列化方式(xml/json二進位制)和通訊方式。

PRC框架的核心技術點:

遠端服務提供者需要以某種形式提供服務呼叫相關的資訊,包括但不限於服務介面定義,資料結構,或者中間態的服務定義檔案。例如thrift 的IDL檔案,ws-rpc的wsdl檔案定義,甚至也可以是服務端的介面說明文件;服務呼叫者需要通過一定的途徑獲取遠端服務呼叫相關資訊,例如服務端介面定義jar包匯入,獲取服務端IDL檔案等。

 

遠端代理物件:

服務呼叫者呼叫的服務實際是遠端服務的本地代理,對於Java語言,它的實現就是JDK的動態代理,通過動態代理的攔截機制,將本地呼叫封裝成遠端服務呼叫。

通訊:

RPC框架與具體的協議無關,例如spring 的遠端呼叫支援http invoke,rmi invoke,messagepack 使用的是私有的二進位制壓縮協議。

序列化:

遠端通訊,需要將物件轉換成二進位制碼流進行網路傳輸,不同的序列化框架,支援的資料型別,資料包大小,異常型別及效能等都不同。不同的RPC框架應用場景不同,因此技術選擇也會存在很大差異。