摘要:我們先來看看的繼承體系圖從圖中可以看出他有三個實現類分別是,,判斷是否需要篩選的路由,相對比較簡單沒有配置參數,直接選擇正常的獲取配置參數,判斷是否需要選擇正常選擇剔除的判斷是否的方式判斷是否協議腳本路由規則支持腳本引擎的所有腳本,比如等,
我們先來看看Router的繼承體系圖
從圖中可以看出,他有三個實現類,分別是ConditionRouter,MockInvokersSelector,ScriptRouter
判斷是否需要篩選mock invoker的路由,相對比較簡單
@Override publicScriptRouterList > route(final List > invokers, URL url, final Invocation invocation) throws RpcException { if (invocation.getAttachments() == null) { // 沒有配置參數,直接選擇正常的invoker return getNormalInvokers(invokers); } else { // 獲取mock配置參數,判斷是否需要mock String value = invocation.getAttachments().get(Constants.INVOCATION_NEED_MOCK); if (value == null) // 選擇正常invoker return getNormalInvokers(invokers); else if (Boolean.TRUE.toString().equalsIgnoreCase(value)) { // 選擇mock invoker return getMockedInvokers(invokers); } } return invokers; } private List > getMockedInvokers(final List > invokers) { if (!hasMockProviders(invokers)) { return null; } List > sInvokers = new ArrayList >(1); for (Invoker invoker : invokers) { if (invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) { sInvokers.add(invoker); } } return sInvokers; } private List > getNormalInvokers(final List > invokers) { if (!hasMockProviders(invokers)) { return invokers; } else { // 剔除mock的invoker List > sInvokers = new ArrayList >(invokers.size()); for (Invoker invoker : invokers) { if (!invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) { sInvokers.add(invoker); } } return sInvokers; } } private boolean hasMockProviders(final List > invokers) { boolean hasMockProvider = false; for (Invoker invoker : invokers) { // 判斷是否mock invoker的方式:判斷protocol是否mock協議 if (invoker.getUrl().getProtocol().equals(Constants.MOCK_PROTOCOL)) { hasMockProvider = true; break; } } return hasMockProvider; }
腳本路由規則 支持 JDK 腳本引擎的所有腳本,比如:javascript, jruby, groovy 等,通過 type=javascript 參數設置腳本類型,缺省為 javascript。
ConditionRouter文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72130.html
摘要:服務提供者代碼上面這個類會被封裝成為一個實例,并新生成一個實例。這樣當網絡通訊層收到一個請求后,會找到對應的實例,并調用它所對應的實例,從而真正調用了服務提供者的代碼。 這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進行源碼學習。總結起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構圖先畫出來.讓讀者拿著地圖跟著我的腳步,并且每一步我都提醒,現在我們在哪,我們下一...
摘要:上一篇源碼解析概要篇中我們了解到中的一些概念及消費端總體調用過程。由于在生成代理實例的時候,在構造函數中賦值了,因此可以只用該進行方法的調用。 上一篇 dubbo源碼解析——概要篇中我們了解到dubbo中的一些概念及消費端總體調用過程。本文中,將進入消費端源碼解析(具體邏輯會放到代碼的注釋中)。本文先是對消費過程的總體代碼邏輯理一遍,個別需要細講的點,后面會專門的文章進行解析。...
摘要:源碼分析條件路由規則有兩個條件組成,分別用于對服務消費者和提供者進行匹配。如果服務提供者匹配條件為空,表示對某些服務消費者禁用服務。此時第六次循環分隔符,,。第二個和第三個參數來自方法的參數列表,這兩個參數分別為服務提供者和服務消費者。 1. 簡介 上一篇文章分析了集群容錯的第一部分 -- 服務目錄 Directory。服務目錄在刷新 Invoker 列表的過程中,會通過 Router...
摘要:源碼分析一創建一個該類是基于條件表達式規則路由工廠類。路由工廠獲得配置項,默認為獲得獲得類型讀取規則獲得腳本路由獲得路由后記該部分相關的源碼解析地址該文章講解了集群中關于路由規則實現的部分。 集群——router 目標:介紹dubbo中集群的路由,介紹dubbo-cluster下router包的源碼。 前言 路由規則 決定一次 dubbo 服務調用的目標服務器,分為條件路由規則和腳本路...
摘要:首先將根據路由規則服務提供者和配置規則三種類型分開,分別放入三個集合,然后對每個集合進行修改或者通知設置禁止訪問置空關閉所有的關閉禁止訪問引用老的傳入的為空,說明是路由規則或配置規則發生改變,此時是空的,直接使用。 集群——directory 目標:介紹dubbo中集群的目錄,介紹dubbo-cluster下directory包的源碼。 前言 我在前面的文章中也提到了Directory...
閱讀 3095·2021-10-15 09:41
閱讀 3167·2021-09-22 16:05
閱讀 2405·2021-09-22 15:19
閱讀 2873·2021-09-02 15:11
閱讀 2446·2019-08-30 15:52
閱讀 832·2019-08-30 11:06
閱讀 1001·2019-08-29 16:44
閱讀 1241·2019-08-23 18:18