卡车追踪器:使用OpenShift和其他IBM Cloud服务的IoT模式
结合IBM Cloud服务提供各种见解
Truck Tracker 是一种从全国各地行驶的卡车车队接收数据的服务。 它可以是任何数据(例如,油耗、驾驶员详细信息、环境温度或其他任何可以在巡航过程中测量的数据)。 在本帖中,它将是卡车的 ID 和位置(纬度/经度坐标)。 Truck Tracker 会将数据存储在不同的数据存储区,并在地图上显示卡车的当前位置。
有些应用程序用户需要这些数据来进行分析。 例如,了解车队在过去 24 小时内行驶了多少英里或消耗了多少燃料。 为此,所有数据点都可以存储在 IBM Cloudant 这样可靠的文档存储中,并可随意搜索和聚合。IBM Cloudant是一个完全托管的分布式数据库,针对繁重的工作负载以及快速增长的网络和移动应用程序进行了优化。
其他用户可能需要知道卡车目前的位置。 为此,您只需要知道每辆卡车的最后一个已知位置。 在这种情况下,Redis 是一个完美的解决方案--快速键值存储,键是唯一的卡车 ID,值是其最后已知位置。
IBM Cloud® Databases for Redis 是一种完全托管的内存数据结构存储,可用作数据库、缓存和消息代理。
数据可能还有其他未知用途,需要以不同方式访问或存储。
因此,您的卡车在全国各地飞驰,数据从卡车中涌出。 如何确保每个人都能获得所需的数据? IBM Event Streams 是一个事件流平台,可帮助您构建能够对发生的事件做出反应的智能应用程序。 这是一项基于开源 Apache Kafka 的全面托管服务。
Event Streams可以从卡车(数据生产者)获取数据,然后将其提供给使用这些数据的各种应用程序(数据消费者)。
最后,你需要在某个地方运行 Truck Tracker 服务,为此我们将使用 Red Hat OpenShift on IBM Cloud,这是一种在Kubernetes集群中容器化和部署企业工作负载的快速而安全的方法。 我们将配置一个Red Hat OpenShift on IBM Cloud集群,将应用程序部署到该集群,并将其提供给需要访问该集群的数据库服务。 我们还将制作一个面向公众的应用程序,以便在地图上查看卡车的位置。 了解更多信息 Red Hat OpenShift on IBM Cloud.
你将建造什么
这就是我们要建立的高级系统:

在现实生活中,您的数据生成器(卡车上的IoT设备)必须找到一种与Event Streams应用程序通信的方式,可能是使用 MQTT 协议。 我们将使用一个脚本 producer.js
)来模拟我们的卡车在全国各地行驶并发送数据,该脚本将通过读取几个“公路旅行”LAToDallas.json
和 boulderToNYC.json
)的预定义纬度/长度对,每秒生成一个卡车位置,并将其输入到Event Streams。
完成本教程大约需要一个小时。 这并不是免费的,因为我们将使用的一些IBM服务并不提供免费层级,但如果您在完成这项工作后取消服务,您所需支付的费用应该不会超过几美元。
您将需要
在开始之前,最好先安装一些必要的生产力工具:
- IBM Cloud 现收现付帐户(确保已 登录到您的帐户。)
- IBMCLI- 与IBMAPI 交互的命令行界面。 您需要确保它有以下 插件:
- 开放移
- 集装箱登记处
- 确保可以访问 Mac 或Linux终端。
- KubernetesCLI- 针对Kubernetes集群运行命令的命令行界面。
- Terraform- 自动调配资源
- Docker We will be using Docker to create the images that will run your code inside your cluster — make sure you are logged into your Docker account
- jq- 轻便灵活的命令行 JSON 处理器
- Git- 免费、开源的分布式版本控制系统
- Node.js和 npm
分步说明
第 1 步:获取 API 密钥,将基础架构部署到您的账户中
按照 本文档中的 步骤创建 API 密钥,并记下该密钥以备第 2 步使用。
第 2 步:克隆版本库并 cd 到 Terraform 目录
git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform
创建一个名为 terraform.tfvars
的文档,其中包含以下字段:
ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password = "<MAKE_UP_A_PASSWORD>"
文件 terraform.tfvars
包含的变量可能需要保密,因此会被GitHub仓库忽略。
步骤 3:创建基础设施
简而言之,运行 Terraform 脚本:
terraform init
terraform apply --auto-approve
Terraform 文件夹包含许多简单的脚本:
main.tf
tells Terraform to use the IBM Cloud.variables.tf
contains the variable definitions whose values will be populated from terraform.tfvars.cloudant.tf
creates a standard Cloudant DB and some credentials that we will use later to access it.redis.tf
creates the Redis instance and some credentials that we will use later to access it.eventstreams.tf
creates the Event Streams instance and some credentials that we will use later to access it.registry.tf
creates the Container Registry that will hold your container images.iam.tf
creates the access key that is needed to interact with the Container Registry.vpc.tf
creates the VPC (Virtual Private Cloud) infrastructure that will be needed to deploy an OpenShift cluster. 这包括三个不同可用性区域中的 VPC、子网和公共网关。cos.tf
create a single Cloud Object Storage instance that is needed by OpenShift to manage the cluster.openshift.tf
creates a cluster of virtual machines inside your VPC, where you will deploy your applications.
数据库和其他资源需要几分钟才能准备就绪,但您的账户中现在应该有一些 VPC 资源、一个虚拟机集群、一个IBM Cloud® Databases for Redis实例、一个Cloudant数据库和一个Event Streams实例,以及一个用于容器映像的容器Container Registry命名空间。 您可以访问IBM Cloud帐户的 资源部分 进行检查。
第 4 步:创建容器映像并部署到OpenShift
此时,您的所有基础设施都已准备好接收数据。 现在,我们必须构建和部署生成和消费数据的不同模块,以及在地图上显示卡车位置的应用程序。
运行构建脚本 - 但在此之前,您是否已登录IBM CloudCLI 和Docker?
进入项目根目录,键入以下内容:
./build.sh
步骤 5:小心你的卡车
脚本末尾将输出一个 URL,如_https:// some.thing.eu-gb.appdomain.cloud_。
如果您访问生成的 URL,就会看到美国地图,几秒钟后,地图上就会出现代表您的卡车的几个标记:

