亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

dubbo源碼解析(四十八)異步化改造

lijinke666 / 3834人閱讀

摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對(duì)于異步化的改造原理??丛创a解析四十六消費(fèi)端發(fā)送請(qǐng)求過(guò)程講到的十四的,在以前的邏輯會(huì)直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠(yuǎn)程通信層的六。

2.7大揭秘——異步化改造
目標(biāo):從源碼的角度分析2.7的新特性中對(duì)于異步化的改造原理。
前言

dubbo中提供了很多類(lèi)型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章:

dubbo源碼解析(二十四)遠(yuǎn)程調(diào)用——dubbo協(xié)議

dubbo源碼解析(二十五)遠(yuǎn)程調(diào)用——hessian協(xié)議

dubbo源碼解析(二十六)遠(yuǎn)程調(diào)用——http協(xié)議

dubbo源碼解析(二十七)遠(yuǎn)程調(diào)用——injvm本地調(diào)用

dubbo源碼解析(二十八)遠(yuǎn)程調(diào)用——memcached協(xié)議

dubbo源碼解析(二十九)遠(yuǎn)程調(diào)用——redis協(xié)議

dubbo源碼解析(三十)遠(yuǎn)程調(diào)用——rest協(xié)議

dubbo源碼解析(三十一)遠(yuǎn)程調(diào)用——rmi協(xié)議

dubbo源碼解析(三十二)遠(yuǎn)程調(diào)用——thrift協(xié)議

dubbo源碼解析(三十三)遠(yuǎn)程調(diào)用——webservice協(xié)議

官方推薦的是使用dubbo協(xié)議,而異步調(diào)用的支持也是在dubbo協(xié)議中實(shí)現(xiàn)的。

看了我之前寫(xiě)的2.7新特性的文章,應(yīng)該對(duì)于異步化改造有個(gè)大致的印象。要弄懂異步在什么時(shí)候起作用,先要弄懂dubbo 的服務(wù)暴露和引用過(guò)程以及消費(fèi)端發(fā)送請(qǐng)求過(guò)程和服務(wù)端處理請(qǐng)求過(guò)程。我在前四篇文章已經(jīng)講述了相關(guān)內(nèi)容,異步請(qǐng)求只是dubbo的一種請(qǐng)求方式,基于 dubbo 底層的異步 NIO 實(shí)現(xiàn)異步調(diào)用,對(duì)于 Provider 響應(yīng)時(shí)間較長(zhǎng)的場(chǎng)景是必須的,它能有效利用 Consumer 端的資源,相對(duì)于 Consumer 端使用多線(xiàn)程來(lái)說(shuō)開(kāi)銷(xiāo)較小??梢宰屜M(fèi)者無(wú)需阻塞等待返回結(jié)果。

經(jīng)過(guò)改良后,Provider端也支持異步處理請(qǐng)求,引用官網(wǎng)的話(huà)就是現(xiàn)在Provider端異步執(zhí)行和Consumer端異步調(diào)用是相互獨(dú)立的,你可以任意正交組合兩端配置。

如何開(kāi)啟和使用異步可以查看以下鏈接:

Provider異步執(zhí)行:http://dubbo.apache.org/zh-cn/docs/user/demos/async-execute-on-provider.html

Consumer異步調(diào)用:http://dubbo.apache.org/zh-cn/docs/user/demos/async-call.html

異步的改造 Listener做為Filter的內(nèi)部接口

從設(shè)計(jì)上

廢棄了Filter原先的onResponse()方法

在Filter接口新增了內(nèi)部接口Listener,相關(guān)接口設(shè)計(jì)如下。

優(yōu)點(diǎn):職責(zé)劃分更加明確,進(jìn)行邏輯分組,增強(qiáng)可讀性,F(xiàn)ilter本身應(yīng)僅是傳遞調(diào)用的響應(yīng),而所有回調(diào)都放入Listener。這樣做以后可以把之前回調(diào)的邏輯從invoke里面剝離出來(lái),放到Listener的onResponse或者onError中。

interface Listener {

    /**
     * 回調(diào)正常的調(diào)用結(jié)果
     * @param appResponse
     * @param invoker
     * @param invocation
     */
    void onResponse(Result appResponse, Invoker invoker, Invocation invocation);

