Menyebarkan aplikasi Java tanpa server dengan Quarkus di Azure Functions

Dalam artikel ini, Anda akan mengembangkan, membangun, dan menyebarkan aplikasi Java tanpa server ke Azure Functions dengan menggunakan Quarkus. Artikel ini menggunakan Quarkus Funqy dan dukungan bawaannya untuk pemicu HTTP Azure Functions untuk Java. Menggunakan Quarkus dengan Azure Functions memberi Anda kekuatan model pemrograman Quarkus dengan skala dan fleksibilitas Azure Functions. Setelah selesai, Anda akan menjalankan aplikasi Quarkus tanpa server di Azure Functions dan terus memantau aplikasi Anda di Azure.

Prasyarat

Membuat proyek aplikasi

Gunakan perintah berikut untuk mengkloning sampel proyek Java untuk artikel ini. Sampelnya ada di GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus

Jika Anda melihat pesan tentang berada dalam status HEAD yang terlepas, pesan ini aman untuk diabaikan. Karena artikel ini tidak memerlukan penerapan apa pun, status HEAD yang dilepas sesuai.

Jelajahi fungsi sampel. Buka file functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java.

Jalankan perintah berikut. Anotasi @Funq membuat metode Anda (dalam hal ini, funqyHello) fungsi tanpa server.

@Funq
public String funqyHello() {
    return "hello funqy";
}

Azure Functions Java memiliki sekumpulan anotasi khusus Azure sendiri, tetapi anotasi ini tidak diperlukan saat Anda menggunakan Quarkus di Azure Functions dalam kapasitas sederhana seperti yang kami lakukan di sini. Untuk informasi selengkapnya tentang anotasi Azure Functions Java, lihat panduan pengembang Azure Functions Java.

Kecuali Anda menentukan sebaliknya, nama fungsi sama dengan nama metode. Anda juga dapat menggunakan perintah berikut untuk menentukan nama fungsi dengan parameter ke anotasi:

@Funq("alternateName")
public String funqyHello() {
    return "hello funqy";
}

Nama itu penting. Ini menjadi bagian dari REST URI untuk memanggil fungsi, seperti yang ditunjukkan nanti dalam artikel.

Uji fungsi secara lokal

Gunakan mvn untuk menjalankan mode dev Quarkus di terminal lokal Anda. Menjalankan Quarkus dengan cara ini memungkinkan pemuatan ulang langsung dengan kompilasi latar belakang. Saat Anda memodifikasi file Java dan/atau file sumber daya anda dan me-refresh browser, perubahan ini akan secara otomatis berlaku.

Refresh browser memicu pemindaian ruang kerja. Jika pemindaian mendeteksi perubahan apa pun, file Java dikompilasi ulang dan aplikasi disebarkan ulang. Permintaan aplikasi yang disebarkan ulang. Jika ada masalah dengan kompilasi atau penyebaran, halaman kesalahan akan memberi tahu Anda.

Dalam prosedur berikut, ganti yourResourceGroupName dengan nama grup sumber daya. Nama aplikasi fungsi harus unik secara global di semua Azure. Nama grup sumber daya harus unik secara global dalam langganan. Artikel ini mencapai keunikan yang diperlukan dengan menambahkan nama grup sumber daya ke nama fungsi. Pertimbangkan untuk menambahkan pengidentifikasi unik ke nama apa pun yang Anda buat yang harus unik. Teknik yang berguna adalah menggunakan inisial Anda diikuti dengan tanggal hari ini dalam mmdd format.

Grup sumber daya tidak diperlukan untuk bagian instruksi ini, tetapi diperlukan nanti. Untuk kesederhanaan, proyek Maven mengharuskan Anda untuk menentukan properti .

  1. Panggil mode dev Quarkus:

    cd functions-azure
    mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
    

    Output akan terlihat seperti ini:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    INFO  [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080
    
    INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx]
    
    --
    Tests paused
    Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
    
  2. Akses fungsi dengan menggunakan CURL perintah di terminal lokal Anda:

    curl localhost:8080/api/funqyHello
    

    Output akan terlihat seperti ini:

    "hello funqy"
    

Menambahkan injeksi dependensi ke fungsi

Teknologi standar terbuka Jakarta Konteks EE dan Injeksi Dependensi (CDI) menyediakan injeksi dependensi di Quarkus. Untuk gambaran umum injeksi tingkat tinggi, dan CDI secara khusus, lihat tutorial EE Jakarta.

  1. Tambahkan fungsi baru yang menggunakan injeksi dependensi.

    Buat file GreetingService.java di direktori functions-quarkus/src/main/java/io/quarkus . Gunakan kode berikut sebagai kode sumber file:

    package io.quarkus;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class GreetingService {
    
        public String greeting(String name) {
            return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name;
        }
    
    }
    

    Simpan file.

    GreetingService adalah biji suntik yang mengimplementasikan greeting() metode . Metode mengembalikan Welcome... pesan string dengan name parameter.

  2. Buka file functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java yang ada. Ganti kelas dengan kode berikut untuk menambahkan bidang baru gService dan greeting metode :

    package io.quarkus;
    
    import javax.inject.Inject;
    import io.quarkus.funqy.Funq;
    
    public class GreetingFunction {
    
        @Inject
        GreetingService gService;
    
        @Funq
        public String greeting(String name) {
            return gService.greeting(name);
        }
    
        @Funq
        public String funqyHello() {
            return "hello funqy";
        }
    
    }
    

    Simpan file.

  3. Akses fungsi baru greeting dengan menggunakan curl perintah di terminal lokal Anda:

    curl -d '"Dan"' -X POST localhost:8080/api/greeting
    

    Output akan terlihat seperti ini:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
    

    Penting

    Live Coding (juga disebut mode dev) memungkinkan Anda menjalankan aplikasi dan membuat perubahan dengan cepat. Quarkus akan secara otomatis mengkombinasi ulang dan memuat ulang aplikasi saat perubahan dilakukan. Ini adalah gaya pengembangan yang kuat dan efisien yang akan Anda gunakan di seluruh artikel ini.

    Sebelum Anda melanjutkan ke langkah berikutnya, hentikan mode dev Quarkus dengan memilih Ctrl+C.

