摘要:關(guān)于協(xié)議的介紹可以參考官方文檔。必須與特定遠程處理提供程序的規(guī)則兼容。后記該部分相關(guān)的源碼解析地址該文章講解了遠程調(diào)用中關(guān)于協(xié)議實現(xiàn)的部分,邏輯比較簡單。
遠程調(diào)用——rmi協(xié)議
目標(biāo):介紹rmi協(xié)議的設(shè)計和實現(xiàn),介紹dubbo-rpc-rmi的源碼。前言
dubbo支持rmi協(xié)議,主要基于spring封裝的org.springframework.remoting.rmi包來實現(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自身所需的附加值,避免這些附加值沒有被傳遞,為了做一些驗證處理。
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(二)RmiProtocol(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í)行時,我們將在構(gòu)造Invocation時恢復(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); } } }
該類繼承了AbstractProxyProtocol類,是rmi協(xié)議實現(xiàn)的核心,跟其他協(xié)議一樣,也實現(xiàn)了自己的服務(wù)暴露和服務(wù)引用方法。
1.doExport@Override protectedRunnable 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ù)實現(xiàn) rmiServiceExporter.setService(impl); try { // 初始化bean的時候執(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ù)暴露的邏輯實現(xiàn)。
2.doRefer@Override @SuppressWarnings("unchecked") protectedT doRefer(final Class serviceType, final URL url) throws RpcException { // FactoryBean對于RMI代理,支持傳統(tǒng)的RMI服務(wù)和RMI調(diào)用者,創(chuàng)建RmiProxyFactoryBean對象 final RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean(); // RMI needs extra parameter since it uses customized remote invocation object // 檢測版本 if (url.getParameter(Constants.DUBBO_VERSION_KEY, Version.getProtocolVersion()).equals(Version.getProtocolVersion())) { // Check dubbo version on provider, this feature only support // 設(shè)置RemoteInvocationFactory以用于此訪問器 rmiProxyFactoryBean.setRemoteInvocationFactory(new RemoteInvocationFactory() { @Override public RemoteInvocation createRemoteInvocation(MethodInvocation methodInvocation) { // 自定義調(diào)用工廠可以向調(diào)用添加更多上下文信息 return new RmiRemoteInvocation(methodInvocation); } }); } // 設(shè)置此遠程訪問者的目標(biāo)服務(wù)的URL。URL必須與特定遠程處理提供程序的規(guī)則兼容。 rmiProxyFactoryBean.setServiceUrl(url.toIdentityString()); // 設(shè)置要訪問的服務(wù)的接口。界面必須適合特定的服務(wù)和遠程處理策略 rmiProxyFactoryBean.setServiceInterface(serviceType); // 設(shè)置是否在找到RMI存根后緩存它 rmiProxyFactoryBean.setCacheStub(true); // 設(shè)置是否在啟動時查找RMI存根 rmiProxyFactoryBean.setLookupStubOnStartup(true); // 設(shè)置是否在連接失敗時刷新RMI存根 rmiProxyFactoryBean.setRefreshStubOnConnectFailure(true); // // 初始化bean的時候執(zhí)行 rmiProxyFactoryBean.afterPropertiesSet(); return (T) rmiProxyFactoryBean.getObject(); }
該方法是服務(wù)引用的邏輯實現(xiàn)。
后記該部分相關(guān)的源碼解析地址:https://github.com/CrazyHZM/i...
該文章講解了遠程調(diào)用中關(guān)于rmi協(xié)議實現(xiàn)的部分,邏輯比較簡單。接下來我將開始對rpc模塊關(guān)于thrift協(xié)議部分進行講解。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77386.html
摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對于異步化的改造原理。看源碼解析四十六消費端發(fā)送請求過程講到的十四的,在以前的邏輯會直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠程通信層的六。 2.7大揭秘——異步化改造 目標(biāo):從源碼的角度分析2.7的新特性中對于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...
摘要:可以參考源碼解析二十四遠程調(diào)用協(xié)議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠程通信層的四。二十的可以參考源碼解析十七遠程通信的一。 2.7大揭秘——消費端發(fā)送請求過程 目標(biāo):從源碼的角度分析一個服務(wù)方法調(diào)用經(jīng)歷怎么樣的磨難以后到達服務(wù)端。 前言 前一篇文章講到的是引用服務(wù)的過程,引用服務(wù)無非就是創(chuàng)建出一個代理。供消費者調(diào)用服務(wù)的相關(guān)方法。...
摘要:英文全名為,也叫遠程過程調(diào)用,其實就是一個計算機通信協(xié)議,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù)而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。 Hello,Dubbo 你好,dubbo,初次見面,我想和你交個朋友。 Dubbo你到底是什么? 先給出一套官方的說法:Apache Dubbo是一款高性能、輕量級基于Java的RPC開源框架。 那么什么是RPC? 文檔地址:http://dubbo.a...
摘要:源碼分析一該類實現(xiàn)了,是服務(wù)引用監(jiān)聽器的包裝類。取消暴露遍歷監(jiān)聽集合監(jiān)聽取消暴露該方法是對每個取消服務(wù)暴露的監(jiān)聽。五暴露服務(wù)取消暴露服務(wù)該類是服務(wù)暴露監(jiān)聽器的適配類,沒有做實際的操作。 遠程調(diào)用——Listener 目標(biāo):介紹dubbo-rpc-api中的各種listener監(jiān)聽器的實現(xiàn)邏輯,內(nèi)容略少,隨便撇兩眼,不是重點。 前言 本文介紹監(jiān)聽器的相關(guān)邏輯。在服務(wù)引用和服務(wù)發(fā)現(xiàn)中監(jiān)聽器...
摘要:而存在的意義就是保證請求或響應(yīng)對象可在線程池中被解碼,解碼完成后,就會分發(fā)到的。 2.7大揭秘——服務(wù)端處理請求過程 目標(biāo):從源碼的角度分析服務(wù)端接收到請求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費端發(fā)送請求的過程,該篇就要將服務(wù)端處理請求的過程。也就是當(dāng)服務(wù)端收到請求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費端在發(fā)送請求的時候已經(jīng)做了編碼,所以我...
閱讀 863·2023-04-26 00:11
閱讀 2660·2021-11-04 16:13
閱讀 2112·2021-09-09 09:33
閱讀 1481·2021-08-20 09:35
閱讀 3830·2021-08-09 13:42
閱讀 3613·2019-08-30 15:55
閱讀 1064·2019-08-30 15:55
閱讀 2225·2019-08-30 13:55