    /**
     * 回調(diào)異常結(jié)果
     * @param t
     * @param invoker
     * @param invocation
     */
    void onError(Throwable t, Invoker invoker, Invocation invocation);
}

新增抽象類(lèi)ListenableFilter,實(shí)現(xiàn)了Filter接口,其中只記錄了一個(gè)該過(guò)濾器的內(nèi)部Listener實(shí)例。

public abstract class ListenableFilter implements Filter {

    protected Listener listener = null;

    public Listener listener() {
        // 提供該過(guò)濾器的內(nèi)部類(lèi)listener
        return listener;
    }
}
異步轉(zhuǎn)同步,新增InvokeMode

不變的是配置來(lái)決定調(diào)用方式,變的是在何時(shí)去做同步異步的不同邏輯處理。看《dubbo源碼解析(四十六)消費(fèi)端發(fā)送請(qǐng)求過(guò)程》講到的(十四)DubboInvoker的doInvoke,在以前的邏輯會(huì)直接在doInvoke方法中根據(jù)配置區(qū)分同步、異步、單向調(diào)用?,F(xiàn)在只多帶帶做了單向調(diào)用和需要返回結(jié)果的區(qū)分,統(tǒng)一先使用AsyncRpcResult來(lái)表示結(jié)果,也就是說(shuō)一開(kāi)始統(tǒng)一都是異步調(diào)用,然后在調(diào)用回到AsyncToSyncInvoker的invoke中時(shí),才對(duì)同步異步做區(qū)分,這里新增了InvokeMode,InvokeMode現(xiàn)在有三種模式:SYNC, ASYNC, FUTURE。前兩種很顯而易見(jiàn),后面一種是調(diào)用的返回類(lèi)型是Future類(lèi)型,代表調(diào)用的方法的返回類(lèi)型是CompletableFuture類(lèi)型,這種模式專(zhuān)門(mén)用來(lái)支持服務(wù)端異步的。看下面的源碼。

public static InvokeMode getInvokeMode(URL url, Invocation inv) {
    // 如果返回類(lèi)型是future
    if (isReturnTypeFuture(inv)) {
        return InvokeMode.FUTURE;
    } else if (isAsync(url, inv)) {
        // 如果是異步調(diào)用
        return InvokeMode.ASYNC;
    } else {
        // 如果是同步
        return InvokeMode.SYNC;
    }
}

參考《dubbo源碼解析(四十六)消費(fèi)端發(fā)送請(qǐng)求過(guò)程》的(十二)AsyncToSyncInvoker的invoke邏輯,如果是同步模式,就會(huì)阻塞調(diào)用get方法。直到調(diào)用成功有結(jié)果返回。如果不是同步模式,就直接返回。

ResponseFuture改為CompletableFuture

關(guān)于ResponseFuture可以參考《dubbo源碼解析(十)遠(yuǎn)程通信——Exchange層》的(六)ResponseFuture。具體的可以看它的兩個(gè)實(shí)現(xiàn)(七)DefaultFuture和(八)SimpleFuture。

在這次改造中,最小JDK版本從以前的1.6變成了1.8。當(dāng)然也要用到1.8中新特性,其中就包括CompletableFuture。dubbo的通信主要有兩處,一處是Consumer發(fā)送請(qǐng)求消息給Provider,另一處就是Provider把結(jié)果發(fā)送給Consumer。在Consumer發(fā)送請(qǐng)求消息給Provider的時(shí)候,Consumer不會(huì)一直處于等待,而是生成ResponseFuture會(huì)拋給下游去做其他操作,等到Provider把結(jié)果返回放入ResponseFuture,Consumer可以通過(guò)get方法獲得結(jié)果,或者它也支持回調(diào)。但是這就暴露了一些問(wèn)題,也就是為在新特性里提到的缺陷:

Future只支持阻塞式的get()接口獲取結(jié)果。因?yàn)閒uture.get()會(huì)導(dǎo)致線(xiàn)程阻塞。

Future接口無(wú)法實(shí)現(xiàn)自動(dòng)回調(diào),而自定義ResponseFuture雖支持callback回調(diào)但支持的異步場(chǎng)景有限,如不支持Future間的相互協(xié)調(diào)或組合等;

針對(duì)以上兩個(gè)不足,CompletableFuture可以很好的解決它們。

