Node-RED多租户
如果采用多个用户在一个Node-RED实例上运行独立的流来实现多租户. 由于各种原因这着实不是一个好想法. 主要是因为Node.js运行时是天生单线程的, 没有办法为不同的用户做到严谨意义上的分离. 例如, 如果一个用户使用了一个性能低下的节点(或者function节点里的function), 那么就有可能导致事件环阻塞, 从而使其它用户的操作迟迟得不到响应; 更极端的情况下, 如果这个用户触发了一个未被捕获的异步异常, 将会导致整个应用退出.
因此, 实现多租户最好的方法则是为每个用户提供一个分离的Node-RED实例, 为各个用户提供必要的隔离性. 实现这种方式最常用的做法是使用基于容器的系统和HTTP反向代理.
下面大致实现了构建多租户系统的几个必要组件, 整合后, 用户可以使用这个系统去独立地构建他们的应用.
必要的组件
流的存储
因为容器的文件系统大多没有做过持久化, 我们需要找到一个可靠的地方将每个用户创建的流文件保存下来. Node-RED提供了一个API, 这个API可以让我们控制流文件的存储方式和存储地点(通常情况下会直接存储到用户的工作目录).
鉴权
我们需要一个插件去限制用户的访问, 做到只有具有权限的用户才能访问Node-RED编辑器. Node-RED提供了对应的插件API, 让我们很好地将鉴权插件与现有部分整合.
Node-RED使用LDAP作为用户源实现了这个API. 但本系列将会基于与流存储插件相同的数据库重新写一个插件.
定制容器
我们在完成了流存储和用户鉴权后, 就需要去构建一个包含上述插件的定制版本Node-RED 容器(基于Docker)
HTTP反向代理
现在已经建立起了一系列运行用户实例的Node-RED实例, 接下来的任务就是将这个实例暴露到外部环境. 因为Node-RED是个Web应用, 那么HTTP反向代理就可能是最直接正确的方式.
实例管理
所有部件到位后, 我们则需要去控制Node-RED实例的创建和删除. 同时, 查看实例日志也不可或缺.
补充
最后还有一些需要补充, 为了部署到特定的环境, 像自有节点仓库 / 自定义UI风格主题同样不可或缺.
自有节点仓库
托管私有节点, 并且通过管理面板菜单安装节点.
自定义主题
调整页面标题和配色方案可以使Node-RED更适合现有的外观。
网友评论