成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

atinosun / 2000人閱讀

摘要:關(guān)于協(xié)議的介紹可以參考官方文檔。必須與特定遠(yuǎn)程處理提供程序的規(guī)則兼容。后記該部分相關(guān)的源碼解析地址該文章講解了遠(yuǎn)程調(diào)用中關(guān)于協(xié)議實(shí)現(xiàn)的部分,邏輯比較簡(jiǎn)單。

遠(yuǎn)程調(diào)用——rmi協(xié)議
目標(biāo):介紹rmi協(xié)議的設(shè)計(jì)和實(shí)現(xiàn),介紹dubbo-rpc-rmi的源碼。
前言

dubbo支持rmi協(xié)議,主要基于spring封裝的org.springframework.remoting.rmi包來(lái)實(shí)現(xiàn),當(dāng)然最原始還是依賴 JDK 標(biāo)準(zhǔn)的java.rmi.*包,采用阻塞式短連接和 JDK 標(biāo)準(zhǔn)序列化方式。關(guān)于rmi協(xié)議的介紹可以參考dubbo官方文檔。

地址:http://dubbo.apache.org/zh-cn...
源碼分析 (一)RmiRemoteInvocation

該類繼承了RemoteInvocation,主要是在RemoteInvocation的基礎(chǔ)上新增dubbo自身所需的附加值,避免這些附加值沒(méi)有被傳遞,為了做一些驗(yàn)證處理。

public class RmiRemoteInvocation extends RemoteInvocation {
    private static final long serialVersionUID = 1L;
    private static final String dubboAttachmentsAttrName = "dubbo.attachments";

    /**
     * executed on consumer side
     */
    public RmiRemoteInvocation(MethodInvocation methodInvocation) {
        super(methodInvocation);
        // 添加dubbo附加值的屬性
        addAttribute(dubboAttachmentsAttrName, new HashMap(RpcContext.getContext().getAttachments()));
    }

    /**
     * Need to restore context on provider side (Though context will be overridden by Invocation"s attachment
     * when ContextFilter gets executed, we will restore the attachment when Invocation is constructed, check more
     * 需要在提供者端恢復(fù)上下文(盡管上下文將被Invocation的附件覆蓋
     * 當(dāng)ContextFilter執(zhí)行時(shí),我們將在構(gòu)造Invocation時(shí)恢復(fù)附件,檢查更多
     * from {@link com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler}
     */
    @SuppressWarnings("unchecked")
    @Override
    public Object invoke(Object targetObject) throws NoSuchMethodException, IllegalAccessException,
            InvocationTargetException {
        // 獲得上下文
        RpcContext context = RpcContext.getContext();
        // 設(shè)置參數(shù)
        context.setAttachments((Map) getAttribute(dubboAttachmentsAttrName));
        try {
            return super.invoke(targetObject);
        } finally {
            // 清空參數(shù)
            context.setAttachments(null);
        }
    }
}
(二)RmiProtocol

該類繼承了AbstractProxyProtocol類,是rmi協(xié)議實(shí)現(xiàn)的核心,跟其他協(xié)議一樣,也實(shí)現(xiàn)了自己的服務(wù)暴露和服務(wù)引用方法。

1.doExport
@Override
protected  Runnable doExport(final T impl, Class type, URL url) throws RpcException {
    // rmi暴露者
    final RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
    // 設(shè)置端口
    rmiServiceExporter.setRegistryPort(url.getPort());
    // 設(shè)置服務(wù)名稱
    rmiServiceExporter.setServiceName(url.getPath());
    // 設(shè)置接口
    rmiServiceExporter.setServiceInterface(type);
    // 設(shè)置服務(wù)實(shí)現(xiàn)
    rmiServiceExporter.setService(impl);
    try {
        // 初始化bean的時(shí)候執(zhí)行
        rmiServiceExporter.afterPropertiesSet();
    } catch (RemoteException e) {
        throw new RpcException(e.getMessage(), e);
    }
    return new Runnable() {
        @Override
        public void run() {
            try {
                // 銷毀
                rmiServiceExporter.destroy();
            } catch (Throwable e) {
                logger.warn(e.getMessage(), e);
            }
        }
    };
}

該方法是服務(wù)暴露的邏輯實(shí)現(xiàn)。

