Mulai Cepat: Membuat fungsi Java di Azure dari baris perintah
Dalam artikel ini, Anda menggunakan alat baris perintah untuk membuat fungsi Java yang merespons permintaan HTTP. Setelah menguji kode secara lokal, Anda menyebarkannya ke lingkungan tanpa server Azure Functions.
Jika Maven bukan alat pengembangan pilihan Anda, lihat tutorial serupa kami untuk pengembang Java:
Menyelesaikan mulai cepat ini dikenakan sedikit biaya sekitar beberapa sen USD atau kurang di akun Azure Anda.
Mengonfigurasi lingkungan lokal Anda
Sebelum memulai, Anda harus memiliki yang berikut:
Akun Azure dengan langganan aktif. Buat akun gratis.
Azure Functions Core Tools versi 4.x.
Azure CLI versi 2.4 atau yang lebih baru.
Kit Pengembang Java, versi 8 atau 11. Variabel lingkungan
JAVA_HOMEharus diatur ke lokasi penginstalan versi JDK yang benar.Apache Maven, versi 3.0 atau yang lebih tinggi.
Pemeriksaan prasyarat
Di terminal atau jendela perintah, jalankan
func --versionuntuk memeriksa apakah Azure Functions Core Tools adalah versi 4.x.Jalankan
az --versionuntuk memeriksa apakah versi Azure CLI adalah 2.4 atau yang lebih baru.Jalankan
az loginuntuk masuk ke Azure dan memverifikasi langganan aktif.
Membuat proyek fungsi lokal
Di Azure Functions, proyek fungsi adalah kontainer untuk satu atau beberapa fungsi individual yang masing-masing merespons pemicu tertentu. Semua fungsi dalam proyek memiliki konfigurasi lokal dan hosting yang sama. Di bagian ini, Anda membuat proyek fungsi yang berisi satu fungsi.
Dalam folder kosong, jalankan perintah berikut ini untuk menghasilkan proyek Functions dari Maven archetype.
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8Penting
- Gunakan
-DjavaVersion=11jika Anda ingin fungsi Anda berjalan di Java 11. Untuk mempelajari lebih lanjut, lihat Versi Java. - Variabel lingkungan
JAVA_HOMEharus diatur ke lokasi penginstalan versi JDK yang benar untuk menyelesaikan artikel ini.
- Gunakan
Maven meminta nilai yang diperlukan untuk menyelesaikan pembuatan proyek pada penyebaran.
Berikan nilai berikut saat diminta:Prompt Nilai Deskripsi groupId com.fabrikamNilai yang secara unik mengidentifikasi proyek Anda dari semua proyek, mengikuti aturan penamaan paket untuk Java. artifactId fabrikam-functionsNilai yang merupakan nama jar, tanpa nomor versi. versi 1.0-SNAPSHOTPilih nilai default. package com.fabrikamNilai yang merupakan paket Java untuk kode fungsi yang dihasilkan. Gunakan default. Ketik
Yatau tekan Enter untuk mengonfirmasi.Maven membuat file proyek di folder baru dengan nama artifactId, yang dalam contoh ini adalah
fabrikam-functions.Navigasi ke folder proyek:
cd fabrikam-functionsFolder ini berisi berbagai file untuk proyek, termasuk file konfigurasi bernama local.settings.json dan host.json. Karena local.settings.json dapat berisi rahasia yang diunduh dari Azure, file dikecualikan dari kontrol sumber secara default dalam file .gitignore.
(Opsional) Memeriksa isi file
Jika ingin, Anda dapat melompat ke Menjalankan fungsi secara lokal dan memeriksa isi file nanti.
Function.java
Function.java berisi metode run yang menerima data permintaan dalam variabel request adalah HttpRequestMessage yang dihiasi dengan anotasi HttpTrigger, yang mendefinisikan perilaku pemicu.
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.functions;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FixedDelayRetry;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import java.util.Optional;
/**
* Azure Functions with HTTP Trigger.
*/
public class Function {
/**
* This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
* 1. curl -d "HTTP Body" {your host}/api/HttpExample
* 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
*/
@FunctionName("HttpExample")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
final String query = request.getQueryParameters().get("name");
final String name = request.getBody().orElse(query);
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
} else {
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
}
public static int count = 1;
/**
* This function listens at endpoint "/api/HttpExampleRetry". The function is re-executed in case of errors until the maximum number of retries occur.
* Retry policies: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-error-pages?tabs=java
*/
@FunctionName("HttpExampleRetry")
@FixedDelayRetry(maxRetryCount = 3, delayInterval = "00:00:05")
public HttpResponseMessage HttpExampleRetry(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) throws Exception {
context.getLogger().info("Java HTTP trigger processed a request.");
if(count<3) {
count ++;
throw new Exception("error");
}
// Parse query parameter
final String query = request.getQueryParameters().get("name");
final String name = request.getBody().orElse(query);
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
} else {
return request.createResponseBuilder(HttpStatus.OK).body(name).build();
}
}
/**
* This function listens at endpoint "/api/HttpTriggerJavaVersion".
* It can be used to verify the Java home and java version currently in use in your Azure function
*/
@FunctionName("HttpTriggerJavaVersion")
public static HttpResponseMessage HttpTriggerJavaVersion(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context
) {
context.getLogger().info("Java HTTP trigger processed a request.");
final String javaVersion = getJavaVersion();
context.getLogger().info("Function - HttpTriggerJavaVersion" + javaVersion);
return request.createResponseBuilder(HttpStatus.OK).body("HttpTriggerJavaVersion").build();
}
public static String getJavaVersion() {
return String.join(" - ", System.getProperty("java.home"), System.getProperty("java.version"));
}
}
Pesan respons dibuat oleh API HttpResponseMessage.Builder.
pom.xml
Pengaturan untuk sumber daya Azure yang dibuat untuk menghosting aplikasi Anda ditentukan dalam elemen konfigurasi plugin dengan groupId dari com.microsoft.azure dalam file pom.xml yang dihasilkan. Misalnya, elemen konfigurasi di bawah ini menginstruksikan penyebaran berbasis Maven untuk membuat aplikasi fungsi di grup sumber daya java-functions-group di wilayah westus. Aplikasi fungsi itu sendiri berjalan pada Windows yang dihosting dalam rencana java-functions-app-service-plan, yang secara default merupakan Consumption plan tanpa server.
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<version>${azure.functions.maven.plugin.version}</version>
<configuration>
<!-- function app name -->
<appName>${functionAppName}</appName>
<!-- function app resource group -->
<resourceGroup>${functionResourceGroup}</resourceGroup>
<!-- function app service plan name -->
<appServicePlanName>java-functions-app-service-plan</appServicePlanName>
<!-- function app region-->
<!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
<region>${functionAppRegion}</region>
<!-- function pricingTier, default to be consumption if not specified -->
<!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
<!-- <pricingTier></pricingTier> -->
<!-- Whether to disable application insights, default is false -->
<!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
<!-- <disableAppInsights></disableAppInsights> -->
<runtime>
<!-- runtime os, could be windows, linux or docker-->
<os>windows</os>
<javaVersion>8</javaVersion>
<!-- for docker function, please set the following parameters -->
<!-- <image>[hub-user/]repo-name[:tag]</image> -->
<!-- <serverId></serverId> -->
<!-- <registryUrl></registryUrl> -->
</runtime>
<appSettings>
<property>
<name>FUNCTIONS_EXTENSION_VERSION</name>
<value>~3</value>
</property>
</appSettings>
</configuration>
<executions>
<execution>
<id>package-functions</id>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>
Anda dapat mengubah pengaturan ini untuk mengontrol cara sumber daya dibuat di Azure, seperti dengan mengubah runtime.os dari windows ke linux sebelum penyebaran awal. Untuk daftar lengkap pengaturan yang didukung oleh plug-in Maven, lihat detail konfigurasi.
FunctionTest.java
Arketipe juga membuat pengujian unit untuk fungsi Anda. Saat Anda mengubah fungsi untuk menambahkan pengikatan atau menambahkan fungsi baru ke proyek, Anda juga perlu mengubah pengujian dalam file FunctionTest.java.
Menjalankan fungsi secara lokal
Jalankan fungsi Anda dengan memulai host runtime bahasa umum Azure Functions lokal dari folder LocalFunctionProj:
mvn clean package mvn azure-functions:runMenjelang akhir output, baris berikut akan muncul:
... Now listening on: http://0.0.0.0:7071 Application started. Press Ctrl+C to shut down. Http Functions: HttpExample: [GET,POST] http://localhost:7071/api/HttpExample ...Catatan
Jika HttpExample tidak muncul seperti yang ditunjukkan di atas, Anda mungkin memulai hosting dari luar folder akar proyek. Dalam kasus ini, gunakan Ctrl+C untuk menghentikan hosting, navigasi ke folder akar proyek, dan jalankan perintah sebelumnya lagi.
Salin URL fungsi
HttpExampleAnda dari output ini ke browser dan tambahkan string kueri?name=<YOUR_NAME>, membuat URL lengkap sepertihttp://localhost:7071/api/HttpExample?name=Functions. Browser harus menampilkan pesan yang mengembalikan nilai string kueri Anda. Terminal tempat Anda memulai proyek juga menunjukkan output log saat Anda membuat permintaan.Jika sudah selesai, gunakan Ctrl+C dan pilih
yuntuk menghentikan hosting fungsi.
Menyebarkan proyek fungsi ke Azure
Aplikasi fungsi dan sumber daya terkait dibuat di Azure saat Anda pertama kali menyebarkan proyek fungsi Anda. Pengaturan untuk sumber daya Azure yang dibuat untuk menghosting aplikasi Anda ditentukan dalam file pom.xml. Dalam artikel ini, Anda akan menerima default.
Tip
Untuk membuat aplikasi fungsi yang berjalan di Linux, bukan Windows, ubah elemen runtime.os dalam file pom.xml dari windows ke linux. Menjalankan Linux dalam rencana pemakaian didukung di wilayah ini. Anda tidak dapat memiliki aplikasi yang berjalan di Linux dan aplikasi yang berjalan di Windows dalam grup sumber daya yang sama.
Sebelum Anda dapat menyebarkan, masuk ke langganan Azure Anda menggunakan Azure CLI atau Azure PowerShell.
az loginPerintah az login memasukkan Anda ke akun Azure Anda.
Gunakan perintah berikut untuk menyebarkan proyek Anda ke aplikasi fungsi baru.
mvn azure-functions:deployIni membuat sumber daya berikut di Azure:
- Grup sumber daya. Dinamai sebagai java-functions-group.
- Akun penyimpanan. Diperlukan oleh Functions. Nama ini dibuat secara acak berdasarkan persyaratan nama akun Azure Storage.
- Rencana Hosting. Hosting tanpa server untuk aplikasi fungsi Anda di wilayah westus. Namanya adalah java-functions-app-service-plan.
- Aplikasi fungsi. Aplikasi fungsi adalah unit penyebaran dan eksekusi untuk fungsi Anda. Nama ini dibuat secara acak berdasarkan artifactIdAnda, ditambahkan dengan angka yang dibuat secara acak.
Penyebaran mengemas file proyek dan menyebarkannya ke aplikasi fungsi baru menggunakan penyebaran zip. Kode berjalan dari paket penyebaran di Azure.
Memanggil fungsi pada Azure
Karena fungsi Anda menggunakan pemicu HTTP, Anda memanggilnya dengan membuat permintaan HTTP ke URL-nya di browser atau dengan alat seperti curl.
Salin Panggilan URL lengkap yang ditampilkan dalam output perintah terbitkan ke bilah alamat browser, menambahkan parameter kueri ?name=Functions. Browser harus menampilkan output yang sama seperti saat Anda menjalankan fungsi secara lokal.

Jalankan perintah berikut untuk melihat mendekati real-time log streaming:
func azure functionapp logstream <APP_NAME>
Di jendela terminal terpisah atau di browser, panggil lagi fungsi jarak jauh. Log verbose dari eksekusi fungsi di Azure ditampilkan di terminal.
Membersihkan sumber daya
Jika Anda melanjutkan ke langkah berikutnya dan menambahkan pengikatan output antrean Azure Storage, jaga semua sumber daya Anda tetap di tempat saat Anda akan membangun apa yang telah Anda lakukan.
Jika tidak, gunakan perintah berikut untuk menghapus grup sumber daya dan semua sumber daya di dalamnya untuk menghindari timbulnya biaya lebih lanjut.
az group delete --name java-functions-group
