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.

Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.

Prasyarat

Untuk mengembangkan fungsi menggunakan Java, Anda harus menginstal yang berikut:

Penting

  1. Anda harus mengatur JAVA_HOME variabel lingkungan ke lokasi penginstalan JDK untuk menyelesaikan mulai cepat ini.
  2. 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"), adalah hello.
  • 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:

Azure Function running locally

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.

Create a Remote JVM Debug run configuration

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.