Menyebarkan aplikasi ke Azure

  1. Jika Anda belum melakukannya, masuk ke langganan Azure Anda dengan menggunakan perintah az login berikut dan ikuti petunjuk di layar:

    az login
    

    Catatan

    Jika beberapa penyewa Azure dikaitkan dengan kredensial Azure, Anda harus menentukan penyewa mana yang ingin Anda masuki. Anda dapat melakukan ini dengan menggunakan --tenant opsi . Sebagai contoh: az login --tenant contoso.onmicrosoft.com.

    Lanjutkan proses di browser web. Jika tidak ada browser web yang tersedia atau jika browser web gagal dibuka, gunakan alur kode perangkat dengan az login --use-device-code.

    Setelah Anda berhasil masuk, output di terminal lokal Anda akan terlihat mirip dengan yang berikut ini:

    xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft'
    [
        {
            "cloudName": "AzureCloud",
            "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "isDefault": true,
            "managedByTenants": [],
            "name": "Contoso account services",
            "state": "Enabled",
            "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx",
            "user": {
            "name": "user@contoso.com",
            "type": "user"
            }
        }
    ]
    
  2. Membangun dan menyebarkan fungsi ke Azure.

    File pom.xml yang Anda buat di langkah sebelumnya menggunakan azure-functions-maven-plugin. Menjalankan mvn install menghasilkan file konfigurasi dan direktori penahapan yang azure-functions-maven-plugin diperlukan. Untuk yourResourceGroupName, gunakan nilai yang Anda gunakan sebelumnya.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Selama penyebaran, masuk ke Azure. azure-functions-maven-plugin Plug-in dikonfigurasi untuk meminta masuk Azure setiap kali proyek disebarkan. Selama build, output yang mirip dengan yang berikut ini muncul:

    [INFO] Auth type: DEVICE_CODE
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
    

    Lakukan seperti yang dikatakan output dan autentikasi ke Azure dengan menggunakan browser dan kode perangkat yang disediakan. Banyak opsi autentikasi dan konfigurasi lainnya tersedia. Dokumentasi referensi lengkap untuk azure-functions-maven-plugin tersedia di Azure Functions: Detail Konfigurasi.

  4. Setelah autentikasi, build harus dilanjutkan dan selesai. Pastikan output menyertakan BUILD SUCCESS di dekat akhir.

    Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
    

    Anda juga dapat menemukan URL untuk memicu fungsi Anda di Azure di log output:

    [INFO] HTTP Trigger Urls:
    [INFO] 	 quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
    

    Perlu waktu beberapa saat agar penyebaran selesai. Sementara itu, mari kita jelajahi Azure Functions di portal Azure.

Mengakses dan memantau fungsi tanpa server di Azure

Masuk ke portal dan pastikan Anda telah memilih penyewa dan langganan yang sama dengan yang Anda gunakan di Azure CLI.

  1. Ketik aplikasi fungsi pada bilah pencarian di bagian atas portal Azure dan pilih tombol Enter. Aplikasi fungsi Anda harus disebarkan dan muncul dengan nama <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. Pilih aplikasi fungsi untuk menampilkan informasi terperinci, seperti Lokasi, Langganan, URL, Metrik, dan Paket App Service. Kemudian, pilih nilai URL .

    Screenshot that shows a URL and other function app details.

  3. Konfirmasikan bahwa halaman selamat datang mengatakan aplikasi fungsi Anda "aktif dan berjalan."

    Screenshot that shows the welcome page for a function app.

  4. Panggil greeting fungsi dengan menggunakan perintah berikut curl di terminal lokal Anda.

    Penting

    Ganti YOUR_HTTP_TRIGGER_URL dengan URL fungsi Anda sendiri yang Anda temukan di portal Azure atau output.

    curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
    

    Output akan terlihat mirip dengan contoh berikut:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
    

    Anda juga dapat mengakses fungsi lain (funqyHello) dengan menggunakan perintah berikut curl :

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    Output harus sama dengan apa yang Anda amati sebelumnya:

    "hello funqy"
    

    Jika Anda ingin menjalankan kemampuan metrik dasar dalam portal Azure, coba panggil fungsi dalam perulangan shellfor:

    for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
    

    Setelah beberapa saat, Anda akan melihat beberapa data metrik di portal.

    Screenshot that shows function metrics in the portal.

Sekarang setelah Anda membuka fungsi Azure di portal, berikut adalah lebih banyak fitur yang dapat Anda akses dari portal:

Membersihkan sumber daya

Jika Anda tidak memerlukan sumber daya ini, Anda dapat menghapusnya dengan menjalankan perintah berikut di Azure Cloud Shell atau di terminal lokal Anda:

az group delete --name <yourResourceGroupName> --yes

Langkah berikutnya

Di artikel ini, Anda telah mempelajari cara:

  • Jalankan mode dev Quarkus.
  • Sebarkan aplikasi Funqy ke fungsi Azure dengan menggunakan azure-functions-maven-plugin.
  • Periksa performa fungsi di portal.

Untuk mempelajari selengkapnya tentang Azure Functions dan Quarkus, lihat artikel dan referensi berikut ini: