Azure'da Spring Cloud İşlevi

Bu makalede, Azure İşlevleri'da Java Spring Cloud İşlevi oluşturma, test etme, hata ayıklama ve dağıtma adımları gösterilmektedir. İşiniz bittiğinde, işleviniz Tüketim Planı'nda çalışır ve HTTP isteklerine yanıt verir.

Önkoşullar

Java kullanarak işlev geliştirmek için aşağıdaki araçları yükleyin:

Önemli

JAVA_HOME Bu hızlı başlangıcı tamamlamak için ortam değişkenini JDK'nin yükleme konumuna ayarlayın.

Temel araçlar sürümünüzün en az 4.0.5455 olduğundan emin olun.

Oluşturacağınız şey

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

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

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

Yeni bir Maven projesi oluşturma

Boş bir Maven projesi oluşturun ve Spring Cloud İşlevi ve Azure İşlevleri ile yapılandırın.

Boş bir klasörde yeni bir pom.xml dosyası oluşturun. Ardından, örnek projenin pom.xml dosyasındaki içeriği kopyalayın.

Not

Bu dosya hem Spring Boot hem de Spring Cloud İşlevi'nden Maven bağımlılıklarını kullanır. Ayrıca Spring Boot ve Azure İşlevleri Maven eklentilerini de yapılandırıyor.

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

  • <functionAppName>Azure İşlevinizin adıdır.
  • <functionAppRegion>, İşlevinizi dağıttığınız Azure bölgesinin adıdır.
  • <functionResourceGroup>kullanmakta olduğunuz Azure kaynak grubunun adıdır.

Aşağıdaki örnekte gösterildiği gibi bu özellikleri doğrudan pom.xml dosyasının ü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.36.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. Greeting Ve etki alanı modelinizi temsil eden nesneler oluşturunUser. Bu hızlı başlangıcı özelleştirmek istiyorsanız daha fazla özelliğe sahip 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ğiniz İş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");
    }
}

Not

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.
  • @Component anotasyonu bulunduğu için, bir Spring bean’idir. Varsayılan olarak, adı sınıfıyla aynıdır, ancak küçük harfle 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şturduğunuz Azure İşlevleri adıyla eşleşmelidir.

Azure İşlevini oluşturma

Tam Azure İşlevleri API'sini kullanmak için, yürütmesini önceki adımda oluşturduğunuz Spring Cloud İşlevi'ne devreden bir Azure İşlevi oluşturun.

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ı, aşağıdaki özelliklere sahip bir Azure İşlevidir:

  • Sınıf, @Component ek açıklamasına sahiptir, dolayısıyla bir Spring Bean'dir.
  • 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 testleri ekleyin

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 Maven kullanarak Azure İşlevinizi test edebilirsiniz:

mvn clean test

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

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

İlk olarak, uygulamanızı bir JAR dosyasına paketleyin:

mvn package

Uygulama paketlendiğinden, Maven eklentisini azure-functions kullanarak uygulamayı çalıştırın:

mvn azure-functions:run

Azure İşlevi artık 7071 numaralı bağlantı noktası kullanılarak localhost'unuzda kullanılabilir. JSON biçiminde bir nesneyle User post isteği göndererek işlevi test edin. Örneğin, cURL kullanın:

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

İşlev, JSON biçiminde bir Greeting nesneyle yanıt verir:

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

Yerel olarak çalışan Azure İşlevi

İş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 ve 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.

Uzak JVM Hata Ayıklama Yapılandırması Oluştur

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

projeyi Visual Studio Code açın ve ardından 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'de proje hata ayıklamayı başlatın ve hata ayıklamak istediğiniz kesme noktalarını işaretleyin. Visual Studio Code bir 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. Unutmayın ki <functionAppName>, <functionAppRegion>, ve <functionResourceGroup> özellikleri, pom.xml dosyanızda tanımladığınız gibi işlevinizi yapılandırmak için kullanılır.

Not

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 Kimlik Doğrulama bölümüne azure-maven-plugins deponuzda bakın.

İş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. Gerçek işlev adınızı your-function-name ile değiştirmeyi 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.