你們好,我是Java最全面試題庫
的提褲姐,今天這篇是JavaEE面試題系列的第九篇,主要總結了Dubbo
相關的問題;在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
Dubbo 是一個分佈式、高性能、透明化的 RPC 服務框架
,提供服務自動註冊
、自動發現
等高效服務治理
方案。mysql
接口服務層(Service)
:該層與業務邏輯相關,根據 provider 和 consumer 的業務設計對應的接口和實現配置層(Config)
:對外配置接口,以 ServiceConfig 和 ReferenceConfig 爲中心服務代理層(Proxy)
:服務接口透明代理,生成服務的客戶端 Stub 和 服務端的 Skeleton,以 ServiceProxy 爲中心,擴展接口爲 ProxyFactory服務註冊層(Registry)
:封裝服務地址的註冊和發現,以服務 URL 爲中心,擴展接口爲 RegistryFactory、Registry、RegistryService路由層(Cluster)
:封裝多個提供者的路由和負載均衡,並橋接註冊中心,以Invoker 爲中心,擴展接口爲 Cluster、Directory、Router和LoadBlancce監控層(Monitor)
:RPC調用次數和調用時間監控,以 Statistics 爲中心,擴展接口爲 MonitorFactory、Monitor和MonitorService遠程調用層(Protocal)
:封裝 RPC 調用,以 Invocation 和 Result 爲中心,擴展接口爲 Protocal、Invoker和Exporter信息交換層(Exchange)
:封裝請求響應模式,同步轉異步。以 Request 和 Response 爲中心,擴展接口爲 Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer網絡傳輸層(Transport)
:抽象 mina 和 netty 爲統一接口,以 Message 爲中心,擴展接口爲Channel、Transporter、Client、Server和Codec數據序列化層(Serialize)
:可複用的一些工具,擴展接口爲Serialization、 ObjectInput、ObjectOutput和ThreadPoolDubbo 的客戶端和服務端有三種鏈接方式,分別是:web
一、ServiceConfig 類拿到對外提供服務的實際類 ref(如:HelloWorldImpl)
二、經過 ProxyFactory 類的 getInvoker 方法使用 ref 生成一個 AbstractProxyInvoker 實例,到這一步就完成具體服務到 Invoker 的轉化
三、接下來就是 Invoker 轉換到 Exporter 的過程:面試
一、隨機模式
。按權重設置隨機機率。在一個截面上碰撞的機率較高,但調用越大分佈越均勻
二、輪詢模式
。按公約後的權重設置輪詢比例。但存在響應慢的服務提供者會累積請求
三、最少活躍調用數
。響應快的提供者接受越多請求,響應慢的接受越少請求
四、一致hash
。根據服務提供者ip設置hash環,攜帶相同的參數老是發送的同一個服務提供者,若服務掛了,則會基於虛擬節點平攤到其餘提供者上redis
一、Failover Cluster:失敗重試
當服務消費方調用服務提供者失敗後自動切換到其餘服務提供者服務器進行重試
二、Failfast Cluster:快速失敗
當服務消費方調用服務提供者失敗後,當即報錯,也就是隻調用一次。一般這種模式用於非冪等性的寫操做。
三、Failsafe Cluster:失敗安全
當服務消費者調用服務出現異常時,直接忽略異常。這種模式一般用於寫入審計日誌等操做。
四、Failback Cluster:失敗自動恢復
當服務消費端用服務出現異常後,在後臺記錄失敗的請求,並按照必定的策略後期再進行重試。這種模式一般用於消息通知操做。
五、Forking Cluster:並行調用
當消費方調用一個接口方法後,Dubbo Client會並行調用多個服務提供者的服務,只要一個成功即返回。這種模式一般用於實時性要求較高的讀操做,但須要浪費更多服務資源
六、Broadcast Cluster:廣播調用
當消費者調用一個接口方法後,Dubbo Client會逐個調用全部服務提供者,任意一臺調用異常則此次調用就標誌失敗。這種模式一般用於通知全部提供者更新緩存或日誌等本地資源信息。sql
jdk SPI SPI :
全稱爲 (Service Provider Interface) ,是JDK內置的一種服務提供發現機制。SPI是一種動態替換髮現的機制, 好比有個接口,想運行時動態的給它添加實現,你只須要添加一個實現。咱們常常遇到的就是java.sql.Driver接口,其餘不一樣廠商能夠針對同一接口作出不一樣的實現,mysql和postgresql都有不一樣的實現提供給用戶,而Java的SPI機制能夠爲某個接口尋找服務實現。
在jdk6裏面引進的一個新的特性ServiceLoader,從官方的文檔來講,它主要是用來裝載一系列的service provider。並且ServiceLoader能夠經過service provider的配置文件來裝載指定的service provider。當服務的提供者,提供了服務接口的一種實現以後,咱們只須要在jar包的META-INF/services/目錄裏同時建立一個以服務接口命名的文件。該文件裏就是實現該服務接口的具體實現類。而當外部程序裝配這個模塊的時候,就能經過該jar包META-INF/services/裏的配置文件找到具體的實現類名,並裝載實例化,完成模塊的注入緩存
dubbo SPI:
Dubbo對JDK SPI進行了擴展,對服務提供者配置文件中的內容進行了改造,由原來的提供者類的全限定名列表改爲了KV形式的列表,這也致使了Dubbo中沒法直接使用JDK ServiceLoader,因此,與之對應的,在Dubbo中有ExtensionLoader,ExtensionLoader是擴展點載入器,用於載入Dubbo中的各類可配置組件安全
能夠通訊;
啓動 dubbo時,消費者會從zk拉取註冊的生產者的地址接口等數據,緩存在本地。每次調用時,按照本地存儲的地址進行調用;
註冊中心對等集羣,任意一臺宕機後,將會切換到另外一臺註冊中心;所有宕機後,服務的提供者和消費者仍能經過本地緩存通信。服務提供者無狀態,任一臺宕機後,不影響使用;服務提供者所有宕機,服務消費者會沒法使用,並沒有限次重連等待服務者恢復;掛掉是沒關係的,但前提是你沒有增長新的服務,若是你要調用新的服務,則是不能辦到的。服務器