没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。 (2)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。 (2)

Dubbo协议的设计与解析


为什么要先聊一下 Dubbo 的协议呢?


因为反序列化的时候涉及到一些响应头(head)和响应体(body)解析的相关内容,是需要先进行一下铺垫的。


首先去官网上撸个图片过来:


image.png


可以看到 Dubbo 数据包分为消息头(head)和消息体(body)。


消息头用于存储一些元信息,包括:魔数、数据包类型、调用方式、事件标识、序列化器编号、状态、请求编号、消息体长度。


消息体中用于存储具体的调用消息,包含七部分内容:


  • Dubbo 版本号(Dubbo version)


  • 服务接口名(service name)


  • 服务接口版本(service version)


  • 方法名(method name)


  • 参数类型(parameter types)


  • 方法参数值(arguments)


  • 上下文信息(attachments)


客服端发起请求的时候严格按照上面的顺序写入消息,服务端按照同样的顺序读取消息,这样就能解析出消息体里面的内容。


对于协议字段的解析,官网上也是有详细说明的。撸过来:


image.png


image.png


image.png


每个 class 文件的头 4 个字节就是魔数,它的唯一作用就是确定这个文件是否为一个能被 JVM 接受的 class 文件。


在 Dubbo 中这个魔数是用来干什么的呢?


也许你不太清楚,但是我希望我一说你就


能恍然大悟。因为你不悟,也不是本文要讲的东西,我也不好给你解释清楚。


它是用来解决网络粘包/解包问题的。恍然大悟有没有?




没有?


对不起,本文不扩展相关内容。大学的时候《计算机网络》课程的时候逃课处对象去了吧?



image.png


首先这个字段仅在第 16 位设置为 1 的情况下有效。


从表里面我们可以知道,第 16 位为 1 就是指:request 请求。


在 rpc 中既然是 request ,那么就分为两种调用方式:有去无回(单向)、有来有回(双向)。


熟悉吗?


不熟悉?呸,你个假粉丝,这张图在我的文章中至少出现过两次:


image.png


oneway 就是单向,其他的调用类型都是有返回的。


所以调用分为两种类型,因此需要一个 bit 来存放调用方式。


第三个说说事件标识字段


image.png


状态里面有个省略号,说明没有枚举完。但是代码里面肯定是齐的,这些状态对应的代码在这个类里面,一共 11 个,给大家补充完

整: org.apache.dubbo.remoting.exchange.Response


微信图片_20220426210653.png


目录
相关文章
|
4月前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
2月前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
3月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
99 20
剖析 Redis List 消息队列的三种消费线程模型
|
2月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
50 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
2月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
2月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
25 0
|
5月前
|
缓存 编译器 Go
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
58 3
|
5月前
|
算法 调度 人工智能
人工智能线程问题之无锁化编程如何解决
人工智能线程问题之无锁化编程如何解决
50 2
|
5月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决