練習 - 建置 Azure 函式以模擬遙測數據
在我們的範例中,我們使用事件溯源。 讓我們建置一個函式來模擬遙測數據,並將其傳送至事件中樞。 稍後,另一個函式可以接聽此事件並處理,並將其儲存在使用 Azure Cosmos DB 建立的資料庫中。
準備您的環境
讓我們定義一些環境變數,讓下列命令盡可能簡短且可理解。 <value>
定義佔位符,並在終端機或指令列工具中貼上下列命令並執行:
RESOURCE_GROUP=<value>
EVENT_HUB_NAMESPACE=<value>
EVENT_HUB_NAME=<value>
EVENT_HUB_AUTHORIZATION_RULE=<value>
COSMOS_DB_ACCOUNT=<value>
STORAGE_ACCOUNT=<value>
FUNCTION_APP=<value>
LOCATION=<value>
備註
若要設定 LOCATION 變數,您可以檢查 az functionapp list-consumption-locations
命令並使用最接近的位置。
建立必要的元件
在 Azure 上布建資源需要一些時間。 讓我們儘早開始建立元件,以避免稍後長時間等候。
建立資源群組
一律建議將訓練、概念證明或原型的所有資源繫結成一個資源群組。 如此一來,您就可以使用一個命令輕鬆地清除所有已使用的服務。 若要在指定的位置建立資源群組,請在終端機中執行下列命令:
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
建立和設定事件中樞
針對事件中樞,您必須指定其應接聽的命名空間。 此外,您必須將授權規則設定為 Listen
和 Send
。
az eventhubs namespace create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_NAMESPACE
az eventhubs eventhub create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
az eventhubs eventhub authorization-rule create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_AUTHORIZATION_RULE \
--eventhub-name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
--rights Listen Send
建置、設定及部署 Azure 函式
若要讓此範例盡可能逼真,請建立 Azure 函式並模擬遙測數據。 您也可以將IoT裝置系結至 Azure 函式,然後取得實際數據。 由於此函式是產生事件的函式,因此讓我們新增 p 或 -p 旗標。
az storage account create \
--resource-group $RESOURCE_GROUP \
--name $STORAGE_ACCOUNT"p" \
--sku Standard_LRS
az functionapp create \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP"-p"\
--storage-account $STORAGE_ACCOUNT"p" \
--consumption-plan-location $LOCATION \
--runtime java \
--functions-version 4
備註
2022 年 12 月,functions-version 2 和 3 已被淘汰,請使用 functions-version 4。
az functionapp create
命令在建立函式應用程式時,也會使用相同的名稱建立 Application Insights 資源。 我們稍後會使用該資源進行監視。
若要擷取記憶體帳戶和事件中樞的連接字串,請使用下列命令將它們儲存在環境變數中,然後使用 命令顯示它們 echo
。
AZURE_WEB_JOBS_STORAGE=$( \
az storage account show-connection-string \
--resource-group $RESOURCE_GROUP \
--name $STORAGE_ACCOUNT"p" \
--query connectionString \
--output tsv)
echo $AZURE_WEB_JOBS_STORAGE
EVENT_HUB_CONNECTION_STRING=$( \
az eventhubs eventhub authorization-rule keys list \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_AUTHORIZATION_RULE \
--eventhub-name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
--query primaryConnectionString \
--output tsv)
echo $EVENT_HUB_CONNECTION_STRING
若要將連接字串儲存在 Azure 函式帳戶的應用程式設定中,請在終端機中執行下列命令:
az functionapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP"-p" \
--settings \
AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING
現在,您的 Azure 資源事件中樞和 Azure 函式會建立並設定為正常運作。
接下來,使用 Maven 建立本地函式專案。
mvn archetype:generate --batch-mode \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype \
-DappName=$FUNCTION_APP"-p" \
-DresourceGroup=$RESOURCE_GROUP \
-DappRegion=$LOCATION \
-DappServicePlanName=$LOCATION"plan" \
-DgroupId=com.learn \
-DartifactId=telemetry-functions-producer
此指令會在資料夾內產生數個 telemetry-functions-producer
檔案:
pom.xml
的組建檔案,具有預先定義的 Azure 相依性。- 用於保存本機部署和手動測試的應用程式設定的
local.settings.json
檔案。 - 啟用 Azure Functions 擴充套件包的
host.json
檔案。 Function.java
包含預設 HTTP 觸發程式函式的檔案。- 此 Learn 課程模組未使用的一些測試檔案。
我們不會觸碰此 Learn 課程模組中的測試檔案,因此您可以隨意將其刪除。
cd telemetry-functions-producer
rm -r src/test
針對本機執行,應用程式設定必須擷取並儲存在檔案中 local.settings.json
。 您可以通過執行fetch-app-settings
命令來自動完成該動作。
func azure functionapp fetch-app-settings $FUNCTION_APP"-p"
接下來,開啟Function.java
檔案,並以下列程式碼取代內容:
package com.learn;
import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
public class Function {
@FunctionName("generateSensorData")
@EventHubOutput(
name = "event",
eventHubName = "", // blank because the value is included in the connection string
connection = "EventHubConnectionString")
public TelemetryItem generateSensorData(
@TimerTrigger(
name = "timerInfo",
schedule = "*/10 * * * * *") // every 10 seconds
String timerInfo,
final ExecutionContext context) {
context.getLogger().info("Java Timer trigger function executed at: " + java.time.LocalDateTime.now());
double temperature = Math.random() * 100;
double pressure = Math.random() * 50;
return new TelemetryItem(temperature, pressure);
}
}
函 generateSensorData
式會模擬將溫度和壓力讀數傳送至事件中樞的感測器。 定時器觸發程式會每隔 10 秒執行一次函式,而事件中樞輸出系結會將傳回值傳送至事件中樞。
當事件中樞收到訊息時,它會產生事件。
此函式所使用的數據會使用名為 TelemetryItem 的類別來儲存,您需要實作此類別。 在與 Function.java 相同的位置建立名為 TelemetryItem.java 的新檔案,並新增下列程式代碼:
package com.learn;
public class TelemetryItem {
private String id;
private double temperature;
private double pressure;
private boolean isNormalPressure;
private status temperatureStatus;
static enum status {
COOL,
WARM,
HOT
}
public TelemetryItem(double temperature, double pressure) {
this.temperature = temperature;
this.pressure = pressure;
}
public String getId() {
return id;
}
public double getTemperature() {
return temperature;
}
public double getPressure() {
return pressure;
}
@Override
public String toString() {
return "TelemetryItem={id=" + id + ",temperature="
+ temperature + ",pressure=" + pressure + "}";
}
public boolean isNormalPressure() {
return isNormalPressure;
}
public void setNormalPressure(boolean isNormal) {
this.isNormalPressure = isNormal;
}
public status getTemperatureStatus() {
return temperatureStatus;
}
public void setTemperatureStatus(status temperatureStatus) {
this.temperatureStatus = temperatureStatus;
}
}
在本機執行
當您在本機執行 Azure 函式時,它們已在世界各地串流! 此外,您可以在 Azure 入口網站中檢閱它們。
mvn clean package
mvn azure-functions:run
在一些建置和啟動訊息之後,您每次執行函式時,都會看到類似下列範例的輸出:
[2021-01-19T16:25:40.005Z] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2021-01-19T17:25:40.0044630+01:00', Id=fcf567a3-03ec-4159-9714-aa4449861b30)
[2021-01-19T16:25:40.011Z] Java Timer trigger function executed at: 2021-01-19T17:25:40.009405
[2021-01-19T16:25:40.013Z] Function "generateSensorData" (Id: fcf567a3-03ec-4159-9714-aa4449861b30) invoked by Java Worker
[2021-01-19T16:25:40.048Z] Executed 'Functions.generateSensorData' (Succeeded, Id=fcf567a3-03ec-4159-9714-aa4449861b30, Duration=43ms)
備註
在 Azure 雲端中部署並執行函式之前,您可以從您的本地電腦將事件發送到全球各地! 這非常適用於開發、偵錯和本機測試。
部署至 Azure
執行 mvn azure-functions:deploy
命令並繼續,以觸發 Azure 上的部署。
mvn azure-functions:deploy