如果放大其中一个标记,就会看到它沿着道路移动。 作为车队经理,您现在可以知道所有卡车的位置。

你刚刚做了什么
build.sh脚本
build.sh
脚本可以做很多事情:
- 它会为你需要的每项服务构建一个 docker 镜像。 生产者、消费者和网络应用程序都在不同的文件夹中。 每个文件夹都有自己的简单 Dockerfile 文件,脚本使用该文件创建容器映像,然后将其上传到IBM Container Registry。
- 它会创建一堆 kubernetes secrets,其中包含访问不同IBM服务IBM Cloudant、Redis和Event Streams)所需的所有凭据。
- 它将使用
deployment.yml
脚本中包含的指令将应用程序代码(和秘密)部署到Red Hat OpenShift on IBM Cloud集群。
deployment.yml脚本
该脚本会告诉 Openshift 向 Openshift 集群中的机器部署哪些内容。 我们的情况是
- 数据生产者
trucktrackerproducer*
). - 数据消费者
trucktrackerredisconsumer
和trucktrackercloudantconsumer
- 网络应用
trucktrackerweb
)
在所有情况下,它们都会从容器注册表中提取一个映像,并获得一些环境变量,其中包含访问外部服务所需的凭据。
卡车追踪系统
卡车跟踪系统是一套简单的Node.js脚本,使用四个主要软件包:
- @ibm-cloud/cloudant 以连接到IBM Cloudant并读取/写入数据。
- Redis 连接到Redis实例并读写数据。
- kafkajs 连接到Event Streams实例。
- Express,以启用一个简单的网络服务器,允许与数据进行交互。
有五个主要文件:
server.js
: This runs the web server and communicates with Redis. 它定期从前端调用 /data 路由。 它连接到Redis,下载一个包含每辆卡车 ID 和位置的对象,并将其返回给前端。index.html
: This is the one and only page of the front end application. 加载时,它显示的美国地图来自超棒的“开放街道地图”服务。 然后,它会循环运行 5 秒钟,向后台server.js
) 发送 HTTP 请求,检索所有卡车及其位置,并循环查看,在地图上标出它们的最新位置。 每辆卡车都有一个地图标记,每次循环都会更新其纬度/经度。producer.js
: This takes in a location file and a truck_id from the script invocation and then loops through all the data points in the location file. 每个数据点都会被转化为包含卡车 ID 和纬度/经度的信息,并以每秒一次的速度发布到Event Streams。 为了增加趣味性,它还会沿路线随机选择一个起点,到达位置文件的终点后再掉头回来。cloudantConsumer.js
: This script creates a trucktracker database in Cloudant if it does not already exist and then polls Event Streams at regular intervals for more data. 数据输入后,会批量写入Cloudant。redisConsumer.js
: This script polls Event Streams at regular intervals for data. 数据输入后,会被写入Redis“哈希”,其中哈希键是卡车 ID,值是卡车数据(纬度/经度)。 通过这种哈希排列,server.js脚本可以一次性提取所有卡车数据。 最棒的是,如果其中一个消费者由于某种原因崩溃了,它将从中断的地方重新开始,而不会丢失任何数据,因为Event Streams知道它向每个消费者提供的最后一个数据点。 以这种方式将数据生产系统与数据消费系统解耦,是一种良好的设计做法,可提高复原力和容错性。
摘要
在本教程中,我们结合了大量IBM服务来模拟一种现实的IoT模式,在这种模式中,卡车上的联网设备会产生数据,这些数据会被各种应用程序用于不同的目的。
由于所有这些服务都是托管性质的,因此作为应用程序开发人员,您可以专注于解决您的业务问题,让我们来为您完成管理基础设施的繁重工作,从而节省可能长达数月的服务器配置、软件部署、打补丁、安全等非核心工作。
如果您遵循了本教程,请记住取消配置您的基础架构,以停止产生费用。 在终端上执行以下操作
cd terraform/
terraform destroy
如果您想在开发者之旅中迈出新的一步,请查看我们的一些 试用优惠。