Oktatóanyag: Függvény létrehozása Java-ban egy Event Hub-eseményindítóval és egy Azure Cosmos DB kimeneti kötéssel
Ez az oktatóanyag bemutatja, hogyan hozhat létre olyan Java-függvényt az Azure Functions használatával, amely folyamatosan elemzi a hőmérséklet- és nyomásadatokat. Az érzékelőolvasásokat jelképező eseményközpont-események aktiválják a függvényt. A függvény feldolgozza az eseményadatokat, majd állapotbejegyzéseket ad hozzá egy Azure Cosmos DB-példányhoz.
Ebben az oktatóanyagban a következőket fogja elkönyvelni:
- Azure-erőforrások létrehozása és konfigurálása az Azure CLI használatával.
- Az erőforrásokkal kommunikáló Java-függvények létrehozása és tesztelése.
- Helyezze üzembe a függvényeket az Azure-ban, és figyelje őket az Alkalmazás Elemzések segítségével.
If you don't have an Azure subscription, create an Azure free account before you begin.
Előfeltételek
Az oktatóanyag elvégzéséhez a következőket kell telepítenie:
- A Java Developer Kit 8-as verziója
- Az Apache Maven 3.0-s vagy újabb verziója
- Az Azure Functions Core Tools 2.6.666-os vagy újabb verziója
Használja a Bash-környezetet az Azure Cloud Shellben. További információ: A Bash rövid útmutatója az Azure Cloud Shellben.
Ha inkább helyi cli-referenciaparancsokat szeretne futtatni, telepítse az Azure CLI-t. Ha Windows vagy macOS rendszert használ, fontolja meg az Azure CLI Docker-tárolóban való futtatását. További információ: Az Azure CLI futtatása Docker-tárolóban.
Ha helyi telepítést használ, jelentkezzen be az Azure CLI-be az az login parancs futtatásával. A hitelesítési folyamat befejezéséhez kövesse a terminálon megjelenő lépéseket. További bejelentkezési lehetőségekért lásd : Bejelentkezés az Azure CLI-vel.
Amikor a rendszer kéri, először telepítse az Azure CLI-bővítményt. További információ a bővítményekről: Bővítmények használata az Azure CLI-vel.
Futtassa az az version parancsot a telepített verzió és a függő kódtárak megkereséséhez. A legújabb verzióra az az upgrade paranccsal frissíthet.
Fontos
Az JAVA_HOME
oktatóanyag elvégzéséhez a környezeti változót a JDK telepítési helyére kell állítani.
Ha az oktatóanyag kódját szeretné közvetlenül használni, tekintse meg a java-functions-eventhub-cosmosdb mintaadattárat.
Azure-erőforrások létrehozása
Ebben az oktatóanyagban a következő erőforrásokra lesz szüksége:
- A többi erőforrást tartalmazó erőforráscsoport
- Event Hubs-névtér, eseményközpont és engedélyezési szabály
- Azure Cosmos DB-fiók, -adatbázis és -gyűjtemény
- Egy függvényalkalmazás és egy tárfiók a üzemeltetéséhez
Az alábbi szakaszok bemutatják, hogyan hozhatja létre ezeket az erőforrásokat az Azure CLI használatával.
Set environment variables
Ezután hozzon létre néhány környezeti változót a létrehozni kívánt erőforrások nevéhez és helyéhez. Használja az alábbi parancsokat, és cserélje le a <value>
helyőrzőket az Ön által választott értékekre. Az értékeknek meg kell felelniük az Azure-erőforrások elnevezési szabályainak és korlátozásainak. A változóhoz LOCATION
használja a parancs által előállított értékek egyikét az functionapp list-consumption-locations
.
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>
Az oktatóanyag többi része ezeket a változókat használja. Vegye figyelembe, hogy ezek a változók csak az aktuális Azure CLI- vagy Cloud Shell-munkamenet idejére maradnak meg. Ha másik helyi terminálablakot használ, vagy a Cloud Shell-munkamenet túllépi az időkorlátot, újra le kell futtatnia ezeket a parancsokat.
Erőforráscsoport létrehozása
Az Azure erőforráscsoportokkal gyűjti össze az összes kapcsolódó erőforrást a fiókjában. Így egységként tekintheti meg őket, és egyetlen paranccsal törölheti őket, ha végzett velük.
Erőforráscsoport létrehozásához használja a következő parancsot:
Eseményközpont létrehozása
Ezután hozzon létre egy Azure Event Hubs-névteret, eseményközpontot és engedélyezési szabályt az alábbi parancsokkal:
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 \
--message-retention 1
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
Az Event Hubs-névtér tartalmazza a tényleges eseményközpontot és annak engedélyezési szabályát. Az engedélyezési szabály lehetővé teszi, hogy a függvények üzeneteket küldjenek a központnak, és figyeljék a megfelelő eseményeket. Az egyik függvény telemetriai adatokat képviselő üzeneteket küld. Egy másik függvény figyeli az eseményeket, elemzi az eseményadatokat, és az eredményeket az Azure Cosmos DB-ben tárolja.
Azure Cosmos DB létrehozása
Ezután hozzon létre egy Azure Cosmos DB-fiókot, -adatbázist és -gyűjteményt az alábbi parancsokkal:
az cosmosdb create \
--resource-group $RESOURCE_GROUP \
--name $COSMOS_DB_ACCOUNT
az cosmosdb sql database create \
--resource-group $RESOURCE_GROUP \
--account-name $COSMOS_DB_ACCOUNT \
--name TelemetryDb
az cosmosdb sql container create \
--resource-group $RESOURCE_GROUP \
--account-name $COSMOS_DB_ACCOUNT \
--database-name TelemetryDb \
--name TelemetryInfo \
--partition-key-path '/temperatureStatus'
Az partition-key-path
érték az egyes elemek értéke alapján particionálja az temperatureStatus
adatokat. A partíciókulcs lehetővé teszi az Azure Cosmos DB számára a teljesítmény növelését azáltal, hogy az adatokat különböző részhalmazokra osztja, amelyekhez egymástól függetlenül férhetnek hozzá.
Tárfiók és függvényalkalmazás létrehozása
Ezután hozzon létre egy Azure Storage-fiókot, amelyet az Azure Functions igényel, majd hozza létre a függvényalkalmazást. Használja a következő parancsokat:
az storage account create \
--resource-group $RESOURCE_GROUP \
--name $STORAGE_ACCOUNT \
--sku Standard_LRS
az functionapp create \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP \
--storage-account $STORAGE_ACCOUNT \
--consumption-plan-location $LOCATION \
--runtime java \
--functions-version 3
Amikor a az functionapp create
parancs létrehozza a függvényalkalmazást, egy alkalmazás Elemzések erőforrást is létrehoz ugyanazzal a névvel. A függvényalkalmazás automatikusan konfigurálva van egy olyan beállítássalAPPINSIGHTS_INSTRUMENTATIONKEY
, amely az Alkalmazás Elemzések csatlakoztatja. Az alkalmazástelemetria a függvények Azure-ban való üzembe helyezése után tekinthető meg, az oktatóanyag későbbi részében leírtak szerint.
A függvényalkalmazás konfigurálása
A függvényalkalmazásnak hozzá kell férnie a többi erőforráshoz a megfelelő működéshez. Az alábbi szakaszok bemutatják, hogyan konfigurálhatja a függvényalkalmazást úgy, hogy az a helyi gépen fusson.
Erőforrás-kapcsolati sztring lekérése
A következő parancsokkal lekérheti a tárterületet, az eseményközpontot és az Azure Cosmos DB-kapcsolati sztring, és mentheti őket környezeti változókba:
AZURE_WEB_JOBS_STORAGE=$( \
az storage account show-connection-string \
--name $STORAGE_ACCOUNT \
--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
COSMOS_DB_CONNECTION_STRING=$( \
az cosmosdb keys list \
--resource-group $RESOURCE_GROUP \
--name $COSMOS_DB_ACCOUNT \
--type connection-strings \
--query 'connectionStrings[0].connectionString' \
--output tsv)
echo $COSMOS_DB_CONNECTION_STRING
Ezek a változók az Azure CLI-parancsokból lekért értékekre vannak beállítva. Minden parancs egy JMESPath-lekérdezéssel nyeri ki a kapcsolati sztring a visszaadott JSON hasznos adatokból. A kapcsolati sztring is megjelenikecho
, így meggyőződhet arról, hogy sikeresen lekérte őket.
A függvényalkalmazás beállításainak frissítése
Ezután az alábbi paranccsal vigye át a kapcsolati sztring értékeket az Azure Functions-fiók alkalmazásbeállításaiba:
az functionapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP \
--settings \
AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING \
CosmosDBConnectionSetting=$COSMOS_DB_CONNECTION_STRING
Az Azure-erőforrások most már létre lettek hozva, és konfigurálva lettek a megfelelő együttműködésre.
A függvények létrehozása és tesztelése
Ezután létrehoz egy projektet a helyi gépen, hozzáad egy Java-kódot, és teszteli azt. Olyan parancsokat fog használni, amelyek a MavenHez készült Azure Functions beépülő modullal és az Azure Functions Core Tools szolgáltatással működnek. A függvények helyileg fognak futni, de a létrehozott felhőalapú erőforrásokat fogják használni. Miután a függvények helyileg működnek, a Maven használatával üzembe helyezheti őket a felhőben, és megfigyelheti, ahogy az adatok és az elemzések felhalmozódnak.
Ha a Cloud Shell használatával hozta létre az erőforrásokat, akkor nem fog helyileg csatlakozni az Azure-hoz. Ebben az esetben a az login
parancs használatával indítsa el a böngészőalapú bejelentkezési folyamatot. Ezután szükség esetén állítsa be az alapértelmezett előfizetést az account set --subscription
, majd az előfizetés azonosítóját. Végül futtassa az alábbi parancsokat néhány környezeti változó újbóli létrehozásához a helyi gépen. Cserélje le a <value>
helyőrzőket ugyanazokra az értékekre, amelyeket korábban használt.
Helyi függvényprojekt létrehozása
A következő Maven-paranccsal hozzon létre egy függvényprojektet, és adja hozzá a szükséges függőségeket.
mvn archetype:generate --batch-mode \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype \
-DappName=$FUNCTION_APP \
-DresourceGroup=$RESOURCE_GROUP \
-DappRegion=$LOCATION \
-DgroupId=com.example \
-DartifactId=telemetry-functions
Ez a parancs több fájlt hoz létre egy telemetry-functions
mappában:
- A
pom.xml
Mavenhez használható fájl - A
local.settings.json
helyi tesztelés alkalmazásbeállításainak tárolására szolgáló fájl - Egy
host.json
fájl, amely lehetővé teszi az Azure Functions-bővítménycsomagot, amely szükséges az Azure Cosmos DB kimeneti kötéséhez az adatelemzési függvényben - Alapértelmezett
Function.java
függvény-implementációt tartalmazó fájl - Néhány tesztfájl, amelyekre az oktatóanyagnak nincs szüksége
A fordítási hibák elkerülése érdekében törölnie kell a tesztfájlokat. Futtassa az alábbi parancsokat az új projektmappához való navigáláshoz és a tesztmappa törléséhez:
A függvényalkalmazás beállításainak lekérése helyi használatra
A helyi teszteléshez a függvényprojektnek szüksége lesz azokra a kapcsolati sztring, amelyeket az oktatóanyag korábbi részében hozzáadott a függvényalkalmazáshoz az Azure-ban. Használja a következő Azure Functions Core Tools parancsot, amely lekéri a felhőben tárolt összes függvényalkalmazás-beállítást, és hozzáadja őket a local.settings.json
fájlhoz:
Java-kód hozzáadása
Ezután nyissa meg a Function.java
fájlt, és cserélje le a tartalmat a következő kódra.
package com.example;
import com.example.TelemetryItem.status;
import com.microsoft.azure.functions.annotation.Cardinality;
import com.microsoft.azure.functions.annotation.CosmosDBOutput;
import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.EventHubTrigger;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.OutputBinding;
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);
}
@FunctionName("processSensorData")
public void processSensorData(
@EventHubTrigger(
name = "msg",
eventHubName = "", // blank because the value is included in the connection string
cardinality = Cardinality.ONE,
connection = "EventHubConnectionString")
TelemetryItem item,
@CosmosDBOutput(
name = "databaseOutput",
databaseName = "TelemetryDb",
containerName = "TelemetryInfo",
connection = "CosmosDBConnectionSetting")
OutputBinding<TelemetryItem> document,
final ExecutionContext context) {
context.getLogger().info("Event hub message received: " + item.toString());
if (item.getPressure() > 30) {
item.setNormalPressure(false);
} else {
item.setNormalPressure(true);
}
if (item.getTemperature() < 40) {
item.setTemperatureStatus(status.COOL);
} else if (item.getTemperature() > 90) {
item.setTemperatureStatus(status.HOT);
} else {
item.setTemperatureStatus(status.WARM);
}
document.setValue(item);
}
}
Mint látható, ez a fájl két függvényt generateSensorData
és processSensorData
. A generateSensorData
függvény szimulál egy érzékelőt, amely hőmérséklet- és nyomásméréseket küld az eseményközpontnak. Az időzítő eseményindítója 10 másodpercenként futtatja a függvényt, és egy eseményközpont kimeneti kötése elküldi a visszatérési értéket az eseményközpontnak.
Amikor az eseményközpont megkapja az üzenetet, létrehoz egy eseményt. A processSensorData
függvény akkor fut, amikor megkapja az eseményt. Ezután feldolgozza az eseményadatokat, és egy Azure Cosmos DB kimeneti kötés használatával elküldi az eredményeket az Azure Cosmos DB-nek.
A függvények által használt adatokat egy úgynevezett TelemetryItem
osztály tárolja, amelyet implementálnia kell. Hozzon létre egy új fájlt, amely ugyanazon a helyen van meghívva TelemetryItem.java
, Function.java
és adja hozzá a következő kódot:
package com.example;
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;
}
}
A futtatása helyileg
Mostantól helyileg is létrehozhatja és futtathatja a függvényeket, és láthatja, hogy az adatok megjelennek az Azure Cosmos DB-ben.
A függvények létrehozásához és futtatásához használja a következő Maven-parancsokat:
Néhány buildelési és indítási üzenet után a függvények futtatásakor az alábbi példához hasonló kimenet jelenik meg:
[10/22/19 4:01:30 AM] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2019-10-21T21:01:30.0016769-07:00', Id=c1927c7f-4f70-4a78-83eb-bc077d838410)
[10/22/19 4:01:30 AM] Java Timer trigger function executed at: 2019-10-21T21:01:30.015
[10/22/19 4:01:30 AM] Function "generateSensorData" (Id: c1927c7f-4f70-4a78-83eb-bc077d838410) invoked by Java Worker
[10/22/19 4:01:30 AM] Executed 'Functions.generateSensorData' (Succeeded, Id=c1927c7f-4f70-4a78-83eb-bc077d838410)
[10/22/19 4:01:30 AM] Executing 'Functions.processSensorData' (Reason='', Id=f4c3b4d7-9576-45d0-9c6e-85646bb52122)
[10/22/19 4:01:30 AM] Event hub message received: TelemetryItem={id=null,temperature=32.728691307527015,pressure=10.122563042388165}
[10/22/19 4:01:30 AM] Function "processSensorData" (Id: f4c3b4d7-9576-45d0-9c6e-85646bb52122) invoked by Java Worker
[10/22/19 4:01:38 AM] Executed 'Functions.processSensorData' (Succeeded, Id=1cf0382b-0c98-4cc8-9240-ee2a2f71800d)
Ezután megnyithatja az Azure Portalt , és megnyithatja az Azure Cosmos DB-fiókját. Válassza az Adatkezelőt, bontsa ki a TelemetryInfo elemet, majd válassza az Elemek lehetőséget az adatok érkezéskor való megtekintéséhez.
Üzembe helyezés az Azure-ban és alkalmazástelemetria megtekintése
Végül üzembe helyezheti az alkalmazást az Azure-ban, és ellenőrizheti, hogy továbbra is ugyanúgy működik-e, mint helyileg.
Telepítse a projektet az Azure-ban a következő paranccsal:
A függvények most már az Azure-ban futnak, és továbbra is gyűjtik az adatokat az Azure Cosmos DB-ben. Az üzembe helyezett függvényalkalmazást megtekintheti az Azure Portalon, és megtekintheti az alkalmazás telemetriáját a csatlakoztatott alkalmazás Elemzések erőforráson keresztül, ahogyan az alábbi képernyőképeken látható:
Élő metrikák streamje:
Teljesítmény:
Clean up resources
Ha végzett az oktatóanyagban létrehozott Azure-erőforrásokkal, az alábbi parancs használatával törölheti őket:
Következő lépések
Ebben az oktatóanyagban megtanulta, hogyan hozhat létre olyan Azure-függvényt, amely kezeli az Event Hub-eseményeket, és frissít egy Azure Cosmos DB-példányt. További információkért tekintse meg az Azure Functions Java fejlesztői útmutatóját. A használt széljegyzetekről további információt a com.microsoft.azure.functions.annotation referenciában talál.
Ez az oktatóanyag környezeti változókat és alkalmazásbeállításokat használt a titkos kódok, például a kapcsolati sztring tárolására. A titkos kulcsok Azure Key Vaultban való tárolásáról további információt az App Service és az Azure Functions Key Vault-hivatkozásainak használata című témakörben talál.
Ezután megtudhatja, hogyan használhatja az Azure Pipelines CI/CD-t az automatizált üzembe helyezéshez:
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: