关于quic:应用YoMo开发一个噪声传感器采集监控系统

51次阅读

共计 6696 个字符,预计需要花费 17 分钟才能阅读完成。

前言

这个例子形容 YoMo 在工业互联网数据采集中的利用,以收集噪声传感器的数据为例,波及数据收集 / 解决 / 工作流 / 数据展现的全过程,为了便于体验运行成果,还会对其进行容器化,并通过 docker 疾速部署体验版。

述语

  • xxx-source: 示意一个数据源收集程序
  • xxx-zipper: 示意一个工作流和管制立体
  • xxx-flow: 示意一个工作流单元,用于理论的业务逻辑解决,被 zipper 调度。
  • xxx-sink: 示意一个数据的传送目的地,个别落地数据库或者传递给下一级代理,被 zipper 调度。

架构

从图中可见,辨别了边缘端和云端两个独立区域,区域之间是通过弱网或者互联网连贯,这里简略介绍一下各个服务:

  • 边缘端部署了传感器设施 (Noise) 和数据收集网关(ZLAN),网关会定时向设施申请状态数据,并转换为 MQTT 协定数据发送给 noise-source 收集器,source 起到转换编码并与 YoMo 工作流引擎 zipper 建设连贯的作用。对于传感器设施和数据收集网关的硬件选购和配置能够参加这篇文章:https://yomo.run/zh/aiot。
  • 对于不想购买硬件设施的开发者,这里也提供了一个 noise-emitter 模拟器用来产生噪声数据。
  • zipper 是一个弱小的工作流引擎,通过编排 (workflow.yaml) 能够调度多个 flow 和 sink,让他们以流的形式把业务逻辑串联起来,以满足简单的需要。与之相连的所有通信和编解码均以 QUIC+Y3 进行,提供牢靠实时的流式解决,全程体验流式编程的乐趣。
  • noise-flow 实现把乐音值除以 10 的简略解决,并且监控如果超过肯定阀值后输入日志进行警报。
  • noise-sink 没有真的输入到数据库,而是通过搭建一个 WebSocket 服务器,把实时的乐音状态输入给任意的网页进行展现生产。
  • noise-web 是一个生产 WebSocket 的网页服务,他部署在哪里都能够,只有能拜访到 noise-sink 提供的 WebSocket 服务地址即可,这里咱们假如部署回边缘端也是没有问题的。

代码

下表提供了案例的全副代码,供感兴趣的敌人查看,参照这个案体的代码,能够轻松开发出类拟场景的案例。

我的项目 地址 阐明
noise-source yomo-source-noise-example 收集 MQTT 音讯格局的乐音数据
noise-zipper yomo-zipper-noise-example 编排本案体的工作流和数据流向
noise-flow yomo-flow-noise-example 对乐音数据进行预处理和警报
noise-sink yomo-sink-socketio-server-example 提供 WebSocket 服务用于数据展现
noise-web yomo-sink-socket-io-example 生产 WebSocket 服务展现乐音状态
noise-emitter yomo-source-noise-emitter-example 模仿产生噪声数据
quic-mqtt yomo-source-mqtt-starter 开发 xxx-source 的通用组件

容器化部署

通过下载上节的我的项目代码能够进行本地原生部署,体验 YoMo 开发的乐趣,然而对于想急于马上看到成果的敌人来说,更爽的形式当然是先疾速运行起来看看成果,所以对上节的我的项目也做了容器化解决,每个我的项目的根目录均提供了 Dockerfile 文件,并且在 hub.docker.com 提供了官网镜像下载:

我的项目 镜像地址 最新版本
noise-source yomorun/noise-source yomorun/noise-source:latest
noise-zipper yomorun/noise-zipper yomorun/noise-zipper:latest
noise-flow yomorun/noise-flow yomorun/noise-flow:latest
noise-sink yomorun/noise-sink yomorun/noise-sink:latest
noise-web yomorun/noise-web yomorun/noise-web:latest
noise-emitter yomorun/noise-emitter yomorun/noise-emitter:latest
quic-mqtt yomorun/quic-mqtt yomorun/quic-mqtt:latest

yomorun/quic-mqtt:latest 是开发 xxx-source 的根底镜像,能够疾速打包自定义代码,但本案例中能够临时疏忽。

疾速部署

为了疾速运行体验运行成果,本大节形容如何整体容器化在同一宿主机上运行。

疾速运行

有了上述的官网镜像就简略多了,只需简略的步骤就能够体验成果了:

  • 下载 docker-compose.yml 文件。
  • 运行 docker-compose up -d
  • 先喝杯茶稍作期待,通过拜访 http://localhost:3000/ 可看到如下效果图:

