最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

針對(duì)Dubbo接口Mock的解決方案詳解

 更新時(shí)間:2023年09月11日 15:58:59   作者:土豆肉絲蓋澆飯  
這篇文章主要為大家介紹了針對(duì)Dubbo接口Mock的解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

為了提升減輕測(cè)試回歸壓力,提高項(xiàng)目開(kāi)發(fā)交付質(zhì)量,我們開(kāi)發(fā)和測(cè)試團(tuán)隊(duì)合作在部分項(xiàng)目?jī)?nèi)執(zhí)行自動(dòng)化測(cè)試。

為了更好的理解,我們對(duì)mock的需要,先來(lái)看下wiki上對(duì)自動(dòng)化測(cè)試的解釋。

在軟件測(cè)試中, 自動(dòng)化測(cè)試指的是使用獨(dú)立于待測(cè)軟件的其他軟件來(lái)自動(dòng)執(zhí)行測(cè)試、比較實(shí)際結(jié)果與預(yù)期并生成測(cè)試報(bào)告這一過(guò)程。

我們的自動(dòng)化測(cè)試是按照我們預(yù)設(shè)的流程執(zhí)行的,我們不希望受到第三方服務(wù)的影響(上下線,接口返回錯(cuò)誤數(shù)據(jù)),所以在調(diào)用三方接口的時(shí)候,我們會(huì)采取mock,返回我們預(yù)期的數(shù)據(jù)。

在自動(dòng)化測(cè)試中,我們針對(duì)http,dubbo,mq消息這三種接口進(jìn)行了mock,本文講解的是我們對(duì)dubbo接口進(jìn)行mock的解決方案。

Dubbo目前提供方案

首先我們來(lái)看下dubbo框架本身提供的mock特性。

dubbo mock特性的核心代碼如下

//from MockClusterInvoker
public Result invoke(Invocation invocation) throws RpcException {
        Result result = null;
        //獲取方法級(jí)別mock配置
        String value = directory.getUrl().getMethodParameter(invocation.getMethodName(), Constants.MOCK_KEY, Boolean.FALSE.toString()).trim();
        //沒(méi)有配置 或者 =false
        if (value.length() == 0 || value.equalsIgnoreCase("false")) {
            //no mock
            result = this.invoker.invoke(invocation);
        } else if (value.startsWith("force")) {
            // force 開(kāi)頭 強(qiáng)制進(jìn)行mock
            if (logger.isWarnEnabled()) {
                logger.warn("force-mock: " + invocation.getMethodName() + " force-mock enabled , url : " + directory.getUrl());
            }
            //force:direct mock
            result = doMockInvoke(invocation, null);
        } else {
            //不是force的話 是失敗了再進(jìn)行mock
            //fail-mock
            try {
                result = this.invoker.invoke(invocation);
            } catch (RpcException e) {
                //如果是業(yè)務(wù)異常不進(jìn)行mock
                if (e.isBiz()) {
                    throw e;
                }
                if (logger.isWarnEnabled()) {
                    logger.warn("fail-mock: " + invocation.getMethodName() + " fail-mock enabled , url : " + directory.getUrl(), e);
                }
                result = doMockInvoke(invocation, e);
            }
        }
        return result;
    }

針對(duì)url中key=mock對(duì)應(yīng)value的不同,分別對(duì)應(yīng)3種邏輯

  • value = null 不走mock
  • value = force xxx 強(qiáng)制走mock邏輯
  • value = xxx 調(diào)用服務(wù)失敗后走mock邏輯

看第三個(gè)邏輯,有沒(méi)有感覺(jué)到這其實(shí)是一個(gè)降級(jí),失敗降級(jí),而第二個(gè)邏輯,就稱為強(qiáng)制降級(jí)了。

dubbo提供的官方文檔,也將這個(gè)mock定義為降級(jí)

想了解Dubbo Mock表達(dá)式具體如何配置,可以看 Dubbo之降級(jí)Mock源碼分析

是否滿足我們需求

我們的需求是

  • 第三方是否在線不影響我們的mock
  • 配置靈活簡(jiǎn)單

經(jīng)過(guò)測(cè)試,在設(shè)置check=false之后,給接口配置mock=force:return null之后,如果提供者不在線,會(huì)拋出沒(méi)有提供者異常,不滿足需求1

測(cè)試方式,對(duì)dubbo官方demo 增加如下配置

//from DemoServiceComponent
@Reference(mock = "force:return null",check = false)
private DemoService demoService;

