微服务开发实战协议篇之XMPP - TBD

概述

大多数的微服务, 基于 HTTP REST 协议就够了. 但是HTTP 1.0 的 request/response 请求/应答模式在即时消息应用这一类的微服务就不太适用了。

所以这时可以考虑协议 XMPP 和 MQTT , 甚至基于 WebSocket 的二进制消息。

XMPP(可扩展的消息传递和存在协议)专门为即时消息应用设计的协议。
XMPP 历史稍长,比较成熟,应用和库也比较多,比如Jabber, Google Talk(现在改为 Hangouts 环聊),WhatsApp。 但是所使用的 XML 也比较繁琐, 消息体比较大, 所以在移动网络和物联网中有些力不从心。

MQTT(MQ Telemetry Transport)专门为 IoT 物联网的设备所设计的一种通信协议,适用于功率, 容量和计算能力比较低的设备。 它快速和可靠,消息体小,传输和解析效率比较高。比较 Facebook Messenger 就使用 MQTT。 但是它应用不广,参考资料和相关的软件库不多。先来重点谈谈 XMPP

XMPP

XMPP 即 eXtensible Messaging and Presence Protocol 扩展消息和出席协议
它是以一种双向的流式XML表示的即时消息应用协议

大家最熟悉的即时消息应用莫过于 QQ 和微信了, 腾讯使用的是自己的私有协议, 而 XMPP 是开放的公有协议, 任何人都可以参考和免费使用

XMPP 有两个主要的协议

  • XMPP Core - RFC6120 XMPP 核心协议
1598924-1dfc2a4adf0462eb.png
XMPP Core
  • XMPP Instant Messaging and Presence - RFC6121 XMPP 即时消息和出席协议
1598924-143c184f6e5824a9.png
XMPP IM

还有许多扩展的协议(http://xmpp.org/extensions), 常用的有

1598924-8a55740ce7825d26.png
XMPP MUC

术语

  • bare JID : 基本JID
    localpart@domainpart
  • full JID: 完整 JID, 区别是加上了资源部分
    localpart@domainpart/resourcepart
  • XML stanza: XML 节, 即一个XMPP的XML 消息
  • route: 路由, 一个消息经由什么路径发到目的地

XMPP stream 搭建过程

1598924-55da5379c13d2e14.png
Simple connect flow
participant client as client
participant server as server

client->server: 1) start stream
server-->client: 2) start stream and features
client->server: 3) auth
server-->client: 4) success
note over client, server: sasl negotiation success
client->server: 5) restart stream
server-->client: 6) restart stream and features
client->server: 7) resource bind iq
server-->client: 8) iq result

1598924-a5f90ca16c9559e9.png
connect, auth and resource bind
participant client as client
participant server as server

client->server: 1) start stream
server-->client: 2) start stream and features
client->server: 3) starttls
server-->client: 4) proceed
note over client, server: tls negotiation success
client->server: 5) restart stream
server-->client: 6) restart stream and features
client->server: 7) auth
server-->client: 8) challenge
client->server: 9) response
server-->client: 10) success
note over client, server: sasl negotiation success
client->server: 11) restart stream
server-->client: 12) restart stream and features
client->server: 13) resource bind iq
server-->client: 14) iq result
client->server: 15) session iq
server-->client: 16) iq result

架构

  • Global addresses
  • Presence
  • Persistent Streams
  • Structured Data
  • Distributed Network of Clients and Servers

XML stanza

XML 节

<message/>
<presence/>
<iq/>

presence

  • presence
    • type
      • subscribe
      • subscribed
      • unavailable
    • child
      • delay
      • show
        • chat
        • away
        • xa
        • dnd
      • status
      • priorities 优先级,如果同一帐号来自不同设备
    • directed presence: not for all roster, just for one

iq

  • iq
    • request
      • get
      • set
    • response
      • result
      • error

message

  • message
    • normal
    • chat
    • groupchat
    • headline
    • error

FAQ

How to open a stream

      <?xml version='1.0'?>
      <stream:stream
          from='juliet@im.example.com'
          to='im.example.com'
          version='1.0'
          xml:lang='en'
          xmlns='jabber:client'
          xmlns:stream='http://etherx.jabber.org/streams'>

The stream negotiation process

How to close a stream

The directionality of XML streams

How to handle peers that are silent

The XML attributes of a stream

The XML namespaces of a stream

Error handling related to xML streams

MQTT

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值