Azure'da Spring Cloud Function ile çalışmaya başlama

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

Bu hızlı başlangıç JAVA_HOME JDK'nin yükleme konumu olarak ortam değişkenlerini ayarlamanız gerekir.

Neleri derlemek için

Azure İşlevleri İşlevi ile yapılandırılmış klasik bir "Hello, World" işlevi Spring Cloud Azure İşlevleri yapacağız.

Kullanıcı adı içeren basit bir JSON nesnesi alır ve bu kullanıcıya karşılama iletisi UserGreeting içeren bir nesnesi gönderir.

Hazırlayacak proje, GitHub'daki hello-spring-function-azure deposunda GitHub. Bu hızlı başlangıçta açıklanan son işi görmek için bu örnek depoyu doğrudan kullanabilirsiniz.

Yeni bir Maven projesi oluşturma

Boş bir Maven projesi oluşturacak ve bunu Spring Cloud Function ve Azure İşlevleri.

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

Not

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ıza birkaç özelliği özelleştirmeniz gerekir:

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

Aşağıdaki örnekte gösterildiği gibi bu özellikleri pom.xml doğrudan dosyanın üst kısmında değiştirin:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.target>11</maven.compiler.target>

  <azure.functions.java.library.version>1.4.2</azure.functions.java.library.version>
  <azure.functions.maven.plugin.version>1.13.0</azure.functions.maven.plugin.version>

  <!-- customize those two properties. The functionAppName should be unique across Azure -->
  <functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
  <functionAppName>my-spring-function</functionAppName>

  <functionAppRegion>westeurope</functionAppRegion>
  <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
  <start-class>com.example.DemoApplication</start-class>
</properties>

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

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

host.json:

{
  "version": "2.0",
  "functionTimeout": "00:10:00"
}

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "MAIN_CLASS":"com.example.DemoApplication",
    "AzureWebJobsDashboard": ""
  }
}

Etki alanı nesnelerini oluşturma

Azure İşlevleri, JSON biçimindeki nesneleri alabilir ve gönderebilir. Şimdi etki alanı modelimizi temsil eden UserGreeting ve nesnelerimizi oluşturacak. 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

Uygulama, iş mantığını yönetecek ve Spring Boot ekosisteminin tamamına erişebilecek. Bu özellik, standart Azure İşlevi'ne göre iki temel avantaj sunar:

  • Api'leri Azure İşlevleri, bu nedenle kolayca diğer sistemlere taşınabilir. Örneğin, normal bir uygulama içinde Spring Boot kullanabilirsiniz.
  • Yeni özellikler eklemek için @Enable Spring Boot ek açıklamaları 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 çalıştırmak istediğiniz İşlevi temsil eden bir Spring Boot bileşeni içeren aşağıdaki dosyayı oluşturun:

Hello.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

import java.util.function.Function;

@Component
public class Hello implements Function<Mono<User>, Mono<Greeting>> {

    public Mono<Greeting> apply(Mono<User> mono) {
        return mono.map(user -> new Greeting("Hello, " + user.getName() + "!\n"));
    }
}

Not

Hello işlevi oldukça özeldir:

  • Bu bir ' java.util.function.Function dır. İş mantığını içerir ve bir nesneyi diğerine dönüştürmek için standart bir Java API'si kullanır.
  • Ek açıklamasına sahip olduğundan Spring Bean'dır ve adı varsayılan olarak sınıfıyla aynıdır, ancak küçük @Component harfle başlayarak: hello . Bu adlandırma kuralının ardından, uygulamanıza başka işlevler oluşturmak istemeniz önemlidir. Ad, sonraki Azure İşlevleri oluşturacak olan adla eşleşmesi gerekir.

Azure İşlevini oluşturma

Api'nin Azure İşlevleri yararlanmak için, şimdi yürütmesini önceki adımda oluşturduğumız Spring Cloud İşlevi'ne devredecek bir Azure İşlevi kodlayazıyoruz.

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

HelloHandler.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
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 org.springframework.cloud.function.adapter.azure.FunctionInvoker;

