项目总览
application: 应用程序主目录,整体项目打包时也是这个Module
src/main/java/org.thingsboard.server: app主目录
actors: actor执行者目录
config: 配置类目录
controller: 控制器
exception: 异常处理
service: 服务目录,app打包后,server要运行的服务的实现都在这里
cluster: 集群服务,包括服务发现、服务实例等
script: 脚本执行服务,主要是规则引擎的执行(JS)
transport: 消息传输服务
rpc: 远程调用服务
utils: 工具类
common: 公共工具集、方法集模块
dao-api: 数据访问对象的服务接口,在这里做定义
data: 用于不同数据库之间的中间数据结构
message: 消息服务的实现集,包括集群消息、TB的基础服务消息、系统类消息
queue: 队列服务的实现集,用的Kafka
transport: 消息传输通道服务的实现,定义公共接口,给客户端的transport层使用
coap: CoAP消息传输的实现,包括适配器和客户端
http: HTTP消息传输的实现
mqtt: MQTT消息传输的实现,包括适配器、会话、SSL工具等
util: 工具集(当前仅有一个异步回调工具)
dao: 数据访问对象集合,整个应用的DAO层,一般只要dao的都要data,以实现不同数据库数据结构兼容。
docker: 集群部署-docker容器解决方案,包含了部署环境和shell脚本
haproxy: HAproxy工具的配置文件存放处
tb-node: 应用程序节点配置存放目录
tb-transports: 消息传输服务的配置文件,包括coap,http,mqtt
img: 应用图标存放处
k8s: 容器编排工具Kubernetes的配置文件和自动化脚本
msa: 微服务半自动构建模块,包含了黑盒测试、js执行引擎等
black-box-tests: 黑盒测试工具
js-excutor: js执行引擎,基于nodejs,用于执行规则引擎中的js代码(沙盒执行)
tb: tb主应用程序配置
tb-node: tb程序节点配置
transport: docker中的消息传输服务的部署配置
web-ui: TB的Web用户界面在docker中部署的配置,自带http server
netty-mqtt: TB的MQTT协议的实现,包括连接、发布、订阅、遗嘱、关闭等
rule-engine: TB的规则引擎,TB没有用开源的Drools等工具,而是自己开发了一套规则引擎,主要包含3个组件和1套服务接口
rule-engine-api: 服务接口的实现
rule-engine-components: 规则引擎组件,包含滤波器、动作、数据、脚本、延迟加载、消息、队列、RPC实现、邮件等
tools: 工具模块,主要实现了MQTT with SSL客户端和REST客户端。可以测试用。
transport: 三种消息传输服务启动器,服务的实现参考common/transport,mqtt协议的实现见netty-mqtt
ui: TB的用户界面,主要使用AngularJS和react组件,单页应用(要替换掉,用Vue)
框架包含了11个一级包,其含义如下:
Application | 应用相关 | 新增thingsboard接口,或后端添加业务查询 | 可修改 | |
Common | 公共部分 | thingsboard基础方法 | 不可修改 | |
Dao | 业务层 | 接口\实现\数据访问层 | Data-jpa 注解 |
可修改 |
Docker | docker部署 | 打包或虚拟部署 | 开发无需修改此包, | |
Img | 图片 | Logo.png图片 | 可添加 | |
Msa | 分布式 | 不可修改 | ||
Netty-mqtt | 协议 | 开发无需修改此包, | ||
Rule-engine | 规则引擎 | 规则引擎 | 开发无需修改此包, | |
Tools | 工具类 | 系统工具类 | 可修改添加 | |
Transport | 应用层实现 | 三种请求协议 coap,http mqtt,提供使用(不可修改,可自定义协议,系统提供的三种协议) | 不可修改 | |
UI | 前端界面 | 后台管理系统界面 | Angularjs、ES6、Reactjs、webpack、node | 可修改 |
Log | 系统日志 | 系统错误日志收集器,以年月日展示 | Logback | 不可修改 |
1.技术栈
前端术点
包括: Angularjs、ES6、Reactjs、webpack
前端技术描述
前端MVC、MVVM框架
前端打包方案
前端包依赖管理
前后端通信方式
单元测试方案
后端技术点
- 并发模型: Actor模型akka Actor模式理解与使用
- 集群协作:zookeeper
- 支持协议:mqtt、coap、http
- 远程调用: gRPC,thrift
- 持久化: Postgresql、Cassandra(https://cassandra.apache.org/数据存储),datastax(数据访问)
2.package包功能描述
Application应用相关类
appaction.main.java.org.thingsboard.server ThingsboardServerApplication.java(启动类)
install thingsboard服务开启相关配置、异常和调用
exception thingsboard响应错误及错误逻辑处理
controller thingsboard页面展示必要的 系统数据 接口
service 为controller提供支持
config 为同源策略、swagger、webSocket、消息及安全配置注册spring bean
Common
- Data 用于与不同db之间的中间数据结构。
- Message 定义不同的消息类型。
- Transport 定义一个公共的接口,供与客户端的transport层使用
Dao
- dao抽象了对不同数据库的统一接口。
- dao的接口数据一般都data,根据不同的数据库在不同的接口中转换为对应的实体类与数据库交互.
- 通过
@ConditionalOnProperty(prefix = "database", value = "type", havingValue = "cassandra")
动态注入不同的数据库
Docker
Img
Msa
- black-box-tests 黑盒测试
-
Netty-mqtt
Rule-engine
规则与插件。基于actors执行。
-
Tools
extensions(extension-kafka,extension-mqtt,extension-rabbitmq,extension-rest-api-call):分别调用不同协议的后端服务
- extensions-api:定义aciton,filter,plugin,processor及其他基本对象
extensions-core:实现一些公用aciton,filter,plugin,processor
Transport
包含协议:
http Thingsboard的http传输协议启动类
- coap Thingsboard的coap传输协议启动类
- mqtt Thingsboard的mqtt传输协议启动类
功能概述:
- mqtt基于netty开发mqtt服务器。
- http提供基于rest的http服务。
- 基于californium搭建coap服务。
- 对不同的客户端设备提供不同类型的接口.同时将消息转换成不同的message,通过DefaultActorService与后端的actor交互
UI
使用到的前端技术: Angularjs、ES6、Reactjs、webpack
前端MVC、MVVM框架
设计到前端打包配置文件:server.js, webpack.*.js3.thingsboard开发主要涉及到的包
如需在thingsboard添加新的接口
可参考:Usercontroller.java 类application
1: Controller
2: dao
3: sql
4.thingsboard代码类及接口说明
[相关代码类controller说明 , 文档使用了swagger
1: 管理控制器(admin-controller):管理控制器显示
2: 报警控制器(alarm-controller):报警控制器显示
3: 资产控制器(asset-controller):资产控制器显示
4: 审核日志控制器(audit-log-controller):审核日志控制器显示
5: 身份验证控制器(auth-controller):身份验证控制器显示
6: 组件描述符控制器(component-descriptor-controller):组件描述符控制器显示
7: 客户控制器(customer-controller):客户控制器显示
8: 仪表板控制器(dashboard-controller):仪表板控制器显示
9: 设备API控制器(device-api-controller):设备API控制器显示
10: 设备控制器(device-controller):设备控制器显示
11: 实体关系控制器(entity-relation-controller):实体关系控制器显示
12: 实体视图控制器(entity-view-controller):实体视图控制器显示
13: 事件控制器(event-controller):事件控制器显示
14: RPC控制器(rpc-controller):RPC控制器显示
15: 规则链控制器(rule-chain-controller):规则链控制器显示
16: 遥测控制器(telemetry-controller):遥测控制器显示
17: 租户控制器(tenant-controller):租户控制器显示
18: 用户控制器(user-controller):用户控制器显示
19: 控件类型控制器(widget-type-controller):控件类型控制器显示
20: 控件束控制器(widgets-bundle-controller):控件束控制器显示
详情运行thingsbroads开发环境后:输入地址查阅http://localhost:8080/swagger-ui.html
5.thingsboard使用的第三方包或插件
包名 | 作用 |
---|---|
Redis2.9.0.jar | redis工具包 |
Snakeyaml.jar | 解析yaml |
snappy-java.jar | Snappy是Google开源的压缩/解压缩库 |
Js-beautify.jar | Einar Lielmanis开发的在线javascript代码格式化工具。Einar在github上开源了这个项目的代码,并加入了格式化html代码的支持。 |
Testcontainers-1.9.1.jar | Testcontainers是一个Golang库,提供一个友好的API来运行Docker容器 |
Spring-Websocket.jar | 浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天、股票交易、游戏等对对实时性要求较高的行业领域。 |
Spring-webmvc.jar | 关于Spring相关略. |
String-data-jpa.jar | 数据库访问层, 业务查询sql在thingsboard路径 thingsboard\thingsboard-release-2.3\dao\src\main\java\org\thingsboard\server\dao\sql 实体类与数据表关联: thingsboard\thingsboard-release-2.3\dao\src\main\java\org\thingsboard\server\dao\model\sql |
Lombok.jar | Lombok是通过注解的形式帮我们简化java 代码,在项目中使用比如说getter/setter/toString等方法的编写,(idea 或eclipse需要安装 lombox插件) |
Postgresql-9.4.2.jar | Postgresql数据库对象关系数据库管理系统. |
Jbcrypt-0.3m.jar | 加解密工具 jBCrypt |
Json.jar | |
Hsqldb.jar | (在thingsboard中基本用于thingsboard-demo演示) HSQLDB是一款Java内置的数据库,非常适合在用于快速的测试和演示的Java程序中, HSQLDB有三种模式: 1. Server 就像Mysql那样 2. In-Process 又叫做 Standalone 模式,数据放在本地文件,伴随JVM一起启动,是HSQLDB的主要应用场景 3. Memory-only, 仅仅在内存中,一旦重启,数据就消失。 |
Rest-5.0.2.jar | REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP。其目标是为了创建具有良好扩展性的分布式系统. |
Mqttv3-1.1.0.jar | 用于开发mqtt的客户端使用,方便快速搭建mqtt客户端,快速开发实现所需要功能. |
jackson-mapper-asl-1.9.13.jar | java对象和json相互转化,有jackson-core-asl、jackson-mapper-asl |
ZooKeeper 3.5.4-beta.jar | ZooKeeper是一个分布式的,开源的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户 |
xmlbeans-2.6.0.jar | XMLBeans是一个XML-Java绑定工具,利用它可以很方便地解析XML文档。 |
Tomcat*.jar | |
Libthrift-0.9.12.jar | thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。 |
Struts*.jar | struts相关包 |
Poi*.jar | poi相关jar包 如execl、xlsx、pptx、docx 等文件导入导出等操作。 |
kafka-clients.2.0.0.jar | kafka消息中间件 |
httpcore-nio-4.4.5.jar | HTTP协议实现包, 相关http包 |
JOpt Simple 4.6.jar | JOpt Simple 是一个简单的、测试驱动的命令行解析器,支持 POSIX getopt() 和 GNU getopt_long() |
json-smart2.0.jar | Json-smart 是一个高性能的JSON处理类库 |
Log4j-1.2.17.jar | |
joda-time-2.3.jar | Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time。可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成。 Joda-Time主要的特点包括: 1. 易于使用:Calendar让获取”正常的”的日期变得很困难,使它没办法提供简单的方法,而Joda-Time能够 直接进行访问域并且索引值1就是代表January。 2. 易于扩展:JDK支持多日历系统 |
mailapi-1.4.3.jar | 发送邮件相关jar包 |
javax.annotation-api-1.2.jar | 注解,声明,@Resource是做bean的注入使用。 annotation注解相关jar包略. |
-swagger-.jar | 可以跟据业务代码自动生成相关的api接口文档. |
Aopalliane-10.jar | 这个包是AOP联盟的API包,里面包含了针对面向切面的接口。aopalliance.jar作用为通常Spring等其它具备动态织入功能的框架依赖此包. |
Logback-classic-1.2.3.jar | log4j项目的后续版本,用于打印error系统日志 |
dom4j-1.6.1.jar | Dom4j是一个Java的XML API接口,是jdom的进化版,dom4j基本用来读写xml文件,Hibernate也用它来读写配置文件。 |
grpc-context-1.12.0.jar | grpc是一个高性能、开源和通用的 RPC 框架,远程调用。 |
Netty-3.10.5.Final.jar | Netty 可自定义通讯协议, 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。 |
Akka | 用于actor系统实施,集群-均衡负载 |
Cassandra | 作为可扩展且可靠的数据库,是一个来自 Apache 的分布式数据库,具有高度可扩展性,可用于管理大量的结构化数据。它提供了高可用性,没有单点故障。 |
详解: java版Bcrypt ,加解密工具 (用于账号密码加密,被时间检证过了) ,对用户的口令进行Hash,并使用salt,以防止Rainbow 攻击(Hash算法可用MD5或SHA1等,对口令使用salt的意思是,user 在设定密码时,system 产生另外一个random string(salt)。在datbase 存的是与salt + passwd 产的md5sum 及salt。当要验证密码时就把user 输入的string 加上使用者的salt,产生md5sum 来比对。理论上用salt 可以大幅度让密码更难破解,相同的密码除非刚好salt 相同,最后存在database 上的内容是不一样的。使用慢一点的Hash算法来保存口令,如 bcrypt (被时间检证过了) 或是 scrypt (更强,但是也更新一些)。 |
---|
6.ThingsBoard数据库
关系数据库(使用了2个数据库)
1、PostgreSQL:用于数据存储
2、Cassandra:用于数据存储
3、Datasta:用于数据访问
非关系数据库(redis)
redis在ThingsBoard中的使用场景。使用场景主要存储设备终端信息,临时存储。