文档章节

RSF 分布式服务框架-传输协议层设计

哈库纳
 哈库纳
发布于 2014/11/07 17:27
字数 1620
阅读 1312
收藏 10
点赞 1
评论 0

这是接上一篇文章《RSF 分布式服务框架设计》之后的续作,主要是 Hasor-RSF 协议层的设计。

    RSF 的协议层设计可以很复杂也可以很简单。复杂是指这一层可以嵌套多层协议栈,让 RSF 的交互数据可以跑在各种协议之上,例如:HTTP、RTMP、也可以跑在相对底层的协议例如:TCP、UDP。

    RSF 在协议层的设计上需要保留可能将来嵌套其它协议的支持,但不要设计的过于复杂。因此 RSF 的协议层的实现应该被分为两层,如下:

    位于底层的传输协议可以是 TCP、UDP、RTMP、HTTP、等等各类听过或者没听过的网络协议。对于这些传输协议的要求只有一个  -- 那就是可以传输 RSF 数据包。

    在 RSF 初期完全可以忽略传输协议这一层的设计,只要将 RSF 数据包丢到网络上然后远程程序接收到即可。因为传输协议无外乎是相当于给 RSF 数据包套了一层马甲,而这层马甲在初期作用并不大,可以随着完善逐步丰富。

    接下来就是最关键的部分RSF 数据包的格式了,RSF 数据包的大体格式是“定长包头 + 变长包体”这种形式。并且协议被设计成为无状态的。

RSF数据交互形式:

    RSF交互协议采用(请求/响应)这种模式,客户端发送某种类型的RSF数据包,服务器响应这种类型的请求。不需要握手协议。同时也是无状态的。

RSF数据包格式:

请求

* RSF 1.0 Request 协议
 * --------------------------------------------------------bytes =13
 * byte[1]  version                              RSF版本(0xC1 or 0x81)
 * byte[8]  requestID                            请求ID
 * byte[1]  keepData                             保留区
 * byte[3]  contentLength                        内容大小(max ~ 16MB)
 * --------------------------------------------------------bytes =10
 * byte[2]  servicesName-(attr-index)            远程服务名
 * byte[2]  servicesGroup-(attr-index)           远程服务分组
 * byte[2]  servicesVersion-(attr-index)         远程服务版本
 * byte[2]  servicesMethod-(attr-index)          远程服务方法名
 * byte[2]  serializeType-(attr-index)           序列化策略
 * --------------------------------------------------------bytes =1 ~ 1021
 * byte[1]  paramCount                           参数总数
 *     byte[4]  ptype-0-(attr-index,attr-index)  参数类型1
 *     byte[4]  ptype-1-(attr-index,attr-index)  参数类型2
 *     ...
 * --------------------------------------------------------bytes =1 ~ 1021
 * byte[1]  optionCount                          选项参数总数
 *     byte[4]  attr-0-(attr-index,attr-index)   选项参数1
 *     byte[4]  attr-1-(attr-index,attr-index)   选项参数2
 *     ...
 * --------------------------------------------------------bytes =6 ~ 8192
 * byte[2]  attrPool-size (Max = 2047)           池大小 0x07FF
 *     byte[4] att-length                        属性1大小
 *     byte[4] att-length                        属性2大小
 *     ...
 * --------------------------------------------------------bytes =n
 * dataBody                                      数据内容
 *     bytes[...]

响应

* RSF 1.0 Response 协议
 * --------------------------------------------------------bytes =13
 * byte[1]  version                              RSF版本(0xC1 or 0x81)
 * byte[8]  requestID                            包含的请求ID
 * byte[1]  keepData                             保留区
 * byte[3]  contentLength                        内容大小(max ~ 16MB)
 * --------------------------------------------------------bytes =8
 * byte[2]  status                               响应状态
 * byte[2]  serializeType-(attr-index)           序列化策略
 * byte[2]  returnType-(attr-index)              返回类型
 * byte[2]  returnData-(attr-index)              返回数据
 * --------------------------------------------------------bytes =1 ~ 1021
 * byte[1]  optionCount                          选项参数总数
 *     byte[4]  attr-0-(attr-index,attr-index)   选项参数1
 *     byte[4]  attr-1-(attr-index,attr-index)   选项参数2
 *     ...
 * --------------------------------------------------------bytes =6 ~ 8192
 * byte[2]  attrPool-size (Max = 2047)           池大小
 *     byte[4] att-length                        属性1大小
 *     byte[4] att-length                        属性2大小
 *     ...
 * --------------------------------------------------------bytes =n
 * dataBody                                      数据内容
 *     bytes[...]

    上面列出了RSF在网络通信中所使用的数据包结构。

    RSF数据包的主要结构是: “Head + ContentLength + Content”,这种包结构可以很方便的在底层网络框架上予以解析而且简单易懂。相比较淘宝 HSF2.0 的协议 RSF 的扩展性还算蛮强的。