針對(duì)第一點(diǎn)不足,因?yàn)镃ompletableFuture實(shí)現(xiàn)了CompletionStage和Future接口,所以它還是可以像以前一樣通過(guò)阻塞或者輪詢(xún)的方式獲得結(jié)果。這一點(diǎn)就能保證阻塞式獲得結(jié)果,也就是同步調(diào)用不會(huì)被拋棄。當(dāng)然本身也不是很建議用get()這樣阻塞的方式來(lái)獲取結(jié)果。

針對(duì)第二點(diǎn)不足,首先是自動(dòng)回調(diào),CompletableFuture提供了良好的回調(diào)方法。比如下面四個(gè)方法有關(guān)計(jì)算結(jié)果完成時(shí)的處理:

public CompletableFuture     whenComplete(BiConsumer action)
public CompletableFuture     whenCompleteAsync(BiConsumer action)
public CompletableFuture     whenCompleteAsync(BiConsumer action, Executor executor)
public CompletableFuture     exceptionally(Function fn)

當(dāng)計(jì)算完成后,就會(huì)執(zhí)行該方法中的action方法。相比于ResponseFuture,不再需要自己去做回調(diào)注冊(cè)的編碼,更加易于理解。

還是針對(duì)第二點(diǎn),自定義的ResponseFuture不支持Future間的相互協(xié)調(diào)或組合,CompletableFuture很好的解決了這個(gè)問(wèn)題,在CompletableFuture中以下三個(gè)方法實(shí)現(xiàn)了future之間轉(zhuǎn)化的功能:

public  CompletableFuture     thenApply(Function fn)
public  CompletableFuture     thenApplyAsync(Function fn)
public  CompletableFuture     thenApplyAsync(Function fn, Executor executor)

由于回調(diào)風(fēng)格的實(shí)現(xiàn),我們不必因?yàn)榈却粋€(gè)計(jì)算完成而阻塞著調(diào)用線(xiàn)程,而是告訴CompletableFuture當(dāng)計(jì)算完成的時(shí)候請(qǐng)執(zhí)行某個(gè)function。而且我們還可以將這些操作串聯(lián)起來(lái),或者將CompletableFuture組合起來(lái)。這一組函數(shù)的功能是當(dāng)原來(lái)的CompletableFuture計(jì)算完后,將結(jié)果傳遞給函數(shù)fn,將fn的結(jié)果作為新的CompletableFuture計(jì)算結(jié)果。因此它的功能相當(dāng)于將CompletableFuture轉(zhuǎn)換成CompletableFuture。

除了轉(zhuǎn)化之外,還有future之間組合的支持,例如以下三個(gè)方法:

public  CompletableFuture     thenCompose(Function> fn)
public  CompletableFuture     thenComposeAsync(Function> fn)
public  CompletableFuture     thenComposeAsync(Function> fn, Executor executor)

這一組方法接受一個(gè)Function作為參數(shù),這個(gè)Function的輸入是當(dāng)前的CompletableFuture的計(jì)算值,返回結(jié)果將是一個(gè)新的CompletableFuture,這個(gè)新的CompletableFuture會(huì)組合原來(lái)的CompletableFuture和函數(shù)返回的CompletableFuture。

現(xiàn)在就能看出CompletableFuture的強(qiáng)大了,它解決了自定義ResponseFuture的許多問(wèn)題,該類(lèi)有幾十個(gè)方法,感興趣的可以去一一嘗試。

隨處可見(jiàn)的CompletableFuture

可以看到以前的版本只能在RpcContext中進(jìn)行獲取。而經(jīng)過(guò)改良后,首先RpcContext一樣能過(guò)獲取,其次在過(guò)濾器鏈返回的Result中也能獲取,可以從最新的代碼中看到,原先的RpcResult類(lèi)已經(jīng)被去除,而在AsyncRpcResult也繼承了CompletableFuture類(lèi),也就是說(shuō)有AsyncRpcResult的地方,就有CompletableFuture。并且在后續(xù)的dubbo3.0中,AsyncRpcResult將會(huì)內(nèi)置CompletableFuture類(lèi)型的變量,CompletableFuture的獲取方式也會(huì)大大增加。

AsyncRpcResult全面替代RpcResult

接下來(lái)我就來(lái)講解一下AsyncRpcResult類(lèi)。