對(duì)于需求2,也存在以下問(wèn)題

  • 我們不可能去動(dòng)原有項(xiàng)目中的dubbo配置,所以我們只能通過(guò)往dubbo的注冊(cè)中心增加override配置來(lái)觸發(fā)強(qiáng)制mock,使用上不方便
  • 從第1點(diǎn)也可以看到,mock功能依賴注冊(cè)中心,我們的mock環(huán)境和測(cè)試環(huán)境都是使用同一個(gè)注冊(cè)中心,不可行
  • mock value文檔不夠詳細(xì),針對(duì)復(fù)雜類型的返回,構(gòu)造費(fèi)勁

所以結(jié)論是,實(shí)現(xiàn)上和使用上都不能滿足我們需求,Dubbo的mock功能還是專注于生產(chǎn)級(jí)別的降級(jí)需求,我們需要開(kāi)發(fā)方便我們使用的mock方案。

我們開(kāi)發(fā)的擴(kuò)展方案

我們開(kāi)發(fā)針對(duì)dubbo框架的mock方案設(shè)計(jì)要點(diǎn)如下

  • 同樣的使用對(duì)Cluster擴(kuò)展點(diǎn)包裝類來(lái)植入mock邏輯,保證服務(wù)下線不影響我們自動(dòng)化測(cè)試運(yùn)行
  • 使用properties配置文件來(lái)管理接口的mock開(kāi)關(guān),配置可以托管到apollo,無(wú)代碼侵入
  • 轉(zhuǎn)發(fā)請(qǐng)求到我司的EsayMock服務(wù)器,配置接口返回類型的Json數(shù)據(jù)即可

能不能用Filter來(lái)做

之前在網(wǎng)上看到過(guò)類似的方案是使用Filter來(lái)實(shí)現(xiàn)的,其實(shí)我們第一版也是通過(guò)Filter來(lái)做,但是存在一個(gè)問(wèn)題,我們mock的接口的提供者必須在線。

下面從源碼的角度來(lái)解釋為何出現(xiàn)這個(gè)問(wèn)題

在使用zookeeper為注冊(cè)中心,以及check=false的前提下

Filter邏輯的植入是通過(guò)Protocol的包裝類ProtocolFilterWrapper,ProtocolFilterWrapper會(huì)對(duì)除了RegistryProtocol的其他Protocol植入Filter調(diào)用鏈邏輯。

//from ProtocolFilterWrapper
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
    if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
        return protocol.refer(type, url);
    }
    return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);
}

問(wèn)題就出在RegistryProtocol,RegistryProtocol通過(guò)Cluster,Directory模塊間接依賴了DubboProtocl,而在Directory模塊中,也就是RegistryDirectory中會(huì)對(duì)提供者數(shù)量進(jìn)行檢查,如果為0,會(huì)拋出異常。這一切都發(fā)生在對(duì)DubboProtocl生成的invoker調(diào)用之前。

DubboProtocol生成的invoker,封裝了filter邏輯以及對(duì)遠(yuǎn)端服務(wù)調(diào)用邏輯

RegistryProtcol生成的invoekr,在DubboProtocol基礎(chǔ)上封裝了集群調(diào)用,負(fù)載均衡等服務(wù)治理功能

//from RegistryDirectory
private void refreshInvoker(List<URL> invokerUrls) {
        Assert.notNull(invokerUrls, "invokerUrls should not be null");
        //這邊為什么是一個(gè),針對(duì)沒(méi)有提供者目錄,dubbo框架會(huì)自動(dòng)返回一個(gè)empty的url
        if (invokerUrls.size() == 1
                && invokerUrls.get(0) != null
                && Constants.EMPTY_PROTOCOL.equals(invokerUrls.get(0).getProtocol())) {
            this.forbidden = true; // Forbid to access
            this.invokers = Collections.emptyList();
            routerChain.setInvokers(this.invokers);
            destroyAllInvokers(); // Close all invokers
        }
        //...
}
public List<Invoker<T>> doList(Invocation invocation) {
        if (forbidden) {
            // 1. No service provider 2. Service providers are disabled
            throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, "No provider available from registry " +
                    getUrl().getAddress() + " for service " + getConsumerUrl().getServiceKey() + " on consumer " +
                    NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() +
                    ", please check status of providers(disabled, not registered or in blacklist).");
        }
        //...
}

 沒(méi)看過(guò)dubbo源碼的朋友可能看不懂,你可以看了dubbo refer原理之后再來(lái)品味

不足

