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