/**
 * 當(dāng)相同的線(xiàn)程用于執(zhí)行另一個(gè)RPC調(diào)用時(shí),并且回調(diào)發(fā)生時(shí),原來(lái)的RpcContext可能已經(jīng)被更改。
 * 所以我們應(yīng)該保留當(dāng)前RpcContext實(shí)例的引用,并在執(zhí)行回調(diào)之前恢復(fù)它。
 * 存儲(chǔ)當(dāng)前的RpcContext
 */
private RpcContext storedContext;
/**
 * 存儲(chǔ)當(dāng)前的ServerContext
 */
private RpcContext storedServerContext;

/**
 * 會(huì)話(huà)域
 */
private Invocation invocation;

public AsyncRpcResult(Invocation invocation) {
    // 設(shè)置會(huì)話(huà)域
    this.invocation = invocation;
    // 獲得當(dāng)前線(xiàn)程內(nèi)代表消費(fèi)者端的Context
    this.storedContext = RpcContext.getContext();
    // 獲得當(dāng)前線(xiàn)程內(nèi)代表服務(wù)端的Context
    this.storedServerContext = RpcContext.getServerContext();
}

/**
 * 轉(zhuǎn)換成新的AsyncRpcResult
 * @param asyncRpcResult
 */
public AsyncRpcResult(AsyncRpcResult asyncRpcResult) {
    this.invocation = asyncRpcResult.getInvocation();
    this.storedContext = asyncRpcResult.getStoredContext();
    this.storedServerContext = asyncRpcResult.getStoredServerContext();
}

上面的是AsyncRpcResult核心的變量以及構(gòu)造函數(shù),storedContext和storedServerContext存儲(chǔ)了相關(guān)的RpcContext實(shí)例的引用,為的就是防止在回調(diào)的時(shí)候由于相同的線(xiàn)程用于執(zhí)行另一個(gè)RPC調(diào)用導(dǎo)致原來(lái)的RpcContext可能已經(jīng)被更改。所以存儲(chǔ)下來(lái)后,我們需要在執(zhí)行回調(diào)之前恢復(fù)它。具體的可以看下面的thenApplyWithContext方法。

@Override
public Object getValue() {
    // 獲得計(jì)算的結(jié)果
    return getAppResponse().getValue();
}

@Override
public void setValue(Object value) {
    // 創(chuàng)建一個(gè)AppResponse實(shí)例
    AppResponse appResponse = new AppResponse();
    // 把結(jié)果放入AppResponse
    appResponse.setValue(value);
    // 標(biāo)志該future完成,并且把攜帶結(jié)果的appResponse設(shè)置為該future的結(jié)果
    this.complete(appResponse);
}

@Override
public Throwable getException() {
    // 獲得拋出的異常信息
    return getAppResponse().getException();
}

@Override
public void setException(Throwable t) {
    // 創(chuàng)建一個(gè)AppResponse實(shí)例
    AppResponse appResponse = new AppResponse();
    // 把異常放入appResponse
    appResponse.setException(t);
    // 標(biāo)志該future完成,并且把攜帶異常的appResponse設(shè)置為該future的結(jié)果
    this.complete(appResponse);
}

@Override
public boolean hasException() {
    // 設(shè)置是否有拋出異常
    return getAppResponse().hasException();
}

public Result getAppResponse() {
    // 如果該結(jié)果計(jì)算完成,則直接調(diào)用get方法獲得結(jié)果
    try {
        if (this.isDone()) {
            return this.get();
        }
    } catch (Exception e) {
        // This should never happen;
        logger.error("Got exception when trying to fetch the underlying result from AsyncRpcResult.", e);
    }
    // 創(chuàng)建AppResponse
    return new AppResponse();
}

這些實(shí)現(xiàn)了Result接口的方法,可以發(fā)現(xiàn)其中都是調(diào)用了AppResponse的方法,AppResponse跟AsyncRpcResult一樣也繼承了AbstractResult,不過(guò)它是作為回調(diào)的數(shù)據(jù)結(jié)構(gòu)。AppResponse我會(huì)在異步化過(guò)濾器鏈回調(diào)中講述。

