设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

知道了这些内容,闭着眼面试Dubbo!(6)

发布时间:2019-12-06 01:46 所属栏目:117 来源:站长网
导读:8-15 位,魔法数低位。前面两个字节的魔法数,是用来区别两个不同请求。好像编程中使用的;/之类的符号将两条记录分开。PS:魔法数用固定的0xdabb表示, 16 位,数据包的类型,因为 RPC 调用是双向的,0 表示 Respon

8-15 位,“魔法数”低位。前面两个字节的“魔法数”,是用来区别两个不同请求。好像编程中使用的“;”“/”之类的符号将两条记录分开。PS:魔法数用固定的“0xdabb”表示,

16 位,数据包的类型,因为 RPC 调用是双向的,0 表示 Response,1 表示 Request。

17 位,调用方式,0 表示单项,1 表示双向。

18 位,时间标识,0 表示请求/响应,1 表示心跳包。

19-23 位,序列化器编号,就是告诉协议用什么样的方式进行序列化。例如:Hessian2Serialization 等等。

24-31 位,状态位。20 表示 OK,30 表示 CLIENT_TIMEOUT 客户端超时,31 表示 SERVER_TIMEOUT 服务端超时,40 表示 BAD_REQUEST 错误的请求,50 表示 BAD_RESPONSE 错误的响应。

32-95 位,请求的唯一编号,也就是 RPC 的唯一 ID。

96-127,消息体包括 Dubbo 版本号,服务接口名,服务接口版本,方法名,参数类型,方法名,参数类型,方法参数值和请求额外参数。

服务消费者在调用之前会将上述服务消息体,根据 Dubbo 协议打包好。框架内部会调用 DefaultFuture 对象的 get 方法进行等待。

在准备发送请求的时候,才创建 Request 对象,这个对象会保存在一个静态的 HashMap 中,当服务提供者处理完 Request 之后,将返回的 Response 放回到 Futures 的 HashMap 中。

在 HashMap 中会找到对应的 Request 对象,并且返回给服务消费者。

知道了这些内容,闭着眼面试Dubbo!

服务消费者请求和响应图

协议打包好以后就需要给协议编码和序列化。这里需要用到 Dubbo 的编码器,其过程是将信息传化成字节流。

Dubbo 协议编码请求对象分为使用 ExchangeCodec 中的两个方法,encodeRequest 负责编码协议头和 encodeRequestData 编码协议体。

同样通过 encodeResponse 编码协议头,encodeResponseData 编码协议体。

服务消费者和提供者都通过 decode 和 decodeBody 两个方法进行解码,不同的是解码有可能在 IO 线程或者 Dubbo 线程池中完成。

虽然,编码和解码的细节在这里不做展开,但是以下几点需要注意:

构造 16 字节的协议头,特别是需要创建前面两个字节的魔法数,也就是“0xdabb”,它是用来分割两个不同请求的。

生成唯一的请求/响应 ID,并且根据这个 ID 识别请求和响应协议包。

通过协议头中的 19-23 位的描述,进行序列化/反序列化操作。

为了提高处理效率,每个协议都会放到 Buffer 中处理。

当服务提供者收到请求协议包以后,先将其放到 ThreadPool 中,然后依次处理。

由于服务提供者在注册中心是通过 Exporter 的方式暴露服务的,服务消费者也是通过 Exporter 作为接口进行调用的。

Exporter 是将 Invoker 进行了包装,将拆开的 Invoker 进行 Filter 过滤链条进行过滤以后,再去调用服务实体。最后,将信息返回给服务消费者。

总结

我们首先了解 Dubbo 的分层和几个核心模块,分别介绍他们的职责。然后通过一个简单的例子,服务消费者调用服务提供者,用 Dubbo 的工作流程将各个模块串起来。

在这 22 步的流程中,以服务提供者和服务消费者的初始化为起点,用到了 Config 和 Proxy 以及 Protocol,Invoker。

注册中心作为两者的连接桥梁,起到了服务发现和注册的作用,并且着重讲了如何通过 ZooKeeper 实现注册中心的原理。

在服务消费者调用提供者之前,需要通过 Cluster 容错机制,Directory 获取 Invoker 列表,Router 找到路由信息,再使用 LoadBalance 知道具体服务。

在调用服务提供者之间还不忘通过 Filter 进行过滤,通过装饰者模式实现的 Filter 可以形成过滤链条,依次对条件进行过滤。

对于远程调用,需要调用打包协议,针对 Dubbo 协议进行了描述,并且针对该协议进行了编码/解码和序列化/反序列化的操作。

服务提供者收到请求以后,会将请求放到 ThreadPool 中逐一处理。通过 Exporter,Invoker,Filter 的逐级转换,最后响应请求。

由于篇幅有限很多功能例如 SPI,Merger 等没有介绍到,有时间再和大家细聊。

作者:崔皓

简介:十六年开发和架构经验,曾担任过惠普武汉交付中心技术专家,需求分析师,项目经理,后在创业公司担任技术/产品经理。善于学习,乐于分享。目前专注于技术架构与研发管理。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读