1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官幾個 Dubbo 微服務框架問題,把我整懵了?

        共 3028字,需瀏覽 7分鐘

         ·

        2020-11-17 04:12

        Dubbo本身并不復雜,而且官方文檔寫的非常清楚詳細,面試中dubbo的問題一般不會很多,從分層到工作原理、負載均衡策略、容錯機制、SPI機制基本就差不多了,最大的一道大題一般就是怎么設計一個RPC框架了,但是如果你工作原理分層都搞明白了這個問題其實也就相當于回答了不是嗎。

        說說Dubbo的分層?

        從大的范圍來說,dubbo分為三層,business業(yè)務邏輯層由我們自己來提供接口和實現(xiàn)還有一些配置信息,RPC層就是真正的RPC調(diào)用的核心層,封裝整個RPC的調(diào)用過程、負載均衡、集群容錯、代理,remoting則是對網(wǎng)絡傳輸協(xié)議和數(shù)據(jù)轉(zhuǎn)換的封裝。

        劃分到更細的層面,就是圖中的10層模式,整個分層依賴由上至下,除開business業(yè)務邏輯之外,其他的幾層都是SPI機制。

        能說下Dubbo的工作原理嗎?

        1. 服務啟動的時候,provider和consumer根據(jù)配置信息,連接到注冊中心register,分別向注冊中心注冊和訂閱服務

        2. register根據(jù)服務訂閱關系,返回provider信息到consumer,同時consumer會把provider信息緩存到本地。如果信息有變更,consumer會收到來自register的推送

        3. consumer生成代理對象,同時根據(jù)負載均衡策略,選擇一臺provider,同時定時向monitor記錄接口的調(diào)用次數(shù)和時間信息

        4. 拿到代理對象之后,consumer通過代理對象發(fā)起接口調(diào)用

        5. provider收到請求后對數(shù)據(jù)進行反序列化,然后通過代理調(diào)用具體的接口實現(xiàn)

        為什么要通過代理對象通信?

        主要是為了實現(xiàn)接口的透明代理,封裝調(diào)用細節(jié),讓用戶可以像調(diào)用本地方法一樣調(diào)用遠程方法,同時還可以通過代理實現(xiàn)一些其他的策略,比如:

        1、調(diào)用的負載均衡策略

        2、調(diào)用失敗、超時、降級和容錯機制

        3、做一些過濾操作,比如加入緩存、mock數(shù)據(jù)

        4、接口調(diào)用數(shù)據(jù)統(tǒng)計

        說說服務暴露的流程?

        1. 在容器啟動的時候,通過ServiceConfig解析標簽,創(chuàng)建dubbo標簽解析器來解析dubbo的標簽,容器創(chuàng)建完成之后,觸發(fā)ContextRefreshEvent事件回調(diào)開始暴露服務
        2. 通過ProxyFactory獲取到invoker,invoker包含了需要執(zhí)行的方法的對象信息和具體的URL地址
        3. 再通過DubboProtocol的實現(xiàn)把包裝后的invoker轉(zhuǎn)換成exporter,然后啟動服務器server,監(jiān)聽端口
        4. 最后RegistryProtocol保存URL地址和invoker的映射關系,同時注冊到服務中心

        說說服務引用的流程?

        服務暴露之后,客戶端就要引用服務,然后才是調(diào)用的過程。

        1. 首先客戶端根據(jù)配置文件信息從注冊中心訂閱服務

        2. 之后DubboProtocol根據(jù)訂閱的得到provider地址和接口信息連接到服務端server,開啟客戶端client,然后創(chuàng)建invoker

        3. invoker創(chuàng)建完成之后,通過invoker為服務接口生成代理對象,這個代理對象用于遠程調(diào)用provider,服務的引用就完成了

        有哪些負載均衡策略?

        1. 加權隨機:假設我們有一組服務器 servers = [A, B, C],他們對應的權重為 weights = [5, 3, 2],權重總和為10?,F(xiàn)在把這些權重值平鋪在一維坐標值上,[0, 5) 區(qū)間屬于服務器 A,[5, 8) 區(qū)間屬于服務器 B,[8, 10) 區(qū)間屬于服務器 C。接下來通過隨機數(shù)生成器生成一個范圍在 [0, 10) 之間的隨機數(shù),然后計算這個隨機數(shù)會落到哪個區(qū)間上就可以了。

        2. 最小活躍數(shù):每個服務提供者對應一個活躍數(shù) active,初始情況下,所有服務提供者活躍數(shù)均為0。每收到一個請求,活躍數(shù)加1,完成請求后則將活躍數(shù)減1。在服務運行一段時間后,性能好的服務提供者處理請求的速度更快,因此活躍數(shù)下降的也越快,此時這樣的服務提供者能夠優(yōu)先獲取到新的服務請求。

        3. 一致性hash:通過hash算法,把provider的invoke和隨機節(jié)點生成hash,并將這個 hash 投射到 [0, 2^32 - 1] 的圓環(huán)上,查詢的時候根據(jù)key進行md5然后進行hash,得到第一個節(jié)點的值大于等于當前hash的invoker。

        圖片來自dubbo官方
        1. 加權輪詢:比如服務器 A、B、C 權重比為 5:2:1,那么在8次請求中,服務器 A 將收到其中的5次請求,服務器 B 會收到其中的2次請求,服務器 C 則收到其中的1次請求。

        集群容錯方式有哪些?

        1. Failover Cluster失敗自動切換:dubbo的默認容錯方案,當調(diào)用失敗時自動切換到其他可用的節(jié)點,具體的重試次數(shù)和間隔時間可用通過引用服務的時候配置,默認重試次數(shù)為1也就是只調(diào)用一次。

        2. Failback Cluster失敗自動恢復:在調(diào)用失敗,記錄日志和調(diào)用信息,然后返回空結(jié)果給consumer,并且通過定時任務每隔5秒對失敗的調(diào)用進行重試

        3. Failfast Cluster快速失?。褐粫{(diào)用一次,失敗后立刻拋出異常

        4. Failsafe Cluster失敗安全:調(diào)用出現(xiàn)異常,記錄日志不拋出,返回空結(jié)果

        5. Forking Cluster并行調(diào)用多個服務提供者:通過線程池創(chuàng)建多個線程,并發(fā)調(diào)用多個provider,結(jié)果保存到阻塞隊列,只要有一個provider成功返回了結(jié)果,就會立刻返回結(jié)果

        6. Broadcast Cluster廣播模式:逐個調(diào)用每個provider,如果其中一臺報錯,在循環(huán)調(diào)用結(jié)束后,拋出異常。

        了解Dubbo SPI機制嗎?

        SPI 全稱為 Service Provider Interface,是一種服務發(fā)現(xiàn)機制,本質(zhì)是將接口實現(xiàn)類的全限定名配置在文件中,并由服務加載器讀取配置文件,加載實現(xiàn)類,這樣可以在運行時,動態(tài)為接口替換實現(xiàn)類。

        Dubbo也正是通過SPI機制實現(xiàn)了眾多的擴展功能,而且dubbo沒有使用java原生的SPI機制,而是對齊進行了增強和改進。

        SPI在dubbo應用很多,包括協(xié)議擴展、集群擴展、路由擴展、序列化擴展等等。

        使用方式可以在META-INF/dubbo目錄下配置:

        key=com.xxx.value

        然后通過dubbo的ExtensionLoader按照指定的key加載對應的實現(xiàn)類,這樣做的好處就是可以按需加載,性能上得到優(yōu)化。

        如果讓你實現(xiàn)一個RPC框架怎么設計?

        1. 首先需要一個服務注冊中心,這樣consumer和provider才能去注冊和訂閱服務
        2. 需要負載均衡的機制來決定consumer如何調(diào)用客戶端,這其中還當然要包含容錯和重試的機制
        3. 需要通信協(xié)議和工具框架,比如通過http或者rmi的協(xié)議通信,然后再根據(jù)協(xié)議選擇使用什么框架和工具來進行通信,當然,數(shù)據(jù)的傳輸序列化要考慮
        4. 除了基本的要素之外,像一些監(jiān)控、配置管理頁面、日志是額外的優(yōu)化考慮因素。

        那么,本質(zhì)上,只要熟悉一兩個RPC框架,就很容易想明白我們自己要怎么實現(xiàn)一個RPC框架。



        往期推薦



        5分鐘完全掌握PyPy


        5?分鐘掌握 Python 中常見的配置文件


        OpenCV人工智能圖像識別技術實操案例


        點擊下方閱讀原文加入社區(qū)會員




        點贊鼓勵一下

        瀏覽 51
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            免费黄片视频 | 国产久热精品无码激情亚洲精品 | A级毛片视频国产精品视频 | 久久亚洲AV成人影视 | 亚洲AV秘 无码 | 91做爱| 色婷婷亚洲精品 | 国产色婷婷视频在线观看 | xoxo无遮挡狂乳狂乳18 | 免费大香蕉伊人 |