2.doRefer
@Override
@SuppressWarnings("unchecked")
protected  T doRefer(final Class serviceType, final URL url) throws RpcException {
    // FactoryBean對(duì)于RMI代理,支持傳統(tǒng)的RMI服務(wù)和RMI調(diào)用者,創(chuàng)建RmiProxyFactoryBean對(duì)象
    final RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
    // RMI needs extra parameter since it uses customized remote invocation object
    // 檢測(cè)版本
    if (url.getParameter(Constants.DUBBO_VERSION_KEY, Version.getProtocolVersion()).equals(Version.getProtocolVersion())) {
        // Check dubbo version on provider, this feature only support
        // 設(shè)置RemoteInvocationFactory以用于此訪問(wèn)器
        rmiProxyFactoryBean.setRemoteInvocationFactory(new RemoteInvocationFactory() {
            @Override
            public RemoteInvocation createRemoteInvocation(MethodInvocation methodInvocation) {
                // 自定義調(diào)用工廠可以向調(diào)用添加更多上下文信息
                return new RmiRemoteInvocation(methodInvocation);
            }
        });
    }
    // 設(shè)置此遠(yuǎn)程訪問(wèn)者的目標(biāo)服務(wù)的URL。URL必須與特定遠(yuǎn)程處理提供程序的規(guī)則兼容。
    rmiProxyFactoryBean.setServiceUrl(url.toIdentityString());
    // 設(shè)置要訪問(wèn)的服務(wù)的接口。界面必須適合特定的服務(wù)和遠(yuǎn)程處理策略
    rmiProxyFactoryBean.setServiceInterface(serviceType);
    // 設(shè)置是否在找到RMI存根后緩存它
    rmiProxyFactoryBean.setCacheStub(true);
    // 設(shè)置是否在啟動(dòng)時(shí)查找RMI存根
    rmiProxyFactoryBean.setLookupStubOnStartup(true);
    // 設(shè)置是否在連接失敗時(shí)刷新RMI存根
    rmiProxyFactoryBean.setRefreshStubOnConnectFailure(true);
    // // 初始化bean的時(shí)候執(zhí)行
    rmiProxyFactoryBean.afterPropertiesSet();
    return (T) rmiProxyFactoryBean.getObject();
}

該方法是服務(wù)引用的邏輯實(shí)現(xiàn)。

后記
該部分相關(guān)的源碼解析地址:https://github.com/CrazyHZM/i...

該文章講解了遠(yuǎn)程調(diào)用中關(guān)于rmi協(xié)議實(shí)現(xiàn)的部分,邏輯比較簡(jiǎn)單。接下來(lái)我將開(kāi)始對(duì)rpc模塊關(guān)于thrift協(xié)議部分進(jìn)行講解。

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

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

相關(guān)文章

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

    摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對(duì)于異步化的改造原理。看源碼解析四十六消費(fèi)端發(fā)送請(qǐng)求過(guò)程講到的十四的,在以前的邏輯會(huì)直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠(yuǎn)程通信層的六。 2.7大揭秘——異步化改造 目標(biāo):從源碼的角度分析2.7的新特性中對(duì)于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...

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

    摘要:可以參考源碼解析二十四遠(yuǎn)程調(diào)用協(xié)議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠(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源碼解析(一)Hello,Dubbo

    摘要:英文全名為,也叫遠(yuǎn)程過(guò)程調(diào)用,其實(shí)就是一個(gè)計(jì)算機(jī)通信協(xié)議,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù)而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。 Hello,Dubbo 你好,dubbo,初次見(jiàn)面,我想和你交個(gè)朋友。 Dubbo你到底是什么? 先給出一套官方的說(shuō)法:Apache Dubbo是一款高性能、輕量級(jí)基于Java的RPC開(kāi)源框架。 那么什么是RPC? 文檔地址:http://dubbo.a...

    evin2016 評(píng)論0 收藏0
  • dubbo源碼解析(二十一遠(yuǎn)程調(diào)用——Listener

    摘要:源碼分析一該類實(shí)現(xiàn)了,是服務(wù)引用監(jiān)聽(tīng)器的包裝類。取消暴露遍歷監(jiān)聽(tīng)集合監(jiān)聽(tīng)取消暴露該方法是對(duì)每個(gè)取消服務(wù)暴露的監(jiān)聽(tīng)。五暴露服務(wù)取消暴露服務(wù)該類是服務(wù)暴露監(jiān)聽(tīng)器的適配類,沒(méi)有做實(shí)際的操作。 遠(yuǎn)程調(diào)用——Listener 目標(biāo):介紹dubbo-rpc-api中的各種listener監(jiān)聽(tīng)器的實(shí)現(xiàn)邏輯,內(nèi)容略少,隨便撇兩眼,不是重點(diǎn)。 前言 本文介紹監(jiān)聽(tīng)器的相關(guān)邏輯。在服務(wù)引用和服務(wù)發(fā)現(xiàn)中監(jiān)聽(tīng)器...

    simpleapples 評(píng)論0 收藏0
  • dubbo源碼解析(四十七)服務(wù)端處理請(qǐng)求過(guò)程

    摘要:而存在的意義就是保證請(qǐng)求或響應(yīng)對(duì)象可在線程池中被解碼,解碼完成后,就會(huì)分發(fā)到的。 2.7大揭秘——服務(wù)端處理請(qǐng)求過(guò)程 目標(biāo):從源碼的角度分析服務(wù)端接收到請(qǐng)求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費(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

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

0條評(píng)論

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