04-Hprose总结

  • 介绍
    • 设计原则
    • RPC 协议
    • 函数列表
    • 传输协议绑定
    • WebSocket 绑定
  • 优缺点总结
  • 部分未完成内容

介绍

HPROSE 是 High Performance Remote Object Service Engine 的缩写,翻译成中文就是“高性能远程对象服务引擎”。

它是一个先进的轻量级的跨语言跨平台面向对象的高性能远程动态通讯中间件。它不仅简单易用,而且功能强大。你只需要稍许的时间去学习,就能用它轻松构建跨语言跨平台的分布式应用系统了。

Hprose 支持众多流行的编程语言,例如:

  • AAuto Quicker
  • ActionScript
  • ASP
  • C++
  • Delphi/Free Pascal
  • dotNET(C#, Visual Basic…)
  • Golang
  • Java
  • JavaScript
  • Node.js
  • Objective-C
  • Perl
  • PHP
  • Python
  • Ruby

通过 Hprose,你就可以在这些语言之间方便高效的实现互通了。

设计原则

Hprose 是作为一个轻量级、自描述、半文本、格式紧凑、动态类型、语言无关、平台无关的协议而设计的。Hprose 协议具有以下设计目标:

  • 它必须是自描述的,无需接口描述语言或外部描述定义。
  • 除了本来的二进制数据以外,它必须具有可读性,哪怕读起来稍微有些困难。
  • 它必须尽可能的格式紧凑。
  • 它必须尽可能的快。
  • 它必须是语言无关(跨语言)的。
  • 它必须是平台无关(跨平台)的。
  • 它必须支持递归类型数据。
  • 它必须支持 Unicode 字符串。
  • 它必须在无需转义和无需使用附件方式的情况下支持 8 位二进制数据。

RPC 协议

Hprose 远程过程调用(RPC)协议支持批量调用,引用参数传递,同步和异步通讯。

Hprose 远程过程调用(RPC)协议非常简单。它由几段数据组成。每段数据包括至少一个字节的标记。下面是Hprose 远程过程调用(RPC)协议的标记列表:

  • 0x46(‘F’): 函数列表
  • 0x43(‘C’): RPC 调用
  • 0x52(‘R’): RPC 结果
  • 0x41(‘A’): RPC 参数
  • 0x45(‘E’): RPC 错误
  • 0x7A(‘z’): 结束

函数列表

远程过程调用(RPC)服务器可以发布一个或多个函数/方法。每个函数/方法拥有一个名字。函数/方法名以字符串的形式表示。函数列表是一个函数方法名的 List。

如果客户端只发送一个结束标记 ‘z’ 到服务器端,而没有其它数据。那么服务器端应该返回函数列表。

Hprose 远程过程调用(RPC)协议是动态弱类型的。它支持动态类型参数,变长参数函数和方法。所以函数列表只是一个函数/方法名列表,而没有参数和结果的相关信息。

例如,如果服务器端发布了两个函数,一个是 ‘hello’,另一个是 ‘MD5’,那么函数列表应该以如下形式返回: Fa2{s5"hello"s3"MD5"}z

Hprose 远程过程调用(RPC)服务器支持发布缺失的函数/方法。这表示如果客户端调用一个服务器端不存在的函数/方法,它可以被一个统一的处理器所处理。如果服务器端设置有这样的一个统一的处理器。那么函数列表中需要有一个 ‘*’ 项来表示它。

例如:Fa1{s1"*"}z 函数/方法名和缺失函数/方法统一处理器可以被一起发布。

传输协议绑定

Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。

HTTP 绑定
当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任何特别的要求。

半双工套接字(Socket)绑定
Hprose 远程过程调用(RPC)也可以工作于 TCP 或 UNIX 套接字(Socket)之上。Hprose 远程过程调用(RPC)数据的长度以 BigEndian 的编码方式以 4 个字节的包头发送。Hprose 的数据作为包体部分直接发送,无需另外编码。

全双工套接字(Socket)绑定
半双工套接字绑定易于实现,但是对连接的利用率不够高。所以我们也支持全双工套接字绑定方式。Hprose 远程过程调用(RPC)数据的长度仍以 BigEndian 的编码方式以 4 个字节的包头发送,但是第一个字节首位总是被设为 1。该位并不是长度的符号位,因为长度总是正整数,它仅用于区别半双工还是全双工。接下来的 4 个字节表示请求的唯一标识(id)。这 8 个字节是包头。Hprose 的数据作为包体部分直接发送,无需另外编码。

WebSocket 绑定

Hprose 远程过程调用(RPC)也可以工作于 WebSocket 之上。 Hprose 远程过程调用(RPC)的数据以二进制数据的方式在 WebSocket 上发送和接收。

Hprose 远程过程调用(RPC)添加了 4 个字节的头作为请求唯一标识(id),服务器端不需要关心请求唯一标识(id)如何编码,只需要在应答中重复它就可以了。

优缺点总结

优点:
1. Hprose整体设计和实现都非常惊艳,是一个很不错的RPC和推送服务。特别是针对Java,js,golang,PHP的项目代码质量和效果都非常好。对于刚好是那几种推荐语言的用户而言,值得一用!
2. 官方QQ群很热情,有事没事都可以问问!赞!

缺点:
1. 代码质量参差不齐。由于不同的语言实现由不同的团队/个人负责,对于用户量大的项目质量很不错,对于用户量小的Cpp,rust等项目质量堪忧。
2. 不是所有的语言都支持所有的功能!!!!这点很坑!!甚至部分用户量小的项目编译都有问题。
3. 没有完善的文档!!很多设计项目细节都不一样,修改和了解代码都有很多问题。

部分未完成内容

修改官方hprosecpp1x项目,在VS下编码的项目及问题:
https://github.com/BBDXF/hprosec1x-vs

Pub/Sub部分修改了很久,一直有问题,没有提交。哪位看官知道如何处理,可以一起聊聊!

你可能感兴趣的:(RPC,Micro)