注意事项:

  • 这里 Delay 的值可能不很精确,因为是通过 Docker 容器部署,各个容器的时钟并不对齐得那么完满,如果要查看到最准确的延时值,须要把 noise-source 和 noise-web 原生部署到同一个宿主机上。
  • 如果部署不是在本地,则须要批改 docker-compose.yml 文件中的环境变量 SOCKET\_SERVER\_ADDR 为你部署服务的宿主机地址。

查看状态

通过 docker-compose ps查看服务状态

    Name                   Command               State                Ports              
-----------------------------------------------------------------------------------------
noise-emitter   sh -c go run main.go             Up                                      
noise-flow      sh -c yomo run app.go -p 4242    Up      4242/udp                        
noise-sink      sh -c go run main.go             Up      4141/udp, 0.0.0.0:8000->8000/tcp
noise-source    sh -c go run main.go             Up      1883/tcp                        
noise-web       ./docker-entrypoint.sh yar ...   Up      0.0.0.0:3000->3000/tcp          
noise-zipper    sh -c yomo wf run workflow ...   Up      9999/udp    
  • noise-sink 裸露了 8000 的 WebSocket 端口提给 noise-web 展现生产。
  • noise-web 裸露了 3000 的 http 端口用于展现实时的噪声值和延时。
  • noise-zipper/noise-flow/noise-sink 均提供了 udp 端口的 QUIC 服务,全流程 QUIC 通信。
  • noise-source 是咱们对接不同设施的要害,提供 1883 的 MQTT 端口,当然也能够批改的。

查看日志

  • 查看 noise-emitter docker-compose logs -f noise-emitter

    noise-emitter    | 2021-04-26 10:11:03: Publish counter=12438, topic=NOISE, payload={"noise":12438}
    noise-emitter    | 2021-04-26 10:11:04: Publish counter=12439, topic=NOISE, payload={"noise":12439}
    noise-emitter    | 2021-04-26 10:11:05: Publish counter=12440, topic=NOISE, payload={"noise":12440}
    noise-emitter    | 2021-04-26 10:11:06: Publish counter=12441, topic=NOISE, payload={"noise":12441}
    

这个模仿发生器产生了 MQTT 数据:主题是 `NOISE`, 值是一直递增的序号(JSON 格局)。
  • 查看 noise-source docker-compose logs -f noise-source

    noise-source     | 2021/04/26 15:27:32 receive: topic=NOISE, payload={"noise":2638}
    noise-source     | 2021/04/26 15:27:32 write: sendingBuf=[]byte{0x81, 0x1b, 0x90, 0x19, 0x11, 0x3, 0x45, 0x24, 0xe0, 0x12, 0x6, 0xaf, 0x90, 0xe8, 0xce, 0x83, 0x1c, 0x13, 0xa, 0x31, 0x37, 0x32, 0x2e, 0x31, 0x39, 0x2e, 0x30, 0x2e, 0x36}
    noise-source     | 2021/04/26 15:27:33 receive: topic=NOISE, payload={"noise":2639}
    noise-source     | 2021/04/26 15:27:33 write: sendingBuf=[]byte{0x81, 0x1b, 0x90, 0x19, 0x11, 0x3, 0x45, 0x24, 0xf0, 0x12, 0x6, 0xaf, 0x90, 0xe8, 0xce, 0x8b, 0x5, 0x13, 0xa, 0x31, 0x37, 0x32, 0x2e, 0x31, 0x39, 0x2e, 0x30, 0x2e, 0x36}
    

-   receive: 示意 source 收到的 MQTT 数据。-   write: 示意把通过 Y3 转码的字节码向 noise-zipper 工作流引擎发送。
  • 查看 noise-zipper docker-compose logs -f noise-zipper

    noise-zipper     | 2021/04/26 14:39:28 Found 1 flows in zipper config
    noise-zipper     | 2021/04/26 14:39:28 Flow 1: Noise Serverless on noise-flow:4242
    noise-zipper     | 2021/04/26 14:39:28 Found 1 sinks in zipper config
    noise-zipper     | 2021/04/26 14:39:28 Sink 1: Socket.io Server on noise-sink:4141
    noise-zipper     | 2021/04/26 14:39:28 Running YoMo workflow...
    noise-zipper     | 2021/04/26 14:39:28 ✅ Listening on 0.0.0.0:9999
    noise-zipper     | 2021/04/26 14:43:32 ✅ Connect to Noise Serverless (noise-flow:4242) successfully.
    noise-zipper     | 2021/04/26 14:44:33 ✅ Connect to Socket.io Server (noise-sink:4141) successfully.
    

