小型硬件配置化系统架构层次设计思考

130 阅读2分钟

一、说下背景

在开发一套与硬件进行交互主要用于硬件配置的小型硬件配置系统中(比如探测、连接、读取配置、设置配置、老化测试等等功能),需要对不同的型号的硬件进行交互。这些硬件设备各自有着独特的通信协议和配置要求。为了实现与这些硬件的交互,我们采用了多种连接协议,包括 modbus、tcp、udp 等。 使用Java进行开发的基础上,使用 Netty 框架来实现 tcp 连接,利用 modbus 开源包来处理 modbus 连接。通过报文包装与解析,系统能够与各类硬件进行有效的数据交互。

二、分层设计

架构分层设计.drawio.png

使用这样的架构可以快速应对不同的型号的硬件来扩充功能,在 netty 和 modbus 两个连接协议中,分别使用框架的处理器接口的子类实现来处理不同硬件的对接(见图中的黄色方块中)。但是随着硬件的不断增多,交互的场景也不同,会导致 XxxChannelInboundHandlerAdapter 和 XxxSerialPortDataListener 这两种处理器内部分支逐渐臃肿,还可能导致 XxxChannelInboundHandlerAdapter1、XxxChannelInboundHandlerAdapter2、XxxChannelInboundHandlerAdapterN 的产生,这样导致了项目难以维护。根据这样的情况,优化点之一是对 netty或者modbus协议监听器的优化,将业务剥离往下沉,协议只关心协议通讯,做好网络拆包保证报文完整性。

为了解决这样的问题,决定加入一层专注处理报文。

架构分层设计-第 2 页.drawio.png

如上图所示,Sender 层专注负责报文的包装与解析处理。Sender 是一个接口,不同的型号的不用的指令使用实现类来做具体的实现,外部使用 SenderManager 维护了所有的 Sender,当上层使用可以具体指定到目标 Sender 来负责解析,Sender 会调用不同的通讯协议来进行通讯,而 Sender 的实现类不需要关心通讯协议。Sender 这一层的设计如下:

架构分层设计-第 3 页.drawio.png

目前的优化减少了部分的代码耦合,可以通过叠加 Sender 实现类来增加新的硬件对接,当出现新的通讯协议的时候,只需要对协议层进行修改即可,不会互相耦合。不过缺点也明显,Sender 的实现类会随着硬件的增加而增加,后续还需要对 Sender 这一层进行持续的改进。

以上是我个人在开发的过程中遇到的编程问题和想法,以此记录作为以后开发的参考。