Dubbo远程调用

22 篇文章 0 订阅
8 篇文章 0 订阅

前言

  • Dubbo核心调用流程
  • Dubbo协议详解
  • Dubbo编解码器原理
  • Telnet调用原理
  • Dubbo线程模型

一、Dubbo调用介绍

假如手写简单的RPC调用,需要把调用信息传递到服务端,把方法参数等信息序列化传递到服务端,然后在服务端按照客户端的序列化顺序做一次反序列化来读取信息,然后拼装成请求对象进行服务反射调用,最终将调用结果返回给客户端。
在Dubbo中调用基本类似。
在这里插入图片描述
首先在客户端启动时会从注册中心拉取和订阅对应的服务列表,Cluster会把拉取的服务列表聚合成一个invoker,每次RPC调用前会通过Directory#list获取providers地址。获取这些服务列表给后续路由和负载均衡使用。在①中主要是将多个服务聚合成一个invoker。在框架内部另外一个实现Directory接口是RegistryDirectory类,它和服务接口名是一对一关系即每一个服务接口都有一个RegistryDirectory实例,主要负责拉取和订阅服务提供者、动态配置和路由项。

在Dubbo发起服务调用时,所有理由和负载均衡都是在客户端实现的,如上图步骤②③④所示。客户端服务调用首先触发路由操作,然后将路由结果得到的服务列表作为负载均衡参数,经过负载均衡后会选出一台机器进行rpc调用,会将请求交给底层I/O线程池(比如netty)处理,线程池中主要处理读写、序列化、反序列化等逻辑。在处理反序列化对象时会在业务线程池中处理。在步骤⑤中包含两种线程池,一种是I/0线程池-netty,另一种是Dubbo业务线程池。最后服务提供方会根据传递过来的接口、分组和版本查找invoker对应的实例进行反射调用。

上面是dubbo调用的大致步骤,要想更深入地了解服务调用还得了解一下Dubbo协议

二、Dubbo协议

Dubbo的协议设计参考了TCP/IP协议,使用了header+body的格式如下
在这里插入图片描述协议的具体内容如下
在这里插入图片描述

三、编码与解码

编码与解码主要是对协议内容进行解析,只讲个大概流程,不过多讲述。
Dubbo中的编码器主要将java对象编码成字节流返回给客户端,主要做两部分的事,构造报文头,然后对消息体进行序列化处理,所有解码层实现都应该继承自ExchanggeCodec,当dubbo协议编码请求对象时,调用ExchanggeCode#encode方法。
在解码时,解码分成两部分,一部分解码报文的头部,一部分解码报文体。当服务端对读取流进行解码时,会触发ExchangeCodec#decode方法。把报文体转换成RpcInvocation会触发DecodeableRpcInvocation#decode方法

四、Telnet调用原理

编码器处理有三种场景:请求,响应和Telnet调用。对于Telnet调用,编码器主要把Telnet当作明文字符串处理,按照Dubbo的调用规范,解析成调用命令格式,然后查找对应的Invoke,发起方法调用即可。

为了支持更多的Telnet命令和扩展性,Telnet指令解析被设置了扩展点TelnetHandler。

完成Telnet指令转发的核心实现类时TelnetHandlerAdapter,它的实现非常简单,首先将用户指令识别成commad,然后将剩余的内容解析成message,message会交给实现者去处理。

参考《深入理解Apache Dubbo与实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值