有什么办法在 Java 实现插件化?

7 天前
 GayGayUp

简单说一下背景:

我的项目是一个 IoT 数据收集平台,对接了非常多不同类型、不同厂家的设备,每种设备之间的通信方式(如 http/tcp/udp/mqtt 等)、协议编解码方式各不相同;

目前的状况是,IoT 数据收集平台(主程序)独立运行;每个类型的设备,都创建一个 springboot 服务(协议服务),实现不同的通信和编解码,协议服务通过 RocketMQ 发送消息,主程序消费消息,实现数据收集;

这样如果单个协议服务死了,也不会影响其他协议服务和主程序,优点是实现简单(当初就是为了快速搭建起来而这样做),缺点就是服务过多(目前协议服务已经有接近 60 个)、难以管理、对服务器资源占用也大;

看了一些开源的 IoT 平台,完善度比较高的:如 Jetlinks ,源码晦涩难懂,放弃了;

所以我想能不能用插件化实现:如使用 pf4j ,写一个简单的插件,里面写好一些编解码的操作,打包成 Jar 包后,对接进主程序,复用主程序的通信模块和数据上报模块。插件部署了就采集、卸载了就停止;

问: 我的这个想法可不可行? 技术上实现难度高不高? 如可行,有没一些开源的项目可供学习参考?

1730 次点击
所在节点    Java
25 条回复
GayGayUp
5 天前
@night98 将相同协议类型当成一个服务也考虑过,最大的问题是没办法区分上报内容来源于什么设备;
例如有两款设备都是 tcp 协议,上报内容分别为:FF0001 、FF0002 (0001 和 0002 为设备号),所以作为开发者,仅仅知道设备号,无法区分属于什么设备;
GayGayUp
5 天前
@onikage 感谢,我研究下
GayGayUp
5 天前
不一个一个 @了,我这里统一回复感谢回复的各位,我研究研究各位大神的方案
night98
5 天前
@GayGayUp #21 我没太懂哈,你不同的设备你是怎么去分流接入的,不是按照端口号或者路径啥的去分流吗?为什么会不知道是什么类型的设备。还是说你接入的时候都是同一个入口?那也不对呀,按照你现在的方案分开部署,那也是要用一种方式去区分设备类型的,你不会是按照 ip 或者域名去区分设备类型的吧。比如 tcp 的协议设备,你一个服务可以起多个端口啊,根据配置动态监听就行啊。
GayGayUp
5 天前
@night98 感谢提醒!你点到我了,的确可以这么做。这么简单的问题我咋想复杂了呢,无语。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1101562

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX