2. ThingsBoard 架构总览:微服务架构、核心组件与租户位置
在深入租户管理之前,必须先理解 ThingsBoard 的整体架构。ThingsBoard 采用微服务架构,将平台功能拆分为多个独立服务,每个服务可独立部署、扩展和维护。这种架构为多租户资源隔离提供了天然基础——不同租户的流量和数据可以在服务层面进行逻辑或物理隔离。
2.1 微服务架构概览
ThingsBoard 的微服务架构围绕几个核心服务构建,每个服务负责特定的领域功能。下表列出了主要微服务及其职责:
| 微服务 | 核心职责 | 与租户的关系 |
|---|---|---|
| Transport 服务 | 处理设备连接协议(MQTT、HTTP、CoAP、LwM2M) | 按租户分配连接凭证,验证设备归属 |
| Rule Engine 服务 | 执行消息处理、数据过滤、告警、动作触发 | 租户可自定义规则链,隔离执行上下文 |
| Web UI 服务 | 提供用户管理界面、仪表板、设备管理 | 根据租户角色展示不同视图和数据 |
| Core 服务 | 管理设备、资产、租户、用户等实体 | 维护租户与实体的归属关系 |
| JS Executor 服务 | 执行 JavaScript 脚本(规则链、转换) | 租户脚本运行在独立沙箱中 |
| Queue 服务 | 消息队列(Kafka / RabbitMQ / AWS SQS) | 租户消息可路由到独立队列 |
架构要点:ThingsBoard 的微服务之间通过消息队列(默认 Kafka)进行异步通信,这种松耦合设计使得租户隔离策略可以在消息路由层实现,例如将不同租户的消息分发到不同的消费者组。
2.2 核心组件详解
2.2.1 Transport 组件
Transport 是设备接入的网关,负责协议适配和连接管理。它支持多种物联网协议,并将设备上报的数据统一转换为内部消息格式,发送到消息队列。Transport 组件在租户维度执行以下关键操作:
- 设备认证:验证设备凭证(Access Token、X.509 证书、MQTT 用户名/密码),确认设备所属租户。
- 租户速率限制:对每个租户的连接数、消息频率进行配额控制。
- 协议隔离:不同租户的设备可以使用不同的协议端口或 TLS 配置。
2.2.2 Rule Engine 组件
Rule Engine 是 ThingsBoard 的“大脑”,负责处理从 Transport 流入的消息。它基于规则链(Rule Chain)执行过滤、转换、持久化、告警、REST API 调用等操作。租户可以创建自己的规则链,实现业务逻辑的完全自定义。Rule Engine 的租户隔离机制包括:
- 规则链隔离:每个租户拥有独立的规则链命名空间,互不可见。
- 执行沙箱:JS 脚本在独立的 Node.js 沙箱中执行,防止租户脚本影响其他租户。
- 资源配额:限制每个租户的规则节点数量、脚本执行时间、内存使用。
2.2.3 Web UI 组件
Web UI 是用户与平台交互的界面,基于 Angular 构建。它通过 REST API 和 WebSocket 与后端通信。Web UI 的租户感知能力体现在:
- 租户切换:系统管理员可以切换到任意租户的上下文进行管理。
- 数据隔离:仪表板、设备列表、告警等数据根据当前租户过滤。
- 角色权限:租户管理员、客户用户等角色在 UI 层面拥有不同的操作权限。
2.3 租户在架构中的位置
租户是 ThingsBoard 多租户架构的核心隔离单元。从架构层面看,租户贯穿所有微服务,是数据归属和资源分配的根实体。下图展示了租户在微服务架构中的中心位置:
架构要点总结:
- 租户是顶层实体:在 ThingsBoard 中,租户位于实体层次结构的顶端,所有设备、资产、仪表板、规则链等实体都归属于某个租户。
- 微服务共享租户上下文:每个微服务在处理请求时都会解析租户 ID,确保数据访问和操作都在租户边界内执行。
- 消息队列支持租户分区:在 Kafka 等消息队列中,可以为不同租户分配独立的 topic 或 partition,实现消息级别的隔离。
- 数据持久化层隔离:无论是 SQL 还是 NoSQL 数据库,所有表都包含
tenant_id字段,作为数据隔离的第一道防线。
2.4 租户隔离的架构实现
ThingsBoard 在微服务架构中实现了多层次的租户隔离,确保不同租户的数据和资源互不干扰。下表总结了各层的隔离机制:
| 隔离层次 | 实现方式 | 隔离粒度 |
|---|---|---|
| 连接层 | Transport 服务根据设备凭证确定租户,拒绝未授权连接 | 设备级 |
| 消息层 | 消息队列按租户 ID 路由到不同分区或 topic | 消息级 |
| 处理层 | Rule Engine 为每个租户维护独立的规则链执行上下文 | 规则链级 |
| 存储层 | 所有数据表包含 tenant_id 字段,查询时自动过滤 |
行级 |
| 展示层 | Web UI 根据登录用户所属租户展示对应数据 | 用户级 |
| 资源层 | 微服务可配置租户级资源配额(连接数、消息速率、存储容量) | 租户级 |
架构设计提示:在部署 ThingsBoard 时,可以根据租户规模选择隔离策略。对于高安全要求的租户,可以将其部署到独立的 Transport 或 Rule Engine 实例上,实现物理隔离;对于普通租户,使用逻辑隔离即可满足需求。微服务架构使得这种混合部署成为可能。