Azure'da Spring Cloud İşlevi

Bu makale, Java işlevi geliştirmek ve Azure İşlevleri'ne yayımlamak için Spring Cloud Function'ı kullanma adımlarını göstermektedir. Tüm adımları tamamladığınızda işleviniz Azure'da Tüketim Planı'nda çalışmaya başlar ve HTTP isteği kullanılarak tetiklenebilir.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

Java kullanarak işlev uygulamaları geliştirebilmeniz için şunlar yüklü olmalıdır:

Önemli

  1. Bu hızlı başlangıcı tamamlamak için ortam değişkenini JDK'nin yükleme konumuna ayarlamanız JAVA_HOME gerekir.
  2. Temel araçlar sürümünüzün en az 4.0.5455 olduğundan emin olun.

Oluşturacağımız şey

Azure İşlevleri üzerinde çalışan ve Spring Cloud İşlevi ile yapılandırılan klasik bir "Hello, World" işlevi oluşturacağız.

İşlev, kullanıcı adı içeren bir User JSON nesnesi alır ve bu kullanıcıya karşılama iletisini içeren bir Greeting nesneyi geri gönderir.

Proje, GitHub'daki azure-function-java-worker deposunun Azure'daki Spring Cloud İşlevi örneğinde kullanılabilir. Bu hızlı başlangıçta açıklanan son çalışmayı görmek istiyorsanız bu örneği doğrudan kullanabilirsiniz.

Yeni bir Maven projesi oluşturma

Boş bir Maven projesi oluşturacak ve spring cloud function ve Azure İşlevleri ile yapılandıracağız.

Boş bir klasörde yeni bir pom.xml dosyası oluşturun ve örnek projenin pom.xml dosyasındaki içeriği kopyalayın/yapıştırın.

Dekont

Bu dosya hem Spring Boot hem de Spring Cloud Function için Maven bağımlılıklarını kullanır ve Spring Boot ile Azure İşlevleri Maven eklentilerini yapılandırır.

Uygulamanız için birkaç özelliği özelleştirmeniz gerekir:

  • <functionAppName>, Azure İşlevinizin adıdır
  • <functionAppRegion>, İşlevinizin dağıtıldığı Azure bölgesinin adıdır
  • <functionResourceGroup> kullanmakta olduğunuz Azure kaynak grubunun adıdır

Bu özellikleri, aşağıdaki örnekte gösterildiği gibi pom.xml dosyasının doğrudan üst kısmına yakın bir şekilde değiştirin:

    <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>

Azure yapılandırma dosyalarını oluşturma

Bir src/main/resources klasörü oluşturun ve aşağıdaki Azure İşlevleri yapılandırma dosyalarını ekleyin.

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": ""
  }
}

Etki alanı nesnelerini oluşturma

Azure İşlevleri, JSON biçimindeki nesneleri alabilir ve gönderebilir. Şimdi etki alanı modelimizi User temsil eden ve Greeting nesnelerimizi oluşturacağız. Bu hızlı başlangıcı özelleştirmek ve daha ilginç hale getirmek isterseniz daha fazla özellik kullanarak daha karmaşık nesneler oluşturabilirsiniz.

src/main/java/com/example/model klasörü oluşturup aşağıdaki iki dosyayı ekleyin:

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;
    }
}

Spring Boot uygulaması oluşturma

Bu uygulama tüm iş mantığını yönetir ve tam Spring Boot ekosistemine erişime sahiptir. Bu özellik, standart bir Azure İşlevi'ne göre iki temel avantaj sağlar:

  • Azure İşlevleri API'lerine dayanmaz, bu nedenle diğer sistemlere kolayca taşıyabilirsiniz. Örneğin, normal bir Spring Boot uygulamasında yeniden kullanabilirsiniz.
  • Yeni özellikler eklemek için Spring Boot'un tüm @Enable ek açıklamalarını kullanabilirsiniz.

src/main/java/com/example klasöründe normal bir Spring Boot uygulaması olan aşağıdaki dosyayı oluşturun:

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);
    }
}

Şimdi src/main/java/com/example/hello klasöründe aşağıdaki dosyayı oluşturun. Bu kod, çalıştırmak istediğimiz İşlevi temsil eden bir Spring Boot bileşeni içerir:

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");
    }
}

Dekont

Hello işlevi oldukça özeldir:

  • Bu bir java.util.function.Function. İş mantığını içerir ve bir nesneyi diğerine dönüştürmek için standart bir Java API'sini kullanır.
  • Ek açıklamaya @Component sahip olduğundan, bu bir Spring Bean'dir ve varsayılan olarak adı sınıfla aynıdır, ancak küçük harf karakterle başlar: hello. Uygulamanızda başka işlevler oluşturmak istiyorsanız bu adlandırma kuralının uygulanması önemlidir. Ad, sonraki bölümde oluşturacağımız Azure İşlevleri adla eşleşmelidir.

Azure İşlevini oluşturma

Tam Azure İşlevleri API'sinden yararlanmak için şimdi yürütmesini önceki adımda oluşturulan Spring Cloud İşlevi'ne devreden bir Azure İşlevi kodlayacağız.

src/main/java/com/example/hello klasöründe aşağıdaki Azure İşlevi sınıf dosyasını oluşturun:

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();
    }
}