Head 头:

    RSF 的协议头采用 13 字节固定长度,其中包括了RSF在通信上的 5 个基本数据(RSF协议标记、协议版本、包类型、请求ID,数据包长度)。

    第一个字节中RSF目前规定只有:“0xC1” 和 “0x81” 两个值。其中第1个二进制位用于表示RSF数据包,第2个二进制位用来表示请求或者响应,后面6个二进制位用来表示RSF协议版本。

    所以有了:“0x80”可以用来检验是否为RSF数据包、“0xC0”用来表示RSF 请求数据包、“0x80”用来表示RSF响应数据包。所以依照这个规则“B2F2DAFF”等值都是合法的,不过因为目前RSF协议版本只有1.0,所以只有 0xC1 和 0x81 是有效的。

    接下来8个字节用来表示一个 long 值,这个值是请求ID。请求ID的作用是区分同一客户端在并发调用的情况下区分不同调用而设计的。

    在接下来的 1 个字节为保留位。随后的 3 个字节表示一个 int 类型,这个值表示的是 RSF 头之后的 RSF 数据包总长度。这样就限制了RSF数据包大小最约 16MB

Content 结构:

    RSF 的包体中协议格式和传输的数据是分离设计的,这种设计会让协议本身的结构显得非常清晰。所有的属性值都会保存在属性池中,并且以其在属性池中位值加以替代。例如:

服务名为:“org.example.hello.MyService”的信息转换为二进制之后,将其放入属性池,然后用其在属性池中的位置加以表示(2字节 short 类型)。

    此外对于键值这种结构的数据将会采用(4字节来表示),其中 key 由前两个字节表示,value用后两位字节表示。而这 4个字节恰好可以使用 int 类型来表示。

    依照上面两个规则就形成了 RSF 请求响应的数据结构。

    最后是属性池的设计,属性池的最大容量是 65535 条。依照现有的RSF协议规定根本无法达到这个量级,所以是十分安全的。

    属性池中的数据都是 4 字节,用来表述内容大小。例如上面那个服务名其在属性池中的值是 27。

    最后 dataBody 部分将会按照属性池中的顺序一次将属性内容排列下去。

    假设提取位于属性池 3 号位置的属性属性值是 23,其前面两个属性大小均为 10 字节,那么 3号属性的实际位置就是 dataBody区域的 20~43 位置的数据。

属性池的 0 号属性:

    属性池中 0 号属性是 RSF 协议中规定的固定属性,其属性值为 0。作为 0 长度的属性在 dataBody 区域是不会产生任何数据输出。


© 著作权归作者所有

共有 人打赏支持
哈库纳

哈库纳

粉丝 953
博文 81
码字总数 149803
作品 4
杭州
后端工程师
RSF 分布式服务框架设计

是时候设计一个分布式服务框架了。我先将它定名为 Hasor-RSF,“RSF”为 Remote Service Framework 的缩写。 RSF的目的是为了提供一种高效的远程服务访问方式,例如“A机器访问在B机器上的一...

哈库纳 ⋅ 2014/09/21 ⋅ 25

RSF 分布式 RPC 服务框架的分层设计

RSF 是个什么东西? 一个高可用、高性能、轻量级的分布式服务框架。支持容灾、负载均衡、集群。一个典型的应用场景是,将同一个服务部署在多个Server上提供 request、response 消息通知。使用...

哈库纳 ⋅ 2016/10/28 ⋅ 4

轻量化的分布式服务框架 Hasor-RSF 盘点

