為什么要使用分布式架構?分布式架構解決了互聯網應用的兩大難題:高並發和高可用。高並發指服務器並發處理客戶端請求的數量大,而高可用指后端服務能始終處於可用狀態。
關於高並發,單機所能提供的並發量總是有限的。其受限於網絡帶寬、單機內存、CPU等。舉個例子,假如單機需要10000並發請求,每次請求100KB,則需要10000x0.1MB=1000MB的流量,也就是1000MBx8=8000Mb的帶寬(Byte與byte的轉換);如果使用Tomcat容器的默認Socket阻塞通信,每個請求啟動一個處理線程,每個線程占用1M,則需要10000MB=10G內存。這會帶來高昂的服務器成本。過多的線程會導致CPU的線程切換成本變大,以及JVM的GC能力負擔等。而分布式架構可以將請求壓力分散到集群的多台機器上。
注釋:Web容器通常都需要配置最大並發請求數,Tomcat默認為150,也就是Tomcat中用來轉發請求的線程池大小。
關於高可用,單體應用僅部署在單機上,一旦單點故障,客戶端將無法訪問服務。為了解決單點問題,引入分布式架構。分布式架構中,同一服務會部署在多台服務器上,一旦一台服務器宕機,其他服務器可以提供相同的服務。
Dubbo就是眾多分布式框架中優秀的一種。Dubbo自己的定義如下:Apache Dubbo is a high-performance,java based,open source RPC framework. Dubbo是一個高性能的、基於Java的、開源的RPC框架。
高性能體現在多個方面,比如基於Netty的異步非阻塞IO,還比如基於TCP協議封裝的簡潔的dubbo協議。那么,什么是RPC框架呢?
在Spring經典的三層架構中,一個service調用另一個service的方法通常如下:
訂單服務的實現類中調用用戶接口的方法,同時用戶接口擁有一個實現類。在Spring環境下運行時,會自動生成用戶類的代理實現類,以處理事務、日志等功能。此時,所有的接口和類都存在於同一個JVM中,通過JVM指令來調用方法。
RPC(Remote Procedure Call):遠程過程調用,也叫遠程方法調用。指一個程序通過網絡調用遠程程序的方法的過程。分布式環境中,由於程序方法並不在同一JVM種,只能通過網絡進行調用。兩個服務均依賴同一套接口,而RPC框架則封裝了網絡請求部分,通過動態代理進行調用,使程序員在調用遠程方法時能夠像調用本地方法一樣順滑。
Dubbo使用什么網絡協議進行遠程方法的調用?Dubbo默認的協議為自定義的dubbo協議,同時也支持HTTP、Hessain、gRPC、webService、rmi、redis、rest、thrift、memcached等眾多協議。需要用戶根據不同的場景選用合適的協議。
- dubbo協議:采用單一長連接和NIO異步通訊,適合於小數據量 大並發的服務調用,以及服務消費者數量遠大於服務提供者數量的情況。文件上傳等大數據量操作不適合此協議,建議數據量小於100K。數據通過hessian進行二進制序列化。
HTTP協議,HTTP(HyperText Transfer Protocol):超文本傳輸協議。它是一種嚴格規范格式的應用層協議,基於TCP協議,傳輸的內容是固定格式的文本數據。
RPC框架通常封裝了TCP協議進行二進制數據的傳輸,當然也可以封裝HTTP協議來傳輸文本數據。TCP協議位於OSI模型的第四層,格式簡單,傳輸效率更高。而HTTP協議位於OSI模型的第5、6、7層,封裝了更多的格式數據,且文本格式較為松散,傳輸效率比二進制內容低,因此通常自定義TCP協議格式作為RPC框架的傳輸協議。當然 HTTP協議也具有一定的優勢,比如在一些負載不高的應用中HTTP協議與TCP協議的傳輸差別並不是系統瓶頸,而HTTP協議能與Web端協議保持一致。而且HTTP/2協議已經對復雜的格式進行了優化,性能提升很多。