概述
大多数的微服务, 基于 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](https://i-blog.csdnimg.cn/blog_migrate/4ed338ca65552c268d28bee0b4b696a3.png)
- XMPP Instant Messaging and Presence - RFC6121 XMPP 即时消息和出席协议
![1598924-143c184f6e5824a9.png](https://i-blog.csdnimg.cn/blog_migrate/265147e19542263fe0084e0fcb1d3133.png)
还有许多扩展的协议(http://xmpp.org/extensions), 常用的有
![1598924-8a55740ce7825d26.png](https://i-blog.csdnimg.cn/blog_migrate/6d8db96f9917a19dfb1c8b642285f3ab.png)
- XEP-0030 (PDF) Service Discovery
- XEP-0020 (PDF) Feature Negotiation
- XEP-0060 (PDF) Publish-Subscribe
- XEP-0047 (PDF) In-Band Bytestreams
- XEP-0004 (PDF) Data Forms
- XEP-0166 (PDF) Jingle
术语
- bare JID : 基本JID
localpart@domainpart - full JID: 完整 JID, 区别是加上了资源部分
localpart@domainpart/resourcepart - XML stanza: XML 节, 即一个XMPP的XML 消息
- route: 路由, 一个消息经由什么路径发到目的地
XMPP stream 搭建过程
![1598924-55da5379c13d2e14.png](https://i-blog.csdnimg.cn/blog_migrate/793d964e3607c69041cb67ab60cf9e8d.png)
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](https://i-blog.csdnimg.cn/blog_migrate/85752292eecb311bda8a48b6ad4dd102.png)
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
- type
iq
- iq
- request
- get
- set
- response
- result
- error
- request
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'>