最近在整理课程,基于最新thingsboard版本3.9.1/4.0,欢迎大家点赞,收藏、关注我,提问,在评论区留言,我争取把最新、最准、最好的课程,呈现在各位亦师亦友的csdn广大读者面前。
目录
启动分析
查看整个项目的pom依赖项,在thingsboard-3.9.1\pom.xml文件中,如下:
<spring-boot.version>3.2.12</spring-boot.version>
<spring-data.version>3.2.12</spring-data.version> 简单且统一的方式来访问各种数据源
<spring-data-redis.version>3.2.12</spring-data-redis.version>
<spring.version>6.1.15</spring.version>
<spring-redis.version>6.2.11</spring-redis.version>
<spring-security.version>6.2.8</spring-security.version>
<jedis.version>5.1.5</jedis.version>
<jjwt.version>0.12.5</jjwt.version>
<slf4j.version>2.0.13</slf4j.version>
<log4j.version>2.23.1</log4j.version>
<logback.version>1.5.5</logback.version>
<rat.version>0.10</rat.version> <!-- unused -->
<cassandra.version>4.17.0</cassandra.version>
<metrics.version>4.2.25</metrics.version>
<cassandra-all.version>3.11.17</cassandra-all.version> <!-- tools -->
<guava.version>33.1.0-jre</guava.version>
<caffeine.version>3.1.8</caffeine.version>
启动服务端口
在windows环境下,打开cmd命令窗口,
使用netstat -ano 命令,可以看到,后台启动之后,服务端占用端口,如下:
http 8080 tcp
MQTT 1883 tcp
CoAP 5683 udp
lwM2M 5685 udp
lwM2M-security 5686 udp
lwM2M-bs 5687 udp
lwM2M-bs-security 5688 udp
websocket 8080(与http共享)
EDGE_RPC 7070 tcp
springboot项目的启动和初始化方式
一般情况下,基于springboot框架开发的项目,初始化资源的方式,大致有3类:
(1)Spring Bean初始化的InitializingBean,init-method和PostConstruct。
(2)Spring的事件机制(发布事件ApplicationEventPublisher,通过 @EventListener 注解或实现 ApplicationListener 接口来监听事件)。
(3)ApplicationRunner与CommandLineRunner接口。
ThingsBoard系统使用了上述1/2前两种方式。
所以,简单浏览查看一下系统启动项的方法,
可以全文搜索“@PostConstruct”,
可以全文搜索“@EventListener”,“ApplicationEventPublisher”
找到各个模块的启动方法。
系统组成
单体架构一共包含Core、Transports、Rule-Engine和Web-ui四部分内容。
(1)Core服务
tb-Core负责处理REST API调用和WebSocket订阅,还负责存储有关活动设备会话和监视设备连接状态。使用Actor系统实现主要实体的角色: 租户和设备。
接口包括:
ThingsboardServerApplication.java(启动类);
install服务开启相关配置、异常和调用;
exception响应错误及错误逻辑处理;
controller页面展示必要的系统数据接口;
service为controller提供支持;
config为同源策略、swagger、webSocket、消息及安全配置注册spring bean;
(2)Transports服务
基于MQTT、HTTP、CoAP和LwM2M的api,可用于设备应用程序/固件。每个协议 api都由一个单独的服务器组件提供,是 “传输层”的一部分。
一旦传输从设备接收到消息,该消息会被解析并推送到持久消息队列。
(3)Rule-Engine服务
TB规则引擎是系统的核心,负责用用户定义的逻辑和流程处理传入的消息。使用Actor系统来实现主要实体的参与者: 规则链和规则节点。规则引擎节点可以加入集群,其中每个节点负责传入消息的某些分区。
Rule Engin订阅来自队列的传入数据,并且只在处理消息后才确认该消息。有多种策略可用于控制订单或消息处理以及消息确认标准。
规则引擎可以在两种模式下运行: 共享和隔离。在共享模式下,规则引擎处理多个租户的消息。在隔离模式下,规则引擎可以配置为只处理特定租户的消息。
(4)Web-ui服务
是基于Angular+Express.js框架而编写的轻量级组件,承载静态ui内容,这些组件是完全无状态的,没有多少可用的配置。静态网页界面包含捆绑。
启动方法
对于关键模块,查看它们都是怎么启动和初始化的:
(1)Transport
mqtt启动,参考MqttTransportService.init方法。
MqttTransportServerInitializer负责配置Netty的ChannelPipeline,包括:
MqttDecoder:解码MQTT协议消息。
MqttEncoder:编码MQTT协议消息。
MqttTransportHandler:处理MQTT连接和消息。
MQTT连接认证流程:当设备发起MQTT连接时,MqttTransportHandler会处理CONNECT消息,验证设备凭证(如Access Token)。
(2)Actor
actor启动,参考DefaultActorService.initActorSystem方法,
DefaultActorService.initActorSystem初始化;
RootActor 初始化"子Actor"(如DeviceActor、RuleChainActor);
系统的消息流转基于TbActorMailbox和Dispatcher;
启动消费者线程,从队列(如 Kafka、RabbitMQ)拉取消息,如果消息是ActorMsg,则调用ActorSystemContext.tellWithHighPriority()投递到对应Actor。
(3)Rule-Engine
a. 启动消费者服务
DefaultTbRuleEngineConsumerService类init方法启动,如下:
b. 规则链加载
从数据库加载所有规则链(Rule Chain),并缓存到内存中,
c. 每个规则节点(Rule Node)实现 TbNode 接口,处理传入的消息
比如,TbMsgTypeSwitchNode
流程总结如下:
系统启动后自动调用DefaultTbRuleEngineConsumerService.init()。
消息队列消费者启动→监听tb_rule_engine队列。
规则链加载→从数据库加载RuleChain并缓存。
规则节点执行→处理传入的TbMsg并触发规则逻辑。
(4)Web-ui
省略。