@Override
public Object recreate() throws Throwable {
    // 強(qiáng)制類(lèi)型轉(zhuǎn)化
    RpcInvocation rpcInvocation = (RpcInvocation) invocation;
    // 如果返回的是future類(lèi)型
    if (InvokeMode.FUTURE == rpcInvocation.getInvokeMode()) {
        // 創(chuàng)建AppResponse實(shí)例
        AppResponse appResponse = new AppResponse();
        // 創(chuàng)建future
        CompletableFuture future = new CompletableFuture<>();
        // appResponse設(shè)置future值,因?yàn)榉祷氐木褪荂ompletableFuture類(lèi)型
        appResponse.setValue(future);
        // 當(dāng)該AsyncRpcResult完成的時(shí)候,把結(jié)果放入future中,這樣返回的就是CompletableFuture包裹的結(jié)果
        this.whenComplete((result, t) -> {
            if (t != null) {
                if (t instanceof CompletionException) {
                    t = t.getCause();
                }
                future.completeExceptionally(t);
            } else {
                if (result.hasException()) {
                    future.completeExceptionally(result.getException());
                } else {
                    future.complete(result.getValue());
                }
            }
        });
        // 重置
        return appResponse.recreate();
    } else if (this.isDone()) {
        // 如果完成,則直接重置
        return this.get().recreate();
    }
    // 如果返回類(lèi)型不是CompletableFuture,則調(diào)用AppResponse的重置
    return (new AppResponse()).recreate();
}

該方法是重置,本來(lái)也是直接調(diào)用了AppResponse的方法,不過(guò)因?yàn)橹С至艘訡ompletableFuture為返回類(lèi)型的服務(wù)方法調(diào)用,所以這里做了一些額外的邏輯,也就是把結(jié)果用CompletableFuture包裹,作為返回的結(jié)果放入AppResponse實(shí)例中??梢詫?duì)標(biāo)使用了CompletableFuture簽名的服務(wù)。

@Override
public Result thenApplyWithContext(Function fn) {
    // 當(dāng)該AsyncRpcResult完成后,結(jié)果作為參數(shù)先執(zhí)行beforeContext,再執(zhí)行fn,最后執(zhí)行andThen
    this.thenApply(fn.compose(beforeContext).andThen(afterContext));
    // You may need to return a new Result instance representing the next async stage,
    // like thenApply will return a new CompletableFuture.
    return this;
}


/**
 * tmp context to use when the thread switch to Dubbo thread.
 * 臨時(shí)的RpcContext,當(dāng)用戶(hù)線(xiàn)程切換為Dubbo線(xiàn)程時(shí)候使用
 */
/**
 * 臨時(shí)的RpcContext
 */
private RpcContext tmpContext;
private RpcContext tmpServerContext;

private Function beforeContext = (appResponse) -> {
    // 獲得當(dāng)前線(xiàn)程消費(fèi)者端的RpcContext
    tmpContext = RpcContext.getContext();
    // 獲得當(dāng)前線(xiàn)程服務(wù)端的RpcContext
    tmpServerContext = RpcContext.getServerContext();
    // 重新設(shè)置消費(fèi)者端的RpcContext
    RpcContext.restoreContext(storedContext);
    // 重新設(shè)置服務(wù)端的RpcContext
    RpcContext.restoreServerContext(storedServerContext);
    return appResponse;
};

private Function afterContext = (appResponse) -> {
    // 重新把臨時(shí)的RpcContext設(shè)置回去
    RpcContext.restoreContext(tmpContext);
    RpcContext.restoreServerContext(tmpServerContext);
    return appResponse;
};

把這幾部分代碼放在一起時(shí)因?yàn)楫?dāng)用戶(hù)線(xiàn)程切換為Dubbo線(xiàn)程時(shí)候需要用到臨時(shí)的RpcContext來(lái)記錄,如何使用該thenApplyWithContext方法,我也會(huì)在異步化過(guò)濾器鏈回調(diào)中講到。

其他的方法比較好理解,我就不一一講解。

異步化過(guò)濾器鏈回調(diào)

如果看過(guò)前兩篇關(guān)于發(fā)送請(qǐng)求和處理請(qǐng)求的過(guò)程,應(yīng)該就知道在整個(gè)調(diào)用鏈中有許多的過(guò)濾器,而Consumer和Provider分別都有各自的過(guò)濾器來(lái)做一些功能增強(qiáng)。過(guò)濾器有執(zhí)行鏈,也有回調(diào)鏈,如果整一個(gè)鏈路都是同步的,那么過(guò)濾器一旦增多,鏈路增長(zhǎng),就會(huì)帶來(lái)請(qǐng)求響應(yīng)時(shí)間的增加,這當(dāng)然是最不想看到的事情。那如果把過(guò)濾器的調(diào)用鏈異步化,那么我們就可以用一個(gè)future來(lái)代替結(jié)果拋給下游,讓下游不再阻塞。這樣就大大降低了響應(yīng)時(shí)間,節(jié)省資源,提升RPC響應(yīng)性能。而這里的future就是下面要介紹的AppResponse。那我先來(lái)介紹一下如何實(shí)現(xiàn)異步化過(guò)濾器鏈回調(diào)。我就拿消費(fèi)端發(fā)送請(qǐng)求過(guò)程來(lái)舉例子說(shuō)明。

