项目总览

  1. application: 应用程序主目录,整体项目打包时也是这个Module
  2. src/main/java/org.thingsboard.server: app主目录
  3. actors: actor执行者目录
  4. config: 配置类目录
  5. controller: 控制器
  6. exception: 异常处理
  7. service: 服务目录,app打包后,server要运行的服务的实现都在这里
  8. cluster: 集群服务,包括服务发现、服务实例等
  9. script: 脚本执行服务,主要是规则引擎的执行(JS
  10. transport: 消息传输服务
  11. rpc: 远程调用服务
  12. utils: 工具类
  13. common: 公共工具集、方法集模块
  14. dao-api: 数据访问对象的服务接口,在这里做定义
  15. data: 用于不同数据库之间的中间数据结构
  16. message: 消息服务的实现集,包括集群消息、TB的基础服务消息、系统类消息
  17. queue: 队列服务的实现集,用的Kafka
  18. transport: 消息传输通道服务的实现,定义公共接口,给客户端的transport层使用
  19. coap: CoAP消息传输的实现,包括适配器和客户端
  20. http: HTTP消息传输的实现
  21. mqtt: MQTT消息传输的实现,包括适配器、会话、SSL工具等
  22. util: 工具集(当前仅有一个异步回调工具)
  23. dao: 数据访问对象集合,整个应用的DAO层,一般只要dao的都要data,以实现不同数据库数据结构兼容。
  24. docker: 集群部署-docker容器解决方案,包含了部署环境和shell脚本
  25. haproxy: HAproxy工具的配置文件存放处
  26. tb-node: 应用程序节点配置存放目录
  27. tb-transports: 消息传输服务的配置文件,包括coap,http,mqtt
  28. img: 应用图标存放处
  29. k8s: 容器编排工具Kubernetes的配置文件和自动化脚本
  30. msa: 微服务半自动构建模块,包含了黑盒测试、js执行引擎等
  31. black-box-tests: 黑盒测试工具
  32. js-excutor: js执行引擎,基于nodejs,用于执行规则引擎中的js代码(沙盒执行)
  33. tb: tb主应用程序配置
  34. tb-node: tb程序节点配置
  35. transport: docker中的消息传输服务的部署配置
  36. web-ui: TBWeb用户界面在docker中部署的配置,自带http server
  37. netty-mqtt: TBMQTT协议的实现,包括连接、发布、订阅、遗嘱、关闭等
  38. rule-engine: TB的规则引擎,TB没有用开源的Drools等工具,而是自己开发了一套规则引擎,主要包含3个组件和1套服务接口
  39. rule-engine-api: 服务接口的实现
  40. rule-engine-components: 规则引擎组件,包含滤波器、动作、数据、脚本、延迟加载、消息、队列、RPC实现、邮件等
  41. tools: 工具模块,主要实现了MQTT with SSL客户端和REST客户端。可以测试用。
  42. transport: 三种消息传输服务启动器,服务的实现参考common/transport,mqtt协议的实现见netty-mqtt
  43. ui: TB的用户界面,主要使用AngularJSreact组件,单页应用(要替换掉,用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框架
前端打包方案
前端包依赖管理
前后端通信方式
单元测试方案

后端技术点

  1. 并发模型: Actor模型akka Actor模式理解与使用
  2. 集群协作:zookeeper
  3. 支持协议:mqtt、coap、http
  4. 远程调用: gRPC,thrift
  5. 持久化: 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 黑盒测试
  • js-executor javascript执行器

    Netty-mqtt

    数据交互协议

    Rule-engine

  • 规则与插件。基于actors执行。

  • 规则包含Filters,Processors,Action

    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.*.js

    3.thingsboard开发主要涉及到的包

    如需在thingsboard添加新的接口
    可参考:Usercontroller.java 类

    application

    1: Controller
    2: dao
    3: sql
    image.png

    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数据库

[thingsBoard使用的data-jpa]

关系数据库(使用了2个数据库)

1、PostgreSQL:用于数据存储
2、Cassandra:用于数据存储
3、Datasta:用于数据访问

非关系数据库(redis)

redis在ThingsBoard中的使用场景。使用场景主要存储设备终端信息,临时存储。