三九宝宝网宝宝百科宝宝知识

dubbo怎么实现rpc远程调用

02月07日 编辑 39baobao.com

[LTE中只有PS域那么语音业务时怎样实现的]VoLTE语音解决方案有多种,经过近些年的协议演进,目前业界认可的包括1种手机解决方案和3种网络解决方案。 手机解决方案是双待机方式,手机同时驻留在CS域和PS域,语音仅在CS域发生...+阅读

在消费者初始化的时候,会生成一个消费者代理注册到容器中,该代理回调中持有一个MockClusterInvoker实例,消费调用服务接口时它的invoke会被调用,此时会构建一个RpcInvocation对象,把服务接口的method对象和参数放到RpcInvocation对象中,作为MockClusterInvoker.invoke方法的参数,在这个invoke方法中,判断请求是否需要mock,是否配置了mock属性,是强制mock还是失败后mock,关于mock这里先不详细展开,这里只看下核心流程。

MockClusterInvoker.invoke会调用FailfastClusterInvoker.invoke,大系统中为了服务高可用同一个服务一般会有多个应用服务器提供,要先挑选一个提供者提供服务。在服务接口消费者初始化时,接口方法和提供者Invoker对应关系保存在RegistryDirectory的methodInvokerMap中,通过调用的方法名称(或方法名称+第一个参数)改方法对应的提供者invoker列表,如注册中心设置了路由规则,对这些invoker根据路由规则进行过滤。

com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(Invocation) com.alibaba.dubbo.rpc.cluster.directory.AbstractDirectory.list(Invocation) 读取到所有符合条件的服务提供者invoker之后,由LoadBalance组件执行负载均衡,从中挑选一个invoker进行调用,框架内置支持的负载均衡算法包括random(随机)、roundrobin(R-R循环)、leastactive(最不活跃)、consistenthash(一致性hash),应用可配置,默认random。

methodInvokerMap保存的是持有DubboInvoker(dubbo协议)实例的InvokerDelegete对象,是Invoker-Filter链的头部,先激活Filter连然后最终调到DubboInvoker.invoke(RpcInvocation),此时远程调用分三种类型: 1. 单向调用,无需获取关注调用结果的,无需等待接口返回结果,注意调用结果不要单纯跟返回值混淆了,异常也是调用结果。 2. 异步调用,需要关注返回结果,但是不会同步等待接口调用结束,会异步的获取返回返回结果,这种情况给调用者返回一个Future,但是不同步等待Future.get返回调用结果 3. 同步调用,需要同步等待服务调用结束获取调用结果,给调用者返回一个Future并且Future.get等待结果,此时接口调用线程会挂起等待响应。

我们大部分使用场景都是同步调用,所以主要看一下同步调用。如果使用者配置了多个connections按顺序选择一个ExchangeClient和服务器通信,同步调用时调用HeaderExchangeClient.request->HeaderExchangeChannel.request。 com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeChannel.request(Object, int) 这里的request参数是RpcInvocation对象,包含调用的方法、参数等信息,timeout参数是接口超时时间,把这些信息封装在Request对象中,调用channel.send,这个channel对象就是和服务端打交道的NettyClient实例,NettyClient.send调用NettyChannel.send。

com.alibaba.dubbo.remoting.transport.netty.NettyChannel.send(Object, boolean) 这里的sent参数决定是否等待请求消息发出,sent=true 等待消息发出,消息发送失败将抛出异常,sent=false 不等待消息发出,将消息放入IO队列,即刻返回。默认情况下都是false。NettyChannel中有channel属性,这个channel是Netty框架中的组件,负责客户端和服务端链路上的消息传递,channel.write把请求消息写入,这里的message是上面封装的Request对象。

这里的IO模型是非阻塞的,线程不用同步等待所有消息写完,而是直接返回。调用Netty框架的IO事件之后会触发Netty框架的IO事件处理链。

以下为关联文档:

Sql Server中实现数据库的自动备份都有哪几种方法/*******************完整备份作业*******************/--完整备份,每周一次USE MasterGOdeclare str varchar(100)set str='D:\DBtext\jgj\DBABak\FullBak'+replace(replace...

如何实现MySQL的自动备份MySql自动备份是非常关键的,特别是对于DBA来说。这里主要用代码来说明这个问题,希望对各位有所帮助。可以将这个脚本放进crontab,每天凌晨执行一次,自动备份。这个脚本每天最多...

新课改背景下如何实现初中化学教学方式改革随着社会环境的不断变化,知识经济时代与信息社会要求我们必须不断深化教育改革,培养出对社会有用的实用型、创新型人才。新课改顺应教育改革的需要,在我国大范围如火如荼地进行...

如何实现Android ListView快速查找功能关于SectionIndexer接口TextView floatTextView = (TextView)LayoutInflater.from(this).inflate(R.layout.list_position, null); WindowManager.LayoutParams layoutParams = new WindowManager....

请教一下专家多屏互动如何实现多屏互动所指的是,或闪联协议、Miracast协议等,通过WIFI网络连接,在不同多媒体终端上,如常见基于Ios,Android,Symbian等不同操作系统上的不同智能终端设备如手机,PDA,TV等之间,可...

JS函数调用及作用域链数组索引要为整形 即xx[key] 中的key必须是整形的,你传的'v'+i 是不对的,应该这样写: (function() { a = function() { var xx = new Array(); for (var i = 1; i <= 3; i++) {...

jsp调用java方法导出excel为什么会弹出保存或下载的对话框调用完之调用java导出excel? 你的excel是文件形式还是页面上的某个表格。如果是文件形式那就是下载了,弹出保存或下载窗口是应该的,但如果是页面上的某个表格那么不需要调用后台java来...

运用意识的作用和人生现实的知识分析青少年应如何实现人生梦想不能否认意识的作用是可以帮助青少年实现人生梦想,就像很著名的一些心理学实验,都证明了加强被试对于某方面的信念可以极大的提高在成功学考量意义上的那些成绩,比如皮格马利翁...

dubbo怎样实现远程调用与调本地方法一样dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化 + h...

推荐阅读
图文推荐