Truck Tracker:使用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 即用即付帳戶(確保已 登入您的帳戶。 )
- IBM CLI- 與IBM API 互動的命令列介面。 您需要確保它具有以下 插件:
- 開式換檔 (oc)
- 容器註冊表 (cr)
- 確保您可以存取 Mac 或Linux終端機。
- Kubernetes CLI- 用於針對Kubernetes叢集運行命令的命令列介面。
- Terraform- 自動化您的資源配置
- Docker 我們將使用Docker建立將在叢集內運行程式碼的映像 - 確保您已登入您的Docker帳戶
- jq- 一個輕量級且靈活的命令列 JSON 處理器
- Git- 免費開源的分散式版本控制系統
- Node.js和 npm
逐步說明
步驟 1:取得 API 金鑰以將基礎架構部署到您的帳戶
請依照 本文檔中的 步驟建立 API 金鑰並記下它以用於步驟 2。
步驟 2:將 repo 和 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 步:建立基礎設施
TL;DR — 執行 Terraform 腳本:
terraform init
terraform apply --auto-approve
Terraform 資料夾包含許多簡單的腳本:
main.tf
告訴 Terraform 使用IBM Cloud。variables.tf
包含變數定義,其值將從terraform.tfvars填入。cloudant.tf
創建一個標準的Cloudant DB 和一些我們稍後將用來存取它的憑證。redis.tf
建立Redis實例和一些我們稍後將用來存取它的憑證。eventstreams.tf
建立Event Streams實例和一些我們稍後將用來存取它的憑證。registry.tf
建立將保存容器鏡像的Container Registry。iam.tf
建立與Container Registry互動所需的存取金鑰。vpc.tf
建立部署OpenShift叢集所需的 VPC(虛擬私有雲)基礎架構。 這包括三個不同可用區中的 VPC、子網路和公共網關。cos.tf
建立OpenShift管理叢集所需的單一Cloud Object Storage實例。openshift.tf
在 VPC 內建立虛擬機器集群,您將在其中部署應用程式。
資料庫和其他資源準備就緒需要幾分鐘的時間,但您現在應該擁有一些 VPC 資源、虛擬機器叢集、一個IBM Cloud® Databases for Redis實例、一個Cloudant您帳戶中的資料庫和Event Streams實例,以及容器映像的Container Registry命名空間。 您可以透過存取IBM Cloud帳戶的 資源部分 進行檢查。
步驟 4:建立容器映像並部署到OpenShift
此時,您的所有基礎設施已準備好接收資料。 現在我們必須建立和部署將生成和使用資料的不同模組,以及將在地圖上顯示卡車位置的應用程式。
執行建置腳本 — 但在此之前,您是否已登入IBM Cloud CLI 和Docker?
進入專案的根目錄並輸入以下內容:
./build.sh
第五步:觀察你的卡車行駛狀況
腳本的最後會輸出一個 URL —https://some.thing.eu-gb.appdomain.cloud。
如果您造訪已產生的 URL,您應該可以看到美國地圖,幾秒鐘後,地圖上會出現幾個代表您卡車的標記:

如果放大這些標記之一,您會看到它沿著道路移動。 作為車隊經理,您現在知道所有卡車的位置。

你剛剛做了什麼
build.sh腳本
build.sh
腳本做了很多事情:
- 它為您需要的每個服務建立一個 docker 映像。 生產者、消費者和 Web 應用程式都位於不同的資料夾中。 每個資料夾都有自己的簡單 Dockerfile 文件,腳本使用該文件來建立容器映像,然後將其上傳到IBM Container Registry。
- 它建立了一堆 kubernetes 金鑰,其中包含存取不同IBM服務( IBM Cloudant、Redis和Event Streams )所需的所有憑證。
- 它使用
deployment.yml
腳本中包含的指令將應用程式程式碼(和機密)部署到Red Hat OpenShift on IBM Cloud叢集。
deployment.yml腳本
此腳本告訴 Openshift 將哪些內容部署到 Openshift 叢集中的電腦。 在我們的例子中是:
- 數據生產者 (
trucktrackerproducer*
)。 - 數據消費者(
trucktrackerredisconsumer
和trucktrackercloudantconsumer
) - 網路應用程式 (
trucktrackerweb
)
在所有情況下,他們都會從容器註冊表中提取映像,並取得一些環境變數以及存取外部服務所需的憑證。
卡車追蹤系統
Truck Tracker 系統是一組簡單的Node.js腳本,使用四個主要套件:
- @ibm-cloud/cloudant 連接到IBM Cloudant並讀取/寫入資料。
- Redis 連接到Redis實例並讀取/寫入資料。
- kafkajs 連接到Event Streams實例。
- Express 啟用一個簡單的 Web 伺服器,允許與資料互動。
主要有五個文件:
server.js
:執行 Web 伺服器並與Redis通訊。 它正在從前端定期呼叫 /data 路由。 它連接到Redis,下載一個包含每輛卡車的 ID 和位置的對象,並將其返回到前端。index.html
:這是前端應用程式的唯一頁面。 當它加載時,它會顯示來自很棒的 開放街道地圖 服務的美國地圖。 然後,它會進行一個五秒的循環,向後端 (server.js
) 發出 HTTP 請求,檢索所有卡車及其位置,並循環遍歷它們以在地圖上繪製它們的最新位置。 每輛卡車都有一個地圖標記,其緯度/經度會隨著每個週期而更新。producer.js
:這會從腳本呼叫中取得位置檔案和卡車 ID,然後循環存取位置檔案中的所有資料點。 每個資料點都會轉換為包含卡車 ID 和緯度/經度的訊息,並每秒發布一次到Event Streams。 為了增加樂趣,它會沿著路線選擇一個隨機起點,並在到達位置文件末尾時掉頭返回。cloudantConsumer.js
:此腳本會在Cloudant中建立 Trucktracker 資料庫(如果該資料庫尚未存在),然後定期輪詢Event Streams以取得更多資料。 當資料傳入時,它會批量寫入Cloudant。redisConsumer.js
:此腳本定期輪詢Event Streams以取得資料。 當資料傳入時,它會被寫入Redis“哈希”中,其中哈希鍵是卡車 ID,值是卡車資料(緯度/經度)。 這種哈希安排允許server.js腳本一次拉取所有卡車資料。 最棒的是,如果您的某個消費者由於某種原因崩潰了,它會從上次中斷的地方繼續,而不會丟失任何數據,因為Event Streams知道它為每個消費者提供的最後一個數據點。 以這種方式將資料生成系統與資料消耗系統解耦是一種很好的設計實踐,可以提高彈性和容錯能力。
摘要
在本教程中,我們組合了許多IBM服務來模擬現實的IoT模式,其中卡車上的互聯網設備生成數據,供各種應用程式出於不同目的使用。
由於所有這些服務的託管性質,作為應用程式開發人員,您可以專注於解決您的業務問題,而讓我們為您完成管理基礎設施的繁重工作,從而節省數月的非核心活動工作時間,例如伺服器配置、軟體部署、修補、安全性等。
如果您遵循本教學課程,請記得取消配置您的基礎架構以停止產生費用。 在您的終端機上,請執行以下操作:
cd terraform/
terraform destroy
如果您想在開發者之旅中邁出下一步,請查看我們的一些 試用優惠。