mock服務(wù)器中的json和dubbo接口不是強(qiáng)關(guān)聯(lián),不過(guò)問(wèn)題不大,我們跑的都是預(yù)設(shè)流程。

開(kāi)源項(xiàng)目

講了這么多,都是原理性的內(nèi)容,下面貼上鏈接,歡迎大家使用以及提建議。

dubbo-easy-mock 項(xiàng)目地址

以上就是針對(duì)Dubbo接口Mock的解決方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Dubbo接口Mock解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring AOP AspectJ使用及配置過(guò)程解析

    Spring AOP AspectJ使用及配置過(guò)程解析

    這篇文章主要介紹了Spring AOP AspectJ使用及配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 如何利用jwt來(lái)保護(hù)你的接口服務(wù)

    如何利用jwt來(lái)保護(hù)你的接口服務(wù)

    項(xiàng)目軟件要對(duì)外提供部分定制接口,為了保證軟件數(shù)據(jù)的安全性,這篇文章主要給大家介紹了關(guān)于如何利用jwt來(lái)保護(hù)你的接口服務(wù)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Spring?MVC核心原理深度剖析:從請(qǐng)求到響應(yīng)的魔法解密

    Spring?MVC核心原理深度剖析:從請(qǐng)求到響應(yīng)的魔法解密

    本文將帶大家深入探索Spring?MVC的核心工作原理,不僅是為了應(yīng)付面試,更是為了能在實(shí)際開(kāi)發(fā)中寫出更高效、更健壯的Web應(yīng)用,無(wú)論你是剛接觸Spring?MVC的新手,還是有一定經(jīng)驗(yàn)的老兵,相信本文都能給你帶來(lái)新的啟發(fā),感興趣的朋友一起學(xué)習(xí)吧
    2025-08-08
  • 關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法(全網(wǎng)最細(xì)!)

    關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法(全網(wǎng)最細(xì)!)

    404頁(yè)面的出現(xiàn)會(huì)降低用戶體驗(yàn),那么導(dǎo)致404頁(yè)面出現(xiàn)的原因是什么呢?這篇文章主要給大家介紹了關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 一文詳解Java17中LinkedList類的用法和應(yīng)用場(chǎng)景

    一文詳解Java17中LinkedList類的用法和應(yīng)用場(chǎng)景

    LinkedList 是 Java 集合框架中基于雙向鏈表實(shí)現(xiàn)的類,實(shí)現(xiàn)了 List 和 Deque 接口,本文將為大家介紹一下它在Java 17 中如何更高效的使用吧
    2025-03-03
  • Java設(shè)計(jì)模式之原型設(shè)計(jì)示例詳解

    Java設(shè)計(jì)模式之原型設(shè)計(jì)示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java的原型設(shè)計(jì)模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • springboot整合redis集群過(guò)程解析

    springboot整合redis集群過(guò)程解析

    這篇文章主要介紹了springboot整合redis集群過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • hadoop 單機(jī)安裝配置教程

    hadoop 單機(jī)安裝配置教程

    單機(jī)安裝主要用于程序邏輯調(diào)試。安裝步驟基本通分布式安裝,包括環(huán)境變量,主要Hadoop配置文件,SSH配置等,需要的朋友可以參考下
    2012-11-11
  • 解決IDEA中不能正常輸入光標(biāo)變粗的問(wèn)題

    解決IDEA中不能正常輸入光標(biāo)變粗的問(wèn)題

    這篇文章主要介紹了在IDEA中不能正常輸入光標(biāo)變粗的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • idea構(gòu)建web項(xiàng)目的超級(jí)詳細(xì)教程

    idea構(gòu)建web項(xiàng)目的超級(jí)詳細(xì)教程

    好多朋友在使用IDEA創(chuàng)建項(xiàng)目時(shí),總會(huì)碰到一些小問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于idea構(gòu)建web項(xiàng)目的超級(jí)詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03

最新評(píng)論

昌宁县| 乌鲁木齐市| 林甸县| 温宿县| 壶关县| 沧州市| 乌拉特前旗| 绥宁县| 台北县| 隆子县| 仁化县| 寻乌县| 枣阳市| 安吉县| 清涧县| 涿鹿县| 威信县| 玛纳斯县| 安达市| 甘孜| 米易县| 顺昌县| 怀来县| 宣汉县| 抚州市| 寿阳县| 枝江市| 城市| 安乡县| 馆陶县| 广水市| 民乐县| 调兵山市| 曲阳县| 莆田市| 阿克苏市| 泸溪县| 大理市| 永昌县| 庐江县| 舟曲县|