RPC 是一种基于request/response 模式的分布式协议。而MQTT 是基于pub/sub模式的协议。是否能够将这两种协议相结合,实现RPC Over MQTT ?我并没有发现由比较知名的RPC over MQTT协议。于是,自己着手设计一个极简的RPC Over MQTT 协议。

本文介绍modular-2 Edge 中,使用MQTT 协议实现RPC 的方法。

在modular-2 Edge 微服务架构中,提供了三种RPC 形式,它们分别是:

1 websocket RPC

2 MQTT RPC

3 HTML Restfull RPC

虽然三种方式的协议不同,但是消息体(message body )是一样的都是json格式的消息体,可以相互转换。当一个App 通过MQTT 客户端发布了一个RPC 消息后,如果该RPC 是websocket 类型的,会被base service 自动接收,并且通过websocket 转发到相关的App。

同样地,如果一个websocket RPC ,会被base service 发送给MQTT Broker ,有它转换成为MQTT 消息,发送给相关的App。

topic语法

MQTT 是基于topic 订阅和发布的通信方式。实现MQTT 协议的难点是设计一个合适的topic 命名方式和语法。

对于一个复杂系统,topic 命名更具有挑战性。

在实现RPC Over MQTT时,需要有一个唯一的topic 来标识一个RPC 调用和结构。它需要反映如下信息

目标名称 发往的App名称

信源名称 发送App 的名称

RPC方法 虽然在消息体的json 描述中含有RPC 但是为了订阅和发布的方便。在topic 中也需要包含了method 的名称。

因此,我们设计的topic 格式为:

<destination>/<originator>/<method>

其中

<destination> 接收者的App名称

<originator>  发送者的App名称

<method>方法的名称

通知

<destination><originator><method><inf>

 为什么要在topic 中包含目标和信源的名称呢?

实例:

App 注册 (register App)

microservice1/gpio/register

数字IO 写(DigitalOut.Write)

microservice1/gpio/digitaloutwrite

数字IO翻转(DigitalOut.flipflop)

microservice1/gpio/digitaloutflipflop

模拟量输入

microservice1/vibration/analogread

modbus请求

microservice1/weather/modbusrequest

消息体

MQTT 的payload 采用了json 格式的rpc,例如

jsonrpc={

method:“microservice/digitalOut.write";

mode:2;

params:{

value[1,0]

}

id:1

}

处理流程

1 baseservice 订阅

  • 订阅baseservice 的RPC。