參考《dubbo源碼解析(四十六)消費(fèi)端發(fā)送請(qǐng)求過(guò)程》的(六)ProtocolFilterWrapper的內(nèi)部類(lèi)CallbackRegistrationInvoker的invoke,可以看到當(dāng)所有的過(guò)濾器執(zhí)行完后,會(huì)遍歷每一個(gè)過(guò)濾器鏈,獲得上面所說(shuō)的內(nèi)部接口Listener實(shí)現(xiàn)類(lèi),進(jìn)行異步回調(diào),因?yàn)檎?qǐng)求已經(jīng)在(十四)DubboInvoker的doInvoke中進(jìn)行了發(fā)送,返回給下游一個(gè)AsyncRpcResult,而AsyncRpcResult內(nèi)包裹的是AppResponse,可以看《dubbo源碼解析(四十七)服務(wù)端處理請(qǐng)求過(guò)程》的(二十三)AbstractProxyInvoker的invoke,當(dāng)代理類(lèi)執(zhí)行相關(guān)方法后,會(huì)創(chuàng)建一個(gè)AppResponse,把結(jié)果放入AppResponse中。所以AsyncRpcResult中包裹的是AppResponse,然后調(diào)用回調(diào)方法onResponse。并且會(huì)執(zhí)行thenApplyWithContext把回調(diào)結(jié)果放入上下文中。而這個(gè)上下文如何避免相同的線(xiàn)程用于執(zhí)行另一個(gè)RPC調(diào)用導(dǎo)致原來(lái)的RpcContext可能已經(jīng)被更改的情況,我也在上面已經(jīng)說(shuō)明。

新增AppResponse

AppResponse繼承了AbstractResult,同樣也是CompletableFuture類(lèi)型,但是AppResponse跟AsyncRpcResult職能不一樣,AsyncRpcResult作為一個(gè)future,而AppResponse可以說(shuō)是作為rpc調(diào)用結(jié)果的一個(gè)數(shù)據(jù)結(jié)構(gòu),它的實(shí)現(xiàn)很簡(jiǎn)單,就是封裝了以下三個(gè)屬性和對(duì)應(yīng)的一些方法。

/**
 * 調(diào)用結(jié)果
 */
private Object result;

/**
 * rpc調(diào)用時(shí)的異常
 */
private Throwable exception;

/**
 * 附加值
 */
private Map attachments = new HashMap();

前面我也講了,Provider處理請(qǐng)求完成后,會(huì)把結(jié)果放在AppResponse內(nèi),在整個(gè)鏈路調(diào)用過(guò)程中AsyncRpcResult內(nèi)部必然會(huì)有一個(gè)AppResponse存在,而為上文提到的過(guò)濾器內(nèi)置接口Listener的onResponse方法中的appResponse就是AppResponse類(lèi)型的,它作為一個(gè)回調(diào)的數(shù)據(jù)類(lèi)型。

后記

該文章講解了dubbo 2.7.x版本對(duì)于異步化改造的介紹,上面只是羅列了所有改動(dòng)的點(diǎn),沒(méi)有具體講述在哪些新增功能上的應(yīng)用,如果感興趣,可以參考前幾篇的調(diào)用過(guò)程文章,來(lái)看看新增的功能點(diǎn)如何運(yùn)用上述的設(shè)計(jì)的,比如Provider異步,有一種實(shí)現(xiàn)方式就用到了上述的InvokeMode。接下來(lái)一篇我會(huì)講述元數(shù)據(jù)的改造。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75781.html