介绍: 一个轻量化的分布式服务框架,相信这类框架已经不是什么新鲜事物,可用的替代方案有很多这里就不多说了,说一下RSF解决的问题把。 1.分布式 这个是基本功能之一,消费者会自动轮询本地...

哈库纳 ⋅ 2015/03/12 ⋅ 13

RSF 分布式服务框架设计:线程模型

RSF 的线程模型 使用了 RSF 框架之后系统一共会产生至少 7 条线程,有些功能的线程可能会产生多个。我们先来鸟瞰一下所有的线程和它们的大致功能。 初一看,还真是挺复杂的,这么多线程,这么...

哈库纳 ⋅ 2016/11/01 ⋅ 0

服务框架 RSF 1.2.0 发布,新增多协议&跨语言支持

服务框架 RSF 1.2.0 发布,本地发布最大亮点在于新增了:多协议、跨语言的特性。语言方面大约涵盖了大约 25种语言。 在原有 RSF RPC 协议下,通过与 Hprose 进行合作新增了 Hprose HTTP协议 ...

哈库纳 ⋅ 2017/02/03 ⋅ 4

RSF-Center,集群模式下-协调数据结构

RSF是一个轻量化的分布式服务框架。支持点对点调用,也支持分布式调用。典型的应用场景是,将同一个服务部署在多个Server上提供 request、response 消息通知。它的设计思想是:通过Netty实现...

哈库纳 ⋅ 2016/02/05 ⋅ 2

RSF 分布式服务框架-服务端工作原理

这是接上一篇文章《RSF 分布式服务框架设计》之后的续作,主要是 Hasor-RSF 的请求响应工作原理以及设计思路。 非常首先非常感谢关注这一系列文章的兄弟们,由于我个人时间不确定所以 RSF 更...

哈库纳 ⋅ 2014/11/20 ⋅ 0

RSF 1.3.0 正式发布,剥离注册中心、修正多协议兼容

RSF 1.3.0 正式发布啦,本地发布主要是:剥离出独立的注册中心、修正多协议兼容的问题 新增 01.RSF项目拆分成 framework 和 registry 两个部分。 02.framework 项目是 RSF 的核心实现了 P2P ...

哈库纳 ⋅ 2017/02/20 ⋅ 1

分布式一致性,技术选型之路

问题描述: 好了下面开始正文,写的比较潦草。 ---------------- ZooKeeper 作为数据中心问题。后来发现单纯使用 ZK 有这么几个问题: ZK 配置繁琐,整个 Center 所有配置加...

哈库纳 ⋅ 2016/09/12 ⋅ 7

RSF 1.0.1 分布式服务框架,新增 Spring/JFinal 支持

RSF 1.0.1 分布式服务框架,新增 Spring/JFinal 支持。 Hasor-RSF是一个高可用、高性能、轻量级的分布式服务框架。支持容灾、负载均衡、集群。一个典型的应用场景是,将同一个服务部署在多个...

哈库纳 ⋅ 2016/11/08 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud 微服务 (六) 服务通信 RestTemplate

壹 通信的方式主要有两种,Http 和 RPC SpringCloud使用的是Http方式通信, Dubbo的通信方式是RPC 记录学习SpringCloud的restful方式: RestTemplate (本篇)、Feign 贰 RestTemplate 类似 Http...

___大侠 ⋅ 10分钟前 ⋅ 0

React创建组件的三种方式

1.无状态函数式组建 无状态函数式组件,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑。 无状态函数式组...

kimyeongnam ⋅ 16分钟前 ⋅ 0

react 判断实例类型

今天在写组件的时候想通过判断内部子元素不同而在父元素上应用不同的class,于是首先要解决的就是如何判断子元素的类型。 这里附上一个讲的很全面的文章: https://www.cnblogs.com/onepixel...

球球 ⋅ 23分钟前 ⋅ 0

Centos7备份数据到百度网盘

一、关于 有时候我们需要进行数据备份,如果能自动将数据备份到百度网盘,那将会非常方便。百度网盘有较大的存储空间,而且不怕数据丢失,安全可靠。下面简单的总结一下如何使用 bypy 实现百...

zctzl ⋅ 37分钟前 ⋅ 0

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 40分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 47分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 今天 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 今天 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 今天 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部