Fungsi Spring Cloud di Azure
Artikel ini memandu Anda menggunakan Fungsi Spring Cloud untuk mengembangkan fungsi Java dan memublikasikannya ke Azure Functions. Setelah selesai, kode fungsi Anda berjalan pada Paket Konsumsi di Azure dan dapat dipicu menggunakan permintaan HTTP.
Prasyarat
- Langganan Azure. Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.
Untuk mengembangkan fungsi menggunakan Java, Anda harus menginstal yang berikut:
- Java Developer Kit, versi 11
- Apache Maven, versi 3.0 atau yang lebih tinggi
- Azure CLI
- Azure Functions Core Tools versi 4
Penting
- Anda harus mengatur
JAVA_HOME
variabel lingkungan ke lokasi penginstalan JDK untuk menyelesaikan mulai cepat ini. - Pastikan versi alat inti Anda setidaknya 4.0.5455.
Apa yang akan kita bangun
Kita akan membangun fungsi klasik "Hello, World" yang berjalan di Azure Functions dan dikonfigurasi dengan Spring Cloud Function.
Fungsi menerima User
objek JSON, yang berisi nama pengguna, dan mengirim kembali Greeting
objek, yang berisi pesan selamat datang kepada pengguna tersebut.
Proyek ini tersedia di Spring Cloud Function di sampel Azure dari repositori azure-function-java-worker di GitHub. Anda dapat menggunakan sampel tersebut secara langsung jika Anda ingin melihat pekerjaan akhir yang dijelaskan dalam mulai cepat ini.
Membuat proyek Maven baru
Kita akan membuat proyek Maven kosong, dan mengonfigurasinya dengan Fungsi Spring Cloud dan Azure Functions.
Dalam folder kosong, buat file pom.xml baru dan salin/tempel konten dari file pom.xml proyek sampel.
Catatan
File ini menggunakan dependensi Maven dari Spring Boot dan Fungsi Spring Cloud, dan melakukan konfigurasi plugin Spring Boot dan Azure Functions Maven.
Anda perlu menyesuaikan beberapa properti untuk aplikasi Anda:
<functionAppName>
adalah nama fungsi Azure Anda<functionAppRegion>
adalah nama wilayah Azure tempat Fungsi Anda disebarkan<functionResourceGroup>
adalah nama grup sumber daya Azure yang Anda gunakan
Ubah properti tersebut langsung di dekat bagian atas file pom.xml, seperti yang ditunjukkan pada contoh berikut:
<properties>
<java.version>11</java.version>
<!-- Spring Boot start class. WARNING: correct class must be set -->
<start-class>com.example.DemoApplication</start-class>
<!-- customize those properties. WARNING: the functionAppName should be unique across Azure -->
<azure.functions.maven.plugin.version>1.29.0</azure.functions.maven.plugin.version>
<functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
<functionAppServicePlanName>my-spring-function-service-plan</functionAppServicePlanName>
<functionAppName>my-spring-function</functionAppName>
<functionPricingTier>Y1</functionPricingTier>
<functionAppRegion>eastus</functionAppRegion>
</properties>
Membuat file konfigurasi Azure
Buat folder src/main/resources dan tambahkan file konfigurasi Azure Functions berikut ke dalamnya.
host.json:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.2.0)"
},
"functionTimeout": "00:10:00"
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "java",
"FUNCTIONS_EXTENSION_VERSION": "~4",
"AzureWebJobsDashboard": ""
}
}
Membuat objek domain
Azure Functions dapat menerima dan mengirim objek dalam format JSON.
Kita sekarang akan membuat objek User
dan Greeting
, yang mewakili model domain kita.
Anda dapat membuat objek yang lebih kompleks, dengan lebih banyak properti, jika Anda ingin menyesuaikan mulai cepat ini dan membuatnya lebih menarik bagi Anda.
Buat folder src/main/java/com/example/model dan tambahkan dua file berikut:
User.java:
package com.example.model;
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Greeting.java:
package com.example.model;
public class Greeting {
private String message;
public Greeting() {
}
public Greeting(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Membuat aplikasi Spring Boot
Aplikasi ini mengelola semua logika bisnis, dan memiliki akses ke ekosistem Spring Boot penuh. Kemampuan ini memberi Anda dua manfaat utama dibandingkan fungsi Azure standar:
- Ia tidak bergantung pada API Azure Functions, sehingga Anda dapat dengan mudah memindahkannya ke sistem lain. Misalnya, Anda dapat menggunakannya kembali dalam aplikasi Spring Boot normal.
- Anda dapat menggunakan semua anotasi
@Enable
dari Spring Boot untuk menambahkan fitur baru.
Di folder src/main/java/com/example, buat file berikut, yang merupakan aplikasi Spring Boot normal:
DemoApplication.java:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
}
}
Sekarang buat file berikut di folder src/main/java/com/example/hello . Kode ini berisi komponen Spring Boot yang mewakili Fungsi yang ingin kita jalankan:
Hello.java:
package com.example.hello;
import com.example.model.*;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Component
public class Hello implements Function<User, Greeting> {
@Override
public Greeting apply(User user) {
return new Greeting("Hello, " + user.getName() + "!\n");
}
}
Catatan
Fungsi Hello
cukup spesifik:
- Ini adalah
java.util.function.Function
. Fungsi ini berisi logika bisnis, dan menggunakan API Java standar untuk mengubah satu objek menjadi objek lain. - Karena memiliki anotasi
@Component
, objek ini adalah Spring Bean, dan secara default namanya sama dengan kelasnya, tetapi dimulai dengan karakter huruf kecil:hello
. Jika ingin membuat fungsi lain dalam aplikasi, Anda perlu mengikuti konvensi penamaan ini. Nama harus sesuai dengan nama Azure Functions yang akan kita buat di bagian berikutnya.
Membuat Fungsi Azure
Untuk mendapatkan manfaat dari API Azure Functions lengkap, kami sekarang mengodekan Azure Function yang mendelegasikan eksekusinya ke Spring Cloud Function yang dibuat pada langkah sebelumnya.
Di folder src/main/java/com/example/hello, buat file kelas Azure Function berikut:
HelloHandler.java:
package com.example.hello;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.example.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class HelloHandler {
@Autowired
private Hello hello;
@FunctionName("hello")
public HttpResponseMessage execute(
@HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, ExecutionContext context) {
User user = request.getBody()
.filter(u -> u.getName() != null)
.orElseGet(() -> new User(request.getQueryParameters().getOrDefault("name", "world")));
context.getLogger().info("Greeting user name: " + user.getName());
return request.createResponseBuilder(HttpStatus.OK)
.body(hello.apply(user))
.header("Content-Type", "application/json")
.build();
}
}
Kelas Java ini adalah Fungsi Azure, dengan fitur menarik berikut:
- Kelas memiliki
@Component
anotasi, jadi itu adalah Spring Bean. - Nama fungsi, seperti yang didefinisikan oleh anotasi
@FunctionName("hello")
, adalahhello
. - Kelas ini mengimplementasikan Azure Function nyata, sehingga Anda dapat menggunakan Api Azure Functions lengkap di sini.
Tambahkan pengujian unit
Langkah ini opsional tetapi disarankan untuk memvalidasi bahwa aplikasi berfungsi dengan benar.
Buat folder src/test/java/com/example dan tambahkan pengujian JUnit berikut:
HelloTest.java:
package com.example;
import com.example.hello.Hello;
import com.example.model.Greeting;
import com.example.model.User;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloTest {
@Test
public void test() {
Greeting result = new Hello().apply(new User("foo"));
assertThat(result.getMessage()).isEqualTo("Hello, foo!\n");
}
}
Anda sekarang dapat menguji Fungsi Azure menggunakan Maven:
mvn clean test
Menjalankan Fungsi secara lokal
Sebelum Anda menyebarkan aplikasi Anda ke Fungsi Azure, pertama-tama mari kita lakukan pengujian secara lokal.
Pertama, Anda perlu mengemas aplikasi Anda ke dalam file Jar:
mvn package
Setelah aplikasi dikemas, Anda dapat menjalankannya menggunakan plugin Mavenazure-functions
:
mvn azure-functions:run
Fungsi Azure sekarang tersedia di localhost Anda, yang menggunakan port 7071. Anda dapat menguji fungsi dengan mengiriminya permintaan POST, dengan objek User
dalam format JSON. Misalnya, menggunakan cURL:
curl -X POST http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"
Fungsi akan menjawab Anda dengan objek Greeting
, masih dalam format JSON:
{
"message": "Hello, Azure!\n"
}
Berikut adalah cuplikan layar permintaan cURL di bagian atas layar, dan Fungsi Azure lokal di bagian bawah:
Debug Fungsi secara lokal
Bagian berikut menjelaskan cara melakukan debug fungsi.
Debug menggunakan Intellij IDEA
Buka proyek di Intellij IDEA, lalu buat konfigurasi eksekusi Debug JVM Jarak Jauh untuk dilampirkan. Untuk informasi selengkapnya, lihat Tutorial: Debug jarak jauh.
Jalankan aplikasi menggunakan perintah berikut:
mvn azure-functions:run -DenableDebug
Saat aplikasi dimulai, Anda akan melihat output berikut:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Mulai penelusuran kesalahan proyek di IntelliJ IDEA. Anda akan melihat output berikut:
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Tandai titik henti yang ingin Anda debug. Intellij IDEA akan memasuki mode penelusuran kesalahan setelah mengirim permintaan.
Debug menggunakan Visual Studio Code
Buka proyek di Visual Studio Code, lalu konfigurasikan konten file launch.json berikut:
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Attach to Remote Program",
"request": "attach",
"hostName": "127.0.0.1",
"port": 5005
}
]
}
Jalankan aplikasi menggunakan perintah berikut:
mvn azure-functions:run -DenableDebug
Saat aplikasi dimulai, Anda akan melihat output berikut:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Mulai penelusuran kesalahan proyek di Visual Studio Code, lalu tandai titik henti yang ingin Anda debug. Visual Studio Code akan memasuki mode penelusuran kesalahan setelah mengirim permintaan. Untuk informasi selengkapnya, lihat Menjalankan dan melakukan penelusuran kesalahan Java.
Menyebarkan Fungsi ke Azure Functions
Sekarang, Anda akan menerbitkan Azure Function ke produksi. Ingatlah bahwa <functionAppName>
properti , <functionAppRegion>
, dan <functionResourceGroup>
yang telah Anda tentukan dalam file pom.xml Anda digunakan untuk mengonfigurasi fungsi Anda.
Catatan
Plugin Maven perlu melakukan autentikasi dengan Azure. Jika Anda telah memasang Azure CLI, gunakan az login
sebelum melanjutkan.
Untuk opsi autentikasi lainnya, lihat Autentikasi di repositori azure-maven-plugins.
Jalankan Maven untuk menyebarkan fungsi Anda secara otomatis:
mvn azure-functions:deploy
Sekarang buka portal Azure untuk menemukan Function App
yang telah dibuat.
Pilih fungsi:
- Dalam gambaran umum fungsi, perhatikan URL fungsi.
- Untuk memeriksa fungsi yang sedang berjalan, pilih Streaming log pada menu navigasi.
Sekarang, seperti yang Anda lakukan di bagian sebelumnya, gunakan cURL untuk mengakses fungsi berjalan, seperti yang ditunjukkan pada contoh berikut. Pastikan untuk mengganti your-function-name
dengan nama fungsi asli Anda.
curl https://your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"
Seperti di bagian sebelumnya, Fungsi harus menjawab Anda dengan objek Greeting
, masih dalam format JSON:
{
"message": "Hello, Azure!\n"
}
Selamat, Anda memiliki Fungsi Spring Cloud yang berjalan di Azure Functions! Untuk informasi selengkapnya dan sampel fungsi Spring Cloud, lihat sumber daya berikut:
Langkah berikutnya
Untuk mempelajari selengkapnya tentang Spring dan Azure, lanjutkan ke pusat dokumentasi Spring di Azure.