Oefening: een Azure-functie bouwen om telemetrische gegevens te simuleren
Voor ons voorbeeld gebruiken we gebeurtenisbronnen. We gaan een functie bouwen die telemetrische gegevens simuleert en naar een Event Hub verzendt. Later kan een andere functie luisteren naar deze gebeurtenis en deze verwerken en opslaan in een database die is gemaakt met Azure Cosmos DB.
Uw omgeving voorbereiden
We gaan enkele omgevingsvariabelen definiëren om de volgende opdrachten zo kort en begrijpelijk mogelijk te houden. Definieer de <value>
tijdelijke aanduidingen en plak en voer de volgende opdrachten uit in uw terminal of opdrachtregelprogramma:
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>
Notitie
Als u de VARIABELE LOCATION wilt instellen, kunt u de az functionapp list-consumption-locations
opdracht controleren en de dichtstbijzijnde locatie gebruiken.
De vereiste onderdelen maken
Het inrichten van de resources in Azure duurt enige tijd. Laten we beginnen met het maken van het onderdeel zo vroeg mogelijk om lange wachttijden later te voorkomen.
Een brongroep maken
Het is altijd een goed idee om alle resources van een training, een proof-of-concept of een prototype in één resourcegroep te binden. Op die manier kunt u alle gebruikte services gemakkelijk opschonen met één opdracht. Als u een resourcegroep wilt maken op de opgegeven locatie, voert u de volgende opdracht uit in uw terminal:
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
Een Event Hub maken en configureren
Voor de Event Hub moet u de naamruimte opgeven waarnaar moet worden geluisterd. U moet ook de autorisatieregel configureren voor Listen
en 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
De Azure-functie bouwen, configureren en implementeren
Als u dit voorbeeld zo realistisch mogelijk wilt maken, maakt u een Azure-functie en simuleert u telemetrische gegevens. U kunt ook een IoT-apparaat binden aan uw Azure-functie, wat vervolgens echte gegevens zou opleveren. Omdat deze functie de gebeurtenis produceert, voegen we een p- of -p-vlag toe.
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
Notitie
Gebruik functies-versie 4 als 2 en 3 zijn afgeschaft in december 2022.
Wanneer de opdracht uw az functionapp create
functietoepassing maakt, wordt er ook een Application Insights-resource met dezelfde naam gemaakt. We gebruiken die resource later voor onze bewaking.
Als u de verbindingsreeks s voor het opslagaccount en de Event Hub wilt ophalen, gebruikt u de volgende opdrachten om ze op te slaan in omgevingsvariabelen en weer te geven met de echo
opdracht.
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
Als u de verbindingsreeks s wilt opslaan in de toepassingsinstellingen van uw Azure Function-account, voert u de volgende opdracht uit in uw terminal:
az functionapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP"-p" \
--settings \
AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING
Nu worden uw Azure-resources Event Hub en De Azure-functie gemaakt en geconfigureerd om goed samen te werken.
Maak vervolgens een lokaal functions-project met 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
Deze opdracht genereert verschillende bestanden in een telemetry-functions-producer
-map:
- Het
pom.xml
buildbestand met vooraf gedefinieerde Azure-afhankelijkheden. - Het
local.settings.json
bestand voor het opslaan van de toepassingsinstellingen voor lokale implementatie en handmatig testen. - Een
host.json
bestand dat de Azure Functions-extensiebundel inschakelt. - Een
Function.java
bestand dat de standaard-HTTP-triggerfunctie bevat. - Enkele testbestanden die deze Learn-module niet gebruikt.
We raken de testbestanden in deze Learn-module niet aan, dus u kunt ze verwijderen.
cd telemetry-functions-producer
rm -r src/test
Voor lokale uitvoering moeten de toepassingsinstellingen worden opgehaald en opgeslagen in het local.settings.json
bestand. U kunt dit automatisch doen door de opdracht uit te fetch-app-settings
voeren.
func azure functionapp fetch-app-settings $FUNCTION_APP"-p"
Open vervolgens het Function.java
bestand en vervang de inhoud door de volgende code:
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);
}
}
De functie generateSensorData
simuleert een sensor die de temperatuur- en drukwaarden doorstuurt naar de event hub. Een tijdstrigger voert de functie elke 10 seconden uit en een Event Hub-uitvoerbinding verzendt de retourwaarde naar de event hub.
Wanneer de event hub het bericht ontvangt, genereert het een gebeurtenis.
De gegevens die door deze functie worden gebruikt, worden opgeslagen met behulp van een klasse met de naam TelemetryItem, die u moet implementeren. Maak een nieuw bestand met de naam TelemetryItem.java op dezelfde locatie als Function.java en voeg de volgende code toe:
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;
}
}
lokaal uitvoeren
Wanneer u Azure-functies lokaal uitvoert, worden ze al over de hele wereld gestreamd. U kunt ze ook bekijken in Azure Portal.
mvn clean package
mvn azure-functions:run
Na sommige build- en opstartberichten ziet u uitvoer die lijkt op het volgende voorbeeld telkens de functie wordt uitgevoerd:
[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)
Notitie
Voordat u uw functie in de Azure-cloud implementeert en uitvoert, kunt u overal ter wereld gebeurtenissen verzenden vanaf uw lokale computer. Dat is erg handig voor het ontwikkelen, opsporen van fouten en lokaal testen.
Implementeren op Azure
Activeer de implementatie in Azure door de mvn azure-functions:deploy
opdracht uit te voeren en door te gaan.
mvn azure-functions:deploy