在Dubbo作为消费者再通过NettyServer准备调用相应服务的发送请求的时候先通过NettyCodeAdapter来对具体的数据进行编码。

在编码的过程中,遍历方法中的参数,来判断如果消费者调用了相应参数的方法,是否有必要进行远程回调。

判断的依据为,在消费者组装需要远程调用的方法的参数的时候,对所需要回调的方法中的第几个参数进行了配置,生产者根据其方法的第几个参数的callBack属性来判断是否有必要进行回调,该参数在url中的形式为methodName.第几个参数.callBack。

private static byte isCallBack(URL url, String methodName, int argIndex) {// parameter callback rule: method-name.parameter-index(starting from 0).callbackbyte isCallback = CALLBACK_NONE;if (url != null) {String callback = url.getParameter(methodName + "." + argIndex + ".callback");if (callback != null) {if (callback.equalsIgnoreCase("true")) {isCallback = CALLBACK_CREATE;} else if (callback.equalsIgnoreCase("false")) {isCallback = CALLBACK_DESTROY;}}}return isCallback;
}

根据这个参数来确认是否有必要进行回调。

在判断生产者需要对相应的参数的调用进行远程回调的时候,则需要跟生产者一样暴露相应的回调方法。

private static String exportOrunexportCallbackService(Channel channel, URL url, Class clazz, Object inst, Boolean export) throws IOException {int instid = System.identityHashCode(inst);Map<String, String> params = new HashMap<String, String>(3);// no need to new client againparams.put(Constants.IS_SERVER_KEY, Boolean.FALSE.toString());// mark it's a callback, for troubleshootingparams.put(Constants.IS_CALLBACK_SERVICE, Boolean.TRUE.toString());String group = url.getParameter(Constants.GROUP_KEY);if (group != null && group.length() > 0) {params.put(Constants.GROUP_KEY, group);}// add method, for verifying against method, automatic fallback (see dubbo protocol)params.put(Constants.METHODS_KEY, StringUtils.join(Wrapper.getWrapper(clazz).getDeclaredMethodNames(), ","));Map<String, String> tmpmap = new HashMap<String, String>(url.getParameters());tmpmap.putAll(params);tmpmap.remove(Constants.VERSION_KEY);// doesn't need to distinguish version for callbacktmpmap.put(Constants.INTERFACE_KEY, clazz.getName());URL exporturl = new URL(DubboProtocol.NAME, channel.getLocalAddress().getAddress().getHostAddress(), channel.getLocalAddress().getPort(), clazz.getName() + "." + instid, tmpmap);// no need to generate multiple exporters for different channel in the same JVM, cache key cannot collide.String cacheKey = getClientSideCallbackServiceCacheKey(instid);String countkey = getClientSideCountKey(clazz.getName());if (export) {// one channel can have multiple callback instances, no need to re-export for different instance.if (!channel.hasAttribute(cacheKey)) {if (!isInstancesOverLimit(channel, url, clazz.getName(), instid, false)) {Invoker<?> invoker = proxyFactory.getInvoker(inst, clazz, exporturl);// should destroy resource?Exporter<?> exporter = protocol.export(invoker);// this is used for tracing if instid has published service or not.channel.setAttribute(cacheKey, exporter);logger.info("export a callback service :" + exporturl + ", on " + channel + ", url is: " + url);increaseInstanceCount(channel, countkey);}}} else {if (channel.hasAttribute(cacheKey)) {Exporter<?> exporter = (Exporter<?>) channel.getAttribute(cacheKey);exporter.unexport();channel.removeAttribute(cacheKey);decreaseInstanceCount(channel, countkey);}}return String.valueOf(instid);
}

这里根据消费者的地址,直接构造了直连的url来完成远程回调的需要。之后与别的服务一样构造代理,并通过DubboProtocol的export()方法进行暴露。并将得到的exporter作为value,这样并通过参数的hashcode构造key,组成键值对存储在channel中,保证生产者能够接收到请求后根据key在channel中得到相应的exporter,完成代理的创建,使得可以完成远程回调的功能。

Dubbo的远程回调相关推荐

  1. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  2. .NET Remoting 经典远程回调模型(二)

    为了简化客户端代码,可以将远程对象实现为异步操作的形式. 那么,当异步操作完成时如何通知客户端呢?? 这里,来说下第二种,使用定制委托实现回调. 接着上个SimpleMath类说, public cl ...

  3. Dubbo comsumer 远程调用流程分析

    简单代码示例: <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="demo-consumer ...

  4. 【DUBBO】——dubbo是什么以及使用dubbo 实现远程接口服务调用

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  5. 你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?

    点击关注强哥,还有100多G的面试资料等你来拿 哈喽,大家好,我是强哥. 前些天,一个同事在使用Dubbo的参数回调时,骂骂咧咧的说,Dubbo的这个回调真是奇葩,居然会限制回调次数,自己不得不把ca ...

  6. dubbo远程调用接口

    最近做了一个项目需要使用dubbo调用远程接口,写出来分享一下 首先需要提供接口的人给你接口地址,注册中心地址,以及参数类型,参数类型可以是实体类,可以让客户直接把实体类发给你 接口地址就是类名地址以 ...

  7. Dubbo消费者服务的订阅

    在消费者通过refer()方法获得Invoker的时候同时完成对于相关方法的订阅.以默认的dubbo作为注册中心为例子. 当消费者调用refer()方法的时候由于当中的Url中的protocol为re ...

  8. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...

  9. Dubbo与SpringCloud框架详解

    一.互联网架构演进 1.互联网项目架构 1. 互联网项目与传统项目 互联网项目架构的特点: 用户多 流量大,并发高 海量数据 易受攻击 功能繁琐 变更快 传统项目和互联网项目的不同: 用户体验: 美观 ...

最新文章

  1. Java中的单利模式介绍
  2. Python距离计算
  3. Java 洛谷 P2089 烤鸡
  4. 除零中断是什么意思?_百万并发「零拷贝」技术系列之初探门径
  5. 【剑指offer】找出数组中出现一次的两个数
  6. linux部署jenkins,tomcat9
  7. wget 下载百度云jdk
  8. expected at least 1 bean which qualifies as autowire candidate for this depe (spring无法注入)...
  9. php 获取url中的参数
  10. LOL易游网络验证破解总结
  11. unity 素材分享
  12. 如何批量裁剪pdf文件中的白边
  13. 高薪职位不少,这个行业为什么如此缺人才?
  14. 正确去掉Win7快捷方式小箭头
  15. SUS2019迎新赛ret2moonWP
  16. 【新手入门必看】MaixPy 图像基础知识
  17. word使用:默认粘贴方式的更改
  18. NVT SDK开关机LOGO替换实践
  19. 数据存储:私有云的好处
  20. 网上招 投标管理系统

热门文章

  1. Windows下Maven 环境配置
  2. 诗与远方:无题(八十四)- 自己醉了
  3. JAVA设计模式 - 代理模式
  4. java导入导出有版本兼容问题_java导入excel时遇到的版本问题
  5. 跨路由器 网段访问rtsp_实验演示:三层交换机与路由器对接
  6. 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍
  7. polycom安卓手机客户端_安卓 emoji 表情:全变了
  8. Android 使用gradle版本冲突
  9. cocos2d-x JS 重力感应监听事件
  10. 01.C(Linux命令)