import java.util.Optional;

public class HelloHandler extends FunctionInvoker<User, Greeting> {

    @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(handleRequest(user, context))
            .header("Content-Type", "application/json")
            .build();
    }
}

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

  • İşlevler ile FunctionInvoker İşlevler arasında bağlantı oluşturan Azure İşlevleri genişlet Spring Cloud. FunctionInvoker , handleRequest() yönteminde kullanılan yöntemini body() sağlar.
  • Ek açıklamayla tanımlandığı gibi işlevin @FunctionName("hello") adı hello olur.
  • Gerçek bir Azure İşlevi olduğu için api'nin tamamını Azure İşlevleri 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.

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

HelloTest.java:

package com.example;

import com.example.model.Greeting;
import com.example.model.User;
import com.microsoft.azure.functions.ExecutionContext;
import org.junit.jupiter.api.Test;
import org.springframework.cloud.function.adapter.azure.FunctionInvoker;
import reactor.core.publisher.Mono;

import java.util.logging.Logger;

import static org.assertj.core.api.Assertions.assertThat;

public class HelloTest {

    @Test
    public void test() {
        Mono<Greeting> result = new Hello().apply(Mono.just(new User("foo")));
        assertThat(result.block().getMessage()).isEqualTo("Hello, foo!\n");
    }

    @Test
    public void start() {
        FunctionInvoker<User, Greeting> handler = new FunctionInvoker<>(
            Hello.class);
        Greeting result = handler.handleRequest(new User("foo"), new ExecutionContext() {
            @Override
            public Logger getLogger() {
                return Logger.getLogger(HelloTest.class.getName());
            }

            @Override
            public String getInvocationId() {
                return "id1";
            }

            @Override
            public String getFunctionName() {
                return "hello";
            }
        });
        handler.close();
        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ında cURL isteğinin ve alttaki yerel Azure İşlevi'nin ekran görüntüsü:

Yerel olarak çalışan Azure İşlevi

İşlevde yerel olarak hata ayıklama

Aşağıdaki bölümlerde işlevin hata ayıklaması açıklanmaktadır.

Intellij IDEA kullanarak hata ayıklama

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

Uzak JVM Hata Ayıklama çalıştırma yapılandırması oluşturma

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üyorsunuz:

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

Intellij IDEA'da proje hata ayıklamayı başlatma. 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ına işaret tıklayın. Intellij IDEA, istek gönderdikten sonra hata ayıklama moduna geçer.

Visual Studio Code kullanarak hata ayıklama

Projeyi Visual Studio Code açın ve ardından aşağıdaki launch.json dosyası içeriğini yapılandırabilirsiniz:

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

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

Proje hata ayıklamayı Visual Studio Code sonra hata ayıklamak istediğiniz kesme noktalarına işaret ediyorsanız. İstek gönderdikten sonra Visual Studio Code hata ayıklama moduna girer. Daha fazla bilgi için bkz. Java'da çalıştırma ve hata ayıklama.

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

Şimdi Azure İşlevi'nin üretime yayımlayabilirsiniz. İşlevi <functionAppName> yapılandırmak için,pom.xmldosyanız içinde tanımlandığı , ve <functionAppRegion> özelliklerinin kullan olacağını <functionResourceGroup> unutmayın. <functionAppName>

Not

Maven eklentisinin Azure ile kimlik doğrulaması yapmaları gerekir. Azure CLI yüklüyse devam etmeden önce az login kullanın. 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 öğesinin oluşturulup oluşturulmadığına bakın.

İşlevi seçin:

  • İşleve genel bakış sayfasında işlevin URL'sini not edin.
  • Platform özellikleri sekmesini seçip Günlük akışı hizmetini bulun ve ardından çalışan işlevinizi denetlemek için bu hizmeti seçin.

Şimdi, aşağıdaki örnekte gösterildiği gibi, önceki bölümde olduğu gibi cURL kullanarak çalışan işleve erişin. yerine gerçek your-function-name işlevinizin adını yazı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!

Sonraki adımlar

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