《Dubbo进阶一》——RPC协议底层原理

一 RPC协议简介

在一个典型的RPC的使用场景中,包含了服务发现、负载、容错、序列化和网络传输等组件,其中RPC协议指明了程序如何进行序列化和网络传输,也就是说一个RPC协议的实现等于一个非透明的RPC调用。
在这里插入图片描述
简单来说,分布式框架的核心是RPC框架,RPC框架的核心是RPC协议

dubbo 支持的RPC协议列表

名称 实现描述 连接描述 使用场景
dubbo 传输服务: mina, netty(默认), grizzy; 序列化: dubbo, hessian2(默认), java, fastjson。 自定义报文 单个长连接NIO;异步传输 1.常规RPC调用 2.传输数据量小 3.提供者少于消费者
rmi 传输:java rmi 服务; 序列化:java原生二进制序列化 多个短连接; BIO同步传输 1.常规RPC调用 2.与原RMI客户端集成 3.可传少量文件 4.不支持防火墙穿透
hessian 传输服务:servlet容器; 序列化:hessian二进制序列化 基于Http 协议传输,依懒servlet容器配置 1.提供者多于消费者 2.可传大字段和文件 3.跨语言调用
http 传输服务:servlet容器; 序列化:http表单 依懒servlet容器配置 1、数据包大小混合
thrift 与thrift RPC 实现集成,并在其基础上修改了报文头 长连接、NIO异步传输

(PS:本文只探讨dubbo协议)

二 协议的基本组成

在这里插入图片描述

  1. IP:服务提供者的地址
  2. 端口:协议指定开放端口
  3. 运行服务
    (1)netty
    (2)mima
    (3)rmi
    (4)servlet容器(Jetty、Tomcat、Jboss)
  4. 协议报文编码
  5. 序列化方式
    (1)Hessian2Serialization
    (2)DubboSerialization
    (3)JavaSerialization
    (4)JsonSerialization

三 Duboo的RPC协议报文

先看下http协议报文格式
在这里插入图片描述
在这里插入图片描述
同样,Dubbo也有自己的报文格式
在这里插入图片描述
以head+request body或head+response body的形式存在

  • head
    1标志位:表明是请求还是响应还是事件
    2status:表明状态是OK还是不OK
  • request body
    1Dubbo版本号
    2接口路径
    3接口版本
    4方法名称
    5参数类型
    6参数值
  • response body
    1结果标志(无结果、有结果、异常)
    2结果

协议的编解码过程:
在这里插入图片描述

四 源码探究

以明晰编码解码和序列化反序列化为目的探究源码。其实就是如上图所示的协议的编解码过程。

com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec是很重要的一个类,无论是request还是response,还有编码解码都在这里类进行调度。

DubboCodec:
在这里插入图片描述
其中重点关注三个方法
decodeBody():解码(请求或响应)以及序列化和反序列化
encodeRequestData():编码请求(发生在Consumer)
encodeResponseData():编码响应(发生在Provider)

1.编码序列化request

发生在Consumer发请求之前
encodeRequestData()

protected void encodeRequestData(Channel channel, ObjectOutput out, Object data) throws IOException {
        RpcInvocation inv = (RpcInvocation)data;
        out.writeUTF(inv.getAttachment("dubbo", DUBBO_VERSION));
        out.writeUTF(inv.getAttachment("path"));
 
  • 2
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Dubbo和Spring Cloud都是分布式服务框架,但它们的底层原理有一些不同。 Dubbo底层原理: 1. 注册中心:Dubbo采用注册中心来管理服务提供者的地址信息,服务消费者通过注册中心来获取服务提供者的地址信息。 2. 服务提供者:服务提供者将自己的地址信息注册到注册中心,等待服务消费者的请求。 3. 服务消费者:服务消费者从注册中心获取服务提供者的地址信息,然后通过网络请求服务提供者提供的服务。 4. 远程通信:Dubbo采用RPC(远程过程调用)技术进行远程通信,即服务提供者和服务消费者之间可以直接调用对方的方法,就像本地方法调用一样。 5. 负载均衡:Dubbo支持多种负载均衡算法,可以根据不同的业务场景选择不同的算法,如轮询、随机、最少活跃数等。 Spring Cloud的底层原理: 1. 服务注册与发现:Spring Cloud采用Eureka作为服务注册与发现中心,服务提供者将自己的地址信息注册到Eureka,服务消费者从Eureka获取服务提供者的地址信息。 2. 服务网关:Spring Cloud采用Zuul作为服务网关,所有的外部请求都会经过Zuul,Zuul可以对请求进行路由、过滤等处理。 3. 远程通信:Spring Cloud采用RESTful API进行远程通信,服务提供者和服务消费者之间通过HTTP协议进行通信。 4. 负载均衡:Spring Cloud采用Ribbon作为负载均衡组件,可以根据不同的业务场景选择不同的负载均衡算法,如轮询、随机、最少连接数等。 总的来说,Dubbo和Spring Cloud都是分布式服务框架,但Dubbo更加注重RPC技术的运用,而Spring Cloud则更加注重HTTP协议的运用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值