工作流引擎连贯上了 noise-flow 和 noise-sink 这两个工作流的处理单元了。
  • 查看 noise-flow docker-compose logs -f noise-flow

    noise-flow       | ❗ value: 561.700012 reaches the threshold 16! 45.700012
    noise-flow       | [172.19.0.6] 1619425035923 > value: 561.799988 ⚡️=0ms
    noise-flow       | ❗ value: 561.799988 reaches the threshold 16! 45.799988
    noise-flow       | [172.19.0.6] 1619425036923 > value: 561.900024 ⚡️=1ms
    

噪声数据是模拟器产生的,远远超过了预设的阀值,打印出正告信息。

分区部署

通过上一大节的 疾速部署 应该理解如何在同一台宿主机上进行容器化部署并查看各个服务的状态,但与咱们的开始提出的云端与边缘拆散的理论架构图不符,事实场景下 flow/sink 这类 Serverless 的服务会部署在云端,而数据接收器 source 会部署在边缘,那本节就来拆散他们看看如果编排部署。

云端部署

部署服务

指标是把 noise-zipper / noise-flow / noise-sink 部署在云端,能够查看上面的配置文件和运行步骤:

  • 下载 docker-compose-cloud.yml 文件。
  • 运行 docker-compose -f docker-compose-cloud.yml up -d

查看状态

通过 docker-compose -f docker-compose-cloud.yml ps查看服务状态

    Name                  Command               State                Ports              
----------------------------------------------------------------------------------------
noise-flow     sh -c yomo run app.go -p 4242    Up      4242/udp                        
noise-sink     sh -c go run main.go             Up      4141/udp, 0.0.0.0:8000->8000/tcp
noise-zipper   sh -c yomo wf run workflow ...   Up      0.0.0.0:9999->9999/udp   
  • noise-zipper 裸露了云端工作流引擎的服务端口,因为通信是 QUIC 协定,所以可见是一个 udp 端口。
  • noise-sink 裸露了通过 WebSocket 数据生产的端口,让其它 Web 服务展现生产。

边端部署

部署服务

指标是把 noise-source / noise-web / noise-emitter 部署在边缘端,能够查看上面的配置文件和运行步骤:

  • 下载 docker-compose-edge.yml 文件。
  • 运行 docker-compose -f docker-compose-edge.yml up -d

注意事项:

  • Docker-compose-edge.yml 中的 SOCKET\_SERVER\_ADDR 变量须要设置为 cloud 端的 source-sink 裸露的地址和端口(默认 8000)。

查看状态

通过 docker-compose -f docker-compose-edge.yml ps查看服务状态

    Name                   Command               State           Ports         
-------------------------------------------------------------------------------
noise-emitter   sh -c go run main.go             Up                            
noise-source    sh -c go run main.go             Up      1883/tcp              
noise-web       docker-entrypoint.sh sh -c ...   Up      0.0.0.0:3000->3000/tcp
  • noise-web 裸露了成果展现网站的端口。通 (过拜访 http://localhost:3000/ 可) 以查看到之前雷同的展现界面。

路由器部署

到了这里就完结了?还没有!实际上边缘部署的状况要比云端简单,因为边缘设施很多是老旧,不肯定反对 Docker 容器,这时你能够抉择通过源代码编译成不同平台的二进制运行文件,间接就把 noise-source 跑在对应的平台上。当然,更不便的抉择是购买一台反对 Docker 容器的路由器,间接就能够通过容器部署在边缘端了,目前 YoMo 与 iKuai 达成深度单干,携手推动工业互联网在各个领域的利用与倒退,能够通过上面链接查看具体的信息:

  • iKuai+YoMo 减速工业互联网的云原生时代
  • iKuai+YoMo 边缘计算赋能工业互联网

援用参考

下面就是这个噪声传感器案例从数据收集解决到展现的所有代码和部署过程了。对于须要扩大或者引申到别的利用场景的开发者,能够点开每个我的项目的链接进行具体浏览,每个我的项目都是微服务化构建,服务角色明确,代码清晰易懂,如果有什么问题欢送提出 Issues 或者探讨。参考链接:

  • https://yomo.run/
  • https://github.com/yomorun/yomo
  • https://github.com/yomorun/example-noise

最初,补充一张带有各个服务可裸露端口号的架构图,以便碰到困难的敌人查阅。

正文完
 0