subscribe(“baseservice/#”)

  • 订阅所有websocket RPC

当一个websocket 的RPC 注册时,要向MQTT Broker 订阅该RPC.例如:

subscribe(“microservice/+/digitalOut.write);

2 App 订阅发送给它的MQTT 消息,如果App 是gpiomqtt,那么它会订阅:

subscribe(“”gpiomqtt/#”);

3 MQTT 命令出错

baseservice 会向App 发送 error 消息,topic为

<appname>/<baseservice>/error

消息体是json 格式的出错信息。

结论

在modular-2 微服务架构中,采用了最简单的MQTT topic 设计,实现了RPC over MQTT 协议。并且和websocket RPC 兼容。MQTT 的应用中,应该避免MQTT topic 的随意性,将topic 减少到最简单。是一个好的方法。

基于MQTT的RPC协议相关推荐

  1. 电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台

    MQTT 是用于物联网的标准消息传递协议.它被设计为一种非常轻量级的发布/订阅消息传送,非常适合以较小的代码占用量和网络带宽连接远程设备.MQTT 协议具有以下特点: 轻巧高效:MQTT 客户端非常小 ...

  2. 基于MQTT协议的WZ指令开发V3.0版本支持onenet

    title: 基于MQTT协议的WZ指令开发V3.0版本支持onenet tags: WZ指令 date: 2019-02-18 10:53:00 视频讲解:(V3.0版本)-https://www. ...

  3. STM32F103代码远程升级(五)基于MQTT协议WiFi远程升级代码的实现

    文章目录 一.WiFi模块的选用与介绍 二.ESP8266的固件擦除与烧写 1.ESP8266 Flash擦除工具的安装与使用. 2.ESP8266固件烧写 (1)在线获取固件文件 (2)获取SDK ...

  4. 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用

    cz88 基于 cz88 纯真IP数据库开发的 IP 解析服务 - 支持 http 协议请求或 rpc 协议请求,也支持第三方包的方式引入直接使用 Go 语言编写 进程内缓存结果,重复的 ip 查询响 ...

  5. gprs模块http mqtt_基于GPRS模块的MQTT至MODBUS协议转换器

    [报名阶段需要填写的内容] 1.参赛者姓名(必填项): 方海钰 2.单位或学校名称(选填项): 3.当前职务或职称(选填项): 4.参赛作品的名字(必填项): 基于GPRS模块的MQTT至MODBUS ...

  6. 基于MQTT应用层协议的物联网家庭温湿度监测系统

    引言 出生于互联网时代的我们,见证了智能手机和个人电脑通过计算机网络互相进行连接,把每个人紧密地连接在一起,形成了一个地球村.而今,我们即将迈入5G时代,在通信技术不断发展的今天,连接到互联网的将不仅 ...

  7. 基于MQTT协议实现微信小程序控制树莓派

    基于MQTT协议实现微信小程序控制树莓派 在我的github上有源码,大家可以直接下载来用 https://github.com/yjc-123/-MQTT- ,这里给大家说一下实现的过程. 小程序端 ...

  8. python实现基于RPC协议的接口自动化测试

    什么是RPC RPC(Remote Procedure Call)远程过程调用协议是一个用于建立适当框架的协议.从本质上讲,它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程的. ...

  9. 从0到1实现python基于RPC协议的接口自动化测试

    01.什么是RPC RPC(Remote Procedure Call)远程过程调用协议是一个用于建立适当框架的协议.从本质上讲,它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程 ...

最新文章

  1. [基础知识]Linux新手系列之三
  2. Spring Boot 缓存应用实践
  3. 泰拉瑞亚服务器权限文件,泰拉瑞亚云服务器权限
  4. java 很垃圾_JAVA吧真的很垃圾!!!
  5. 970页绝版资料!初高中数学与竞赛知识点+方法技巧,由苏步青当顾问,众多一线名师共同编写!...
  6. VS2019编译 当前最新版chromium
  7. PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解...
  8. Win7 64位下配置jboss7
  9. messagebox 全部使用_你一定要知道的Windows 10系统的使用技巧
  10. 荣威i5能升级鸿蒙系统吗,荣威i5更新系统方法
  11. Flutter: MobX和flutter_mobx状态管理器
  12. Mybatis分页插件PageHelper查询ORACLE数据库示例
  13. 金蝶盘点机PDA轻松扫码产品入库,生产型企业进销存条码管理软件
  14. 举例一种计算机病毒,电脑病毒介绍及举例
  15. ARM和Linux下 nanomsg 编译与使用
  16. html编辑中,出现报错 semi-.colon excepted css(………)
  17. 【二〇二〇·秋】读书笔记
  18. 随机取中文名字,百家姓,2500个常见字,支持复姓
  19. openCV视频操作(C++版本)
  20. 如何通过photoshop制作保存*.ico的图标文件教程

热门文章

  1. CodeForces 337D Book of Evil(双向dfs)
  2. 服务器ups作用,机房UPS电源对服务器太重要了
  3. 客户想要的 vs 客户实际预算:漫画解读软件开发模式 ​​​​
  4. C语言按键控制喇叭,Windows环境下C语言控制你的PC喇叭(PC Speaker)编程
  5. word嵌入对象依损坏_word的操作问题.
  6. My X264 settings
  7. (ICLR-2022)TADA!用于视频理解的时间自适应卷积
  8. SQL Server集群
  9. ganymed ssh-2 for java_如何利用Ganymed SSH-2模拟SSH操作
  10. 我祖上三代都是以打鸟为生的