Bu Java sınıfı bir Azure İşlevidir ve şu ilginç özelliklere sahiptir:

  • sınıfı ek açıklamaya @Component sahiptir, bu nedenle spring bean'dır.
  • Ek açıklama tarafından tanımlanan işlevin @FunctionName("hello") adıdır hello.
  • sınıfı gerçek bir Azure İşlevi uygular, böylece burada tam Azure İşlevleri API'sini kullanabilirsiniz.

Birim testi ekleme

Bu adım isteğe bağlıdır ancak uygulamanın düzgün çalıştığını doğrulamak için önerilir.

Bir src/test/java/com/example klasörü oluşturun ve aşağıdaki JUnit testlerini ekleyin:

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");
    }
}

Artık Azure İşlevinizi Maven kullanarak test edebilirsiniz:

mvn clean test

İşlevi yerel olarak çalıştırma

Uygulamanızı Azure İşlevine dağıtmadan önce yerel olarak test edelim.

Öncelikle uygulamanızı Jar dosyası olarak paketlemeniz gerekir:

mvn package

Uygulamayı paketlediğinize göre azure-functions Maven eklentisini kullanarak çalıştırabilirsiniz:

mvn azure-functions:run

Azure İşlevi artık localhost konumunda 7071 numaralı bağlantı noktası üzerinden kullanılabilir durumda olmalıdır. JSON biçiminde bir User nesnesi içeren POST isteği göndererek işlevi test edebilirsiniz. Örneğin, cURL kullanarak:

curl -X POST http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"

İşlev JSON biçiminde bir Greeting nesnesiyle yanıt vermelidir:

{
  "message": "Hello, Azure!\n"
}

Ekranın üst kısmındaki cURL isteğinin ekran görüntüsü ve alt kısımdaki yerel Azure İşlevi aşağıdadır:

Azure Function running locally

İşlevde yerel olarak hata ayıklama

Aşağıdaki bölümlerde işlevin hatalarını ayıklama açıklanmaktadır.

Intellij IDEA kullanarak hata ayıklama

Projeyi Intellij IDEA'da açın, ardından eklemek için bir Uzak JVM Hata Ayıklama çalıştırma yapılandırması oluşturun. Daha fazla bilgi için bkz . Öğretici: Uzaktan hata ayıklama.

Create a Remote JVM Debug run configuration

Uygulamayı aşağıdaki komutla çalıştırın:

mvn azure-functions:run -DenableDebug

Uygulama başlatıldığında aşağıdaki çıkışı görürsünüz:

Worker process started and initialized.
Listening for transport dt_socket at address: 5005

IntelliJ IDEA'da proje hata ayıklamayı başlatın. Aşağıdaki çıkışı görürsünüz:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'

Hata ayıklamak istediğiniz kesme noktalarını işaretleyin. Intellij IDEA, istek gönderdikten sonra hata ayıklama moduna girer.

Visual Studio Code kullanarak hata ayıklama

Visual Studio Code'da projeyi açın ve aşağıdaki launch.json dosya içeriğini yapılandırın:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Attach to Remote Program",
            "request": "attach",
            "hostName": "127.0.0.1",
            "port": 5005
        }
    ]
}

Uygulamayı aşağıdaki komutla çalıştırın:

mvn azure-functions:run -DenableDebug

Uygulama başlatıldığında aşağıdaki çıkışı görürsünüz:

Worker process started and initialized.
Listening for transport dt_socket at address: 5005

Visual Studio Code'da proje hata ayıklamayı başlatın, ardından hata ayıklamak istediğiniz kesme noktalarını işaretleyin. Visual Studio Code, istek gönderdikten sonra hata ayıklama moduna girer. Daha fazla bilgi için bkz . Java'yı çalıştırma ve hata ayıklama.

İşlevi Azure İşlevleri'ne dağıtma

Şimdi Azure İşlevi'ni üretim ortamında yayımlayacaksınız. <functionAppName>pom.xml dosyanızda tanımladığınız , <functionAppRegion>ve <functionResourceGroup> özelliklerinin işlevinizi yapılandırmak için kullanıldığını unutmayın.

Dekont

Maven eklentisinin Azure'da kimlik doğrulaması yapması gerekir. Azure CLI yüklüyse devam etmeden önce kullanın az login . Daha fazla kimlik doğrulama seçeneği için bkz. azure-maven-plugins deposunda kimlik doğrulaması.

İşlevinizi otomatik olarak dağıtmak için Maven'ı çalıştırın:

mvn azure-functions:deploy

Şimdi Azure portalına giderek Function App öğesinin oluşturulup oluşturulmadığına bakın.

İşlevi seçin:

  • İşleve genel bakış sayfasında işlevin URL'sini not edin.
  • Çalışan işlevinizi denetlemek için gezinti menüsünde Günlük akışı'nı seçin.

Şimdi, önceki bölümde yaptığınız gibi, aşağıdaki örnekte gösterildiği gibi çalışan işleve erişmek için cURL kullanın. değerini gerçek işlev adınızla değiştirerek değiştirmeyi your-function-name unutmayın.

curl https://your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"

Bir önceki bölümde olduğu gibi işlev JSON biçiminde bir Greeting nesnesiyle yanıt vermelidir:

{
  "message": "Hello, Azure!\n"
}

Tebrikler, Azure İşlevleri'nde çalışan bir Spring Cloud Function örneğiniz var! Spring Cloud işlevleri hakkında daha fazla bilgi ve örnek için aşağıdaki kaynaklara bakın:

Sonraki adımlar

Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.