核心概念
路由器
包
消息在网关中流动的单位称为包,包具有以下结构:
字段名 | 数据类型 | 说明 |
---|---|---|
head | Head | 头 |
body | Object | 体 |
每个包拥有一个头和体:其中,头中包含了这个包是来自哪里,发往哪里,以及体中的格式是怎样的。 体是一个 JSON 序列化后的字节数组:在整个包被 JSON 序列化以后,Body 的值即为相应的 Object。
头
字段名 | 数据类型 | 说明 |
---|---|---|
uuid | string | UUID |
from | string | 来自 |
to | string | 发往 |
reply_to_uuid | string | 回复的 UUID |
acknowledge_channel_uuid | string | 生产者频道,用于路由器通知生产频道 |
format | Format | 体的格式 |
一个合法的头中必须含有 UUID,没有合法 UUID 的包会直接被丢弃。
格式
格式包括 API,版本,方法和协议四部分,这四部分共同表示了体中的数据结构是什么样的。
具体有哪些格式可以参考格式对照表。
字段名 | 数据类型 | 说明 |
---|---|---|
api | string | API |
version | string | 版本,必须遵循 Semantic Versioning |
method | string | 方法 |
protocol | string | 协议 |
频道
接收和发送包的单位称为频道。路由器将包在频道之间路由。
包只能在频道中单向流动。向路由器释放包的频道称为生产者频道。
接收包的频道称为消费者频道。路由器会不断地从生产者频道中取出包路由给消费者频道。
路由规则
每个消费者频道在建立的时候可以指定一系列路由规则。 路由器会根据各个消费者频道的路由规则决定是否要把一个包路由给它。
字段名 | 数据类型 | 说明 |
---|---|---|
from | string | 来自,可以使用正则表达式 |
to | string | 发往,可以使用正则表达式 |
formats | Format[] | 格式,其中的版本字段为版本约束字符串。Semantic Versioning 标准尚未制定版本约束规范,程序目前使用的实现是 semver |
适配器
适配器是一种接口,几乎所有的插件都实现了适配器。 网关启动时会启动所有的适配器。
type Adapter interface {
Start()
}
适配器通常用于提供途径来使外部程序可以操作路由器,如创建频道, 从频道接收和发送消息等。 适配器可以在启动时向路由器注册频道或启动一个服务。
生产者
当一个适配器建立起生产者频道并向频道中生产消息时, 我们称这个适配器正在扮演生产者。
消费者
当一个适配器建立起消费者频道并从频道中取出消息时, 我们称这个适配器正在扮演消费者。
转换器
转换器是一种接口,它能够将一个包从一种格式转换为另一种格式。 路由器在发现一个包可以被路由但是包的格式不符合消费者频道的要求时, 会尝试使用转换器进行转换。
type Converter interface {
IsConvertible(from Format, to Format) bool
Convert(packet Packet, to Format) (bool, []Packet)
}
转换器也常常同时实现了适配器, 因为在转换格式时有时需要填充某些内容,而填充这些内容所需要的信息已知包并没有提供 (例如:UBM-API 中的 is_message_to_me 字段需要知道自己的 ID), 此时需要额外的请求(向路由器发出和接收包)来获得这些信息。