相關(guān)文章

  • dubbo源碼解析四十七)服務(wù)端處理請(qǐng)求過(guò)程

    摘要:而存在的意義就是保證請(qǐng)求或響應(yīng)對(duì)象可在線(xiàn)程池中被解碼,解碼完成后,就會(huì)分發(fā)到的。 2.7大揭秘——服務(wù)端處理請(qǐng)求過(guò)程 目標(biāo):從源碼的角度分析服務(wù)端接收到請(qǐng)求后的一系列操作,最終把客戶(hù)端需要的值返回。 前言 上一篇講到了消費(fèi)端發(fā)送請(qǐng)求的過(guò)程,該篇就要將服務(wù)端處理請(qǐng)求的過(guò)程。也就是當(dāng)服務(wù)端收到請(qǐng)求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費(fèi)端在發(fā)送請(qǐng)求的時(shí)候已經(jīng)做了編碼,所以我...

    yzzz 評(píng)論0 收藏0
  • dubbo源碼解析四十三)2.7新特性

    摘要:大揭秘目標(biāo)了解的新特性,以及版本升級(jí)的引導(dǎo)。四元數(shù)據(jù)改造我們知道以前的版本只有注冊(cè)中心,注冊(cè)中心的有數(shù)十個(gè)的鍵值對(duì),包含了一個(gè)服務(wù)所有的元數(shù)據(jù)。 DUBBO——2.7大揭秘 目標(biāo):了解2.7的新特性,以及版本升級(jí)的引導(dǎo)。 前言 我們知道Dubbo在2011年開(kāi)源,停止更新了一段時(shí)間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發(fā)布了 2.5.4 版本。隨后,版本...

    qqlcbb 評(píng)論0 收藏0
  • dubbo源碼解析四十六)消費(fèi)端發(fā)送請(qǐng)求過(guò)程

    摘要:可以參考源碼解析二十四遠(yuǎn)程調(diào)用協(xié)議的八。十六的該類(lèi)也是用了適配器模式,該類(lèi)主要的作用就是增加了心跳功能,可以參考源碼解析十遠(yuǎn)程通信層的四。二十的可以參考源碼解析十七遠(yuǎn)程通信的一。 2.7大揭秘——消費(fèi)端發(fā)送請(qǐng)求過(guò)程 目標(biāo):從源碼的角度分析一個(gè)服務(wù)方法調(diào)用經(jīng)歷怎么樣的磨難以后到達(dá)服務(wù)端。 前言 前一篇文章講到的是引用服務(wù)的過(guò)程,引用服務(wù)無(wú)非就是創(chuàng)建出一個(gè)代理。供消費(fèi)者調(diào)用服務(wù)的相關(guān)方法。...

    fish 評(píng)論0 收藏0
  • dubbo源碼解析四十四)服務(wù)暴露過(guò)程

    摘要:服務(wù)暴露過(guò)程目標(biāo)從源碼的角度分析服務(wù)暴露過(guò)程。導(dǎo)出服務(wù),包含暴露服務(wù)到本地,和暴露服務(wù)到遠(yuǎn)程兩個(gè)過(guò)程。其中服務(wù)暴露的第八步已經(jīng)沒(méi)有了。將泛化調(diào)用版本號(hào)或者等信息加入獲得服務(wù)暴露地址和端口號(hào),利用內(nèi)數(shù)據(jù)組裝成。 dubbo服務(wù)暴露過(guò)程 目標(biāo):從源碼的角度分析服務(wù)暴露過(guò)程。 前言 本來(lái)這一篇一個(gè)寫(xiě)異步化改造的內(nèi)容,但是最近我一直在想,某一部分的優(yōu)化改造該怎么去撰寫(xiě)才能更加的讓讀者理解。我覺(jué)...

    light 評(píng)論0 收藏0
  • dubbo源碼解析四十二)序列——開(kāi)篇

    摘要:在版本中,支持五種序列化方式,分別是依賴(lài)阿里的庫(kù),功能強(qiáng)大支持普通類(lèi)包括任意或完全兼容序列化協(xié)議的系列化框架,序列化速度大概是的倍,大小是大小的左右。但這里實(shí)際不是原生的序列化,而是阿里修改過(guò)的,它是默認(rèn)啟用的序列化方式自帶的序列化實(shí)現(xiàn)。 序列化——開(kāi)篇 目標(biāo):介紹dubbo中序列化的內(nèi)容,對(duì)dubbo中支持的序列化方式做對(duì)比,介紹dubbo-serialization-api下的源碼...

    keke 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<