Oefening: een Azure-functie bouwen om telemetrische gegevens te simuleren
Voor ons voorbeeld gebruiken we event sourcing. 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 tijdelijke aanduidingen <value> 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 opdracht az functionapp list-consumption-locations 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 resourcegroep 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 geluisterd moet worden. 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 versie van functies 4 omdat 2 en 3 in december 2022 waren afgeschaft.
Wanneer de opdracht az functionapp create uw functietoepassing maakt, wordt er ook een Application Insights-resource met dezelfde naam gemaakt. We gebruiken die resource later voor onze bewaking.
Als u de verbindingsreeksen voor het opslagaccount en de Event Hub wilt ophalen, gebruikt u de volgende opdrachten om ze op te slaan in omgevingsvariabelen en geeft u ze vervolgens weer met de opdracht 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
Als u de verbindingsreeksen 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 zijn uw Azure-resources Event Hub en 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
Met deze opdracht worden verschillende bestanden in een telemetry-functions-producer map gegenereerd:
- Het
pom.xmlbuildbestand 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 waarmee de Azure Functions-extensiebundel wordt ingeschakeld. - Een
Function.java-bestand met de standaard-HTTP-triggerfunctie. - 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 fetch-app-settings uit te 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 temperatuur- en drukmetingen naar de Event Hub verzendt. Een timertrigger 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, wordt er een gebeurtenis gegenereerd.
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 enkele build- en opstartberichten ziet u uitvoer die vergelijkbaar is met het volgende voorbeeld voor elke keer dat de functies worden 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 in Azure
Activeer de implementatie in Azure door de opdracht mvn azure-functions:deploy uit te voeren en door te gaan.
mvn azure-functions:deploy