Dubbo的远程回调
在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的远程回调相关推荐
- Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)
文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...
- .NET Remoting 经典远程回调模型(二)
为了简化客户端代码,可以将远程对象实现为异步操作的形式. 那么,当异步操作完成时如何通知客户端呢?? 这里,来说下第二种,使用定制委托实现回调. 接着上个SimpleMath类说, public cl ...
- Dubbo comsumer 远程调用流程分析
简单代码示例: <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="demo-consumer ...
- 【DUBBO】——dubbo是什么以及使用dubbo 实现远程接口服务调用
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- 你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
点击关注强哥,还有100多G的面试资料等你来拿 哈喽,大家好,我是强哥. 前些天,一个同事在使用Dubbo的参数回调时,骂骂咧咧的说,Dubbo的这个回调真是奇葩,居然会限制回调次数,自己不得不把ca ...
- dubbo远程调用接口
最近做了一个项目需要使用dubbo调用远程接口,写出来分享一下 首先需要提供接口的人给你接口地址,注册中心地址,以及参数类型,参数类型可以是实体类,可以让客户直接把实体类发给你 接口地址就是类名地址以 ...
- Dubbo消费者服务的订阅
在消费者通过refer()方法获得Invoker的时候同时完成对于相关方法的订阅.以默认的dubbo作为注册中心为例子. 当消费者调用refer()方法的时候由于当中的Url中的protocol为re ...
- Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...
- Dubbo与SpringCloud框架详解
一.互联网架构演进 1.互联网项目架构 1. 互联网项目与传统项目 互联网项目架构的特点: 用户多 流量大,并发高 海量数据 易受攻击 功能繁琐 变更快 传统项目和互联网项目的不同: 用户体验: 美观 ...
最新文章
- Java中的单利模式介绍
- Python距离计算
- Java 洛谷 P2089 烤鸡
- 除零中断是什么意思?_百万并发「零拷贝」技术系列之初探门径
- 【剑指offer】找出数组中出现一次的两个数
- linux部署jenkins,tomcat9
- wget 下载百度云jdk
- expected at least 1 bean which qualifies as autowire candidate for this depe (spring无法注入)...
- php 获取url中的参数
- LOL易游网络验证破解总结
- unity 素材分享
- 如何批量裁剪pdf文件中的白边
- 高薪职位不少,这个行业为什么如此缺人才?
- 正确去掉Win7快捷方式小箭头
- SUS2019迎新赛ret2moonWP
- 【新手入门必看】MaixPy 图像基础知识
- word使用:默认粘贴方式的更改
- NVT SDK开关机LOGO替换实践
- 数据存储:私有云的好处
- 网上招 投标管理系统