Dubbo技术知识总结之六——Dubbo服务调用链路

2020-07-10 11:18:16 浏览数 (1)

接上篇《Dubbo技术知识总结之五——Dubbo远程调用》

六. Dubbo 服务调用链路

参考地址:《Dubbo中服务消费者和服务提供者之间的请求和响应过程》

6.1 初始化

服务提供者启动时,对外暴露一个 Exporter,它是一个可以接受外界连接代理对象,接受连接的方式是启动一个 Netty Server 监听连接。

服务消费者启动时,调用 RPC 接口时调用的是一个 Invoker 接口,类型是 RpcInvocation。它是一个通过动态代理方式生成的代理对象,可以通过 Netty Client 连接服务提供者。

6.2 调用链路

6.2.1 消费者发起调用请求

消费者调用 Invoker 时,实际上调用的是一个由 Java 动态代理生成的代理对象。该代理对象经过 Cluster 层的路由与负载均衡,找到一个服务节点,将调用参数封装成 Request 形式,通过 Netty Client 将数据进行序列化,通过 Netty 发送给对应的服务提供者。

6.2.2 提供者处理请求

服务提供者的 Netty Server 监听到消费者发送过来的请求信息,首先进行解码,解码后的内容投入到提供者的线程分发器 AllDispatcher 中,然后服务请求就在线程池中处理。

处理请求时,首先通过请求信息获取提供者的 Invoker 对象,这个 Invoker 对象是一个用 JavassitProxyFactory 生成的代理对象,提供者自己用它获取实际的 RPC 接口实现类,并执行调用的。找到实际的接口实现类,并执行业务逻辑处理后,用同样的方法,将响应封装成 Response,用 Netty 把编码后的响应发送给消费者。

6.2.3 消费者处理响应

消费者接收到提供者发来的响应,解码后投入到线程分发器中,置入线程池。放到线程池的是一个 DefaultFuture 对象,其中包含了响应结果。在前面第一步发起调用请求的过程中,负载均衡之后的调用就是通过 RpcInvocation 代理对象使用 DefaultFuture.get() 方法异步获取响应内容,这也是 RPC 远程调用从同步转为